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