Package coprs :: Package rest_api :: Module schemas
[hide private]
[frames] | no frames]

Source Code for Module coprs.rest_api.schemas

  1  # coding: utf-8 
  2   
  3  from collections.abc import Iterable 
  4  from marshmallow import Schema as _Schema, fields, ValidationError, validate 
  5  from six import string_types 
  6   
  7   
  8  loads_kwargs = {} 
  9  try: 
 10      from marshmallow.utils import EXCLUDE 
 11      loads_kwargs = {"unknown": EXCLUDE} 
 12  except ImportError: 
 13      pass 
 14   
 15   
16 -class Schema(_Schema):
17 # In marshmallow v3+ there's no data/errors attributes as it was 18 # in v2. So we need to have compat wrapper. 19
20 - def wrap_function(self, name, *args, **kwargs):
21 super_object = super(Schema, self) 22 super_result = getattr(super_object, name)(*args, **kwargs) 23 if hasattr(super_result, 'data') and hasattr(super_result, 'errors'): 24 # old marshmallow 25 data = super_result.data 26 if super_result.errors: 27 exception = ValidationError(super_result.errors) 28 exception.valid_data = data 29 raise exception 30 return data 31 else: 32 return super_result
33
34 - def dump(self, *args, **kwargs):
35 return self.wrap_function('dump', *args, **kwargs)
36
37 - def loads(self, *args, **kwargs):
38 kwargs.update(loads_kwargs) 39 return self.wrap_function('loads', *args, **kwargs)
40
41 -def validate_any(fn_list):
42 """ 43 :param fn_list: list of callable functions, each takes one param 44 :return: None if at least one validation function exists without exceptions 45 :raises ValidationError: otherwise 46 """ 47 def func(value): 48 errors = [] 49 for fn in fn_list: 50 try: 51 fn(value) 52 except ValidationError as err: 53 errors.append(str(err)) 54 else: 55 return 56 else: 57 errors.insert(0, u"At least one validator should accept given value:") 58 raise ValidationError(errors)
59 60 return func 61 62
63 -class SpaceSeparatedList(fields.Field):
64 - def _serialize(self, value, attr, obj, **kwargs):
65 if value is None: 66 return [] 67 return value.split()
68
69 - def _deserialize(self, value, attr=None, data=None, **kwargs):
70 if value is None: 71 return "" 72 elif not isinstance(value, Iterable) or isinstance(value, string_types): 73 raise ValidationError("Value `{}` is not a list of strings" 74 .format(value)) 75 else: 76 return " ".join(value)
77 78
79 -class BuiltPackages(fields.Field):
80 """ stored in db as a string: 81 "python3-marshmallow 2.0.0b5\npython-marshmallow 2.0.0b5" 82 we would represent them as 83 { name: "pkg", version: "pkg version" } 84 we implement only the serialization, since field is read-only 85 """
86 - def _serialize(self, value, attr, obj, **kwargs):
87 if value is None: 88 return [] 89 result = [] 90 try: 91 for chunk in value.split("\n"): 92 pkg, version = chunk.split() 93 result.append({ 94 "name": pkg, 95 "version": version 96 }) 97 except: 98 pass 99 100 return result
101 102
103 -class AllowedMethodSchema(Schema):
104 method = fields.Str() 105 doc = fields.Str() 106 require_auth = fields.Bool() 107 params = fields.List(fields.Str())
108 109
110 -class MockChrootSchema(Schema):
111 - class Meta:
112 fields = ("name", "os_release", "os_version", "arch", "is_active") 113 ordered = True
114 115
116 -class ProjectSchema(Schema):
117 id = fields.Int(dump_only=True) 118 name = fields.Str(dump_only=True) 119 120 owner = fields.Str(attribute="owner_name", dump_only=True) 121 is_a_group_project = fields.Bool(dump_only=True) 122 group = fields.Str(attribute="group_name", dump_only=True) 123 124 description = fields.Str(allow_none=True) 125 instructions = fields.Str(allow_none=True) 126 homepage = fields.Url(allow_none=True) 127 contact = fields.Str(validate=validate_any([ 128 validate.URL(), 129 validate.Email(), 130 validate.OneOf(["", None]), 131 ]), allow_none=True) 132 133 disable_createrepo = fields.Bool(allow_none=True) 134 build_enable_net = fields.Bool(allow_none=True) 135 last_modified = fields.DateTime(dump_only=True) 136 137 repos = SpaceSeparatedList(allow_none=True)
138 139
140 -class ProjectCreateSchema(ProjectSchema):
141 name = fields.Str( 142 required=True, 143 validate=[ 144 validate.Regexp( 145 r"^[a-zA-Z][\w.-]*$", 146 error="Name must contain only letters," 147 "digits, underscores, dashes and dots." 148 "And starts with letter"), 149 ]) 150 group = fields.Str(load_only=True, allow_none=True) 151 chroots = SpaceSeparatedList(load_only=True, default=list)
152 153 154 # todo: rename to ProjectChrootSchema
155 -class CoprChrootSchema(Schema):
156 157 buildroot_pkgs = SpaceSeparatedList() 158 name = fields.Str(dump_only=True) 159 160 comps = fields.Str(allow_none=True) 161 comps_name = fields.Str(allow_none=True) 162 comps_len = fields.Int(dump_only=True)
163 164
165 -class CoprChrootCreateSchema(CoprChrootSchema):
166 name = fields.Str(required=True)
167 168
169 -class BuildTaskSchema(Schema):
170 # used only for presentation 171 state = fields.Str() 172 started_on = fields.Int(dump_only=True) 173 ended_on = fields.Int(dump_only=True) 174 git_hash = fields.Str(dump_only=True) 175 chroot_name = fields.Str(dump_only=True, attribute="name") 176 build_id = fields.Int(dump_only=True) 177 178 result_dir_url = fields.Str(dump_only=True)
179 180
181 -class BuildSchema(Schema):
182 183 id = fields.Int(dump_only=True) 184 state = fields.Str() 185 186 submitter = fields.Str(dump_only=True, attribute="user_name") 187 188 built_packages = BuiltPackages(dump_only=True) 189 package_version = fields.Str(dump_only=True, attribute="pkg_version") 190 package_name = fields.Str(dump_only=True) 191 192 repos = SpaceSeparatedList(dump_only=True) 193 194 submitted_on = fields.Int(dump_only=True) 195 196 # timeout = fields.Int(dump_only=True) # currently has no use 197 enable_net = fields.Bool(dump_only=True) 198 199 source_type = fields.Str(dump_only=True, attribute="source_type_text") 200 source_metadata = fields.Raw(dump_only=True)
201 202
203 -class BuildCreateSchema(BuildSchema):
204 project_id = fields.Int(required=True) 205 chroots = fields.List(fields.Str()) 206 enable_net = fields.Bool() 207 208 state = fields.Str(dump_only=True)
209 210
211 -class BuildCreateFromUrlSchema(BuildCreateSchema):
212 srpm_url = fields.Url(required=True, validate=lambda u: u.startswith("http"))
213