schemad 1.2.5 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/schemad/entity.rb +43 -33
- data/lib/schemad/normalizer.rb +32 -23
- data/lib/schemad/version.rb +1 -1
- data/spec/entity_spec.rb +3 -1
- data/spec/fixtures/demo_class.rb +4 -2
- data/spec/normalizer_spec.rb +8 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d48d9b403dc5e8cfcfbb150bde2e0144db96bca7
|
4
|
+
data.tar.gz: a7017532f492064910b0132665df4b5c3320008c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 280241afecc47aeedcc4bcfbd1fd2db1fa9d269534e77fa3d23ba098320d39c88eeb2072d0d1396f0901ef11327d090dda1934bcfed9841afaddcc96f5239960
|
7
|
+
data.tar.gz: 4976125bebf023752e7d7f69fdfc92563f9901ff74ce3fcb63fcc1c30ed962fd7da114a5440d9b6c952b0d9599f8983e948fdd9c08940a26c67f5f2173681657
|
data/lib/schemad/entity.rb
CHANGED
@@ -2,37 +2,59 @@ require 'schemad/extensions'
|
|
2
2
|
require 'schemad/type_handler'
|
3
3
|
|
4
4
|
module Schemad
|
5
|
-
|
5
|
+
module Entity
|
6
|
+
extend ActiveSupport::Concern
|
6
7
|
include Schemad::Extensions
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
subclass.instance_variable_set(:@attributes, default_attrs)
|
9
|
+
included do
|
10
|
+
instance_variable_set(:@attributes, [])
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
module ClassMethods
|
14
|
+
def inherited(subclass)
|
15
|
+
puts "INHERITED BY #{subclass}"
|
16
|
+
default_attrs = inherited_var(:@attributes, [])
|
17
|
+
subclass.instance_variable_set(:@attributes, default_attrs)
|
18
|
+
end
|
15
19
|
|
16
|
-
|
20
|
+
def attribute(name, args={}, &block)
|
21
|
+
attr_accessor name
|
17
22
|
|
18
|
-
|
19
|
-
|
23
|
+
define_parser_for(name, args, &block)
|
24
|
+
@attributes << name
|
25
|
+
end
|
26
|
+
|
27
|
+
# expect data hash to have symbol keys at this point
|
28
|
+
# normalizer should standardize this
|
29
|
+
def from_data(data)
|
30
|
+
obj = new
|
20
31
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
32
|
+
@attributes.each do |key|
|
33
|
+
value = obj.send "parse_#{key}", data
|
34
|
+
obj.send "#{key}=", value
|
35
|
+
end
|
25
36
|
|
26
|
-
|
27
|
-
value = obj.send "parse_#{key}", data
|
28
|
-
obj.send "#{key}=", value
|
37
|
+
obj
|
29
38
|
end
|
30
39
|
|
31
|
-
|
32
|
-
|
40
|
+
def attribute_names
|
41
|
+
@attributes
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def define_parser_for(name, args, &block)
|
47
|
+
define_method "parse_#{name}" do |data|
|
48
|
+
value = data[name]
|
49
|
+
value ||= get_default(args[:default])
|
33
50
|
|
34
|
-
|
35
|
-
|
51
|
+
self.send "#{name}=", coerce_to_type(value, args[:type])
|
52
|
+
end
|
53
|
+
|
54
|
+
define_method "#{name}?" do
|
55
|
+
!!send(name)
|
56
|
+
end if args[:type] == :boolean
|
57
|
+
end
|
36
58
|
end
|
37
59
|
|
38
60
|
def attribute_names
|
@@ -47,23 +69,11 @@ module Schemad
|
|
47
69
|
|
48
70
|
hash
|
49
71
|
end
|
72
|
+
|
50
73
|
alias_method :attributes, :to_hash
|
51
74
|
|
52
75
|
private
|
53
76
|
|
54
|
-
def self.define_parser_for(name, args, &block)
|
55
|
-
define_method "parse_#{name}" do |data|
|
56
|
-
value = data[name]
|
57
|
-
value ||= get_default(args[:default])
|
58
|
-
|
59
|
-
self.send "#{name}=", coerce_to_type(value, args[:type])
|
60
|
-
end
|
61
|
-
|
62
|
-
define_method "#{name}?" do
|
63
|
-
!!send(name)
|
64
|
-
end if args[:type] == :boolean
|
65
|
-
end
|
66
|
-
|
67
77
|
def get_default(default_provider)
|
68
78
|
return default_provider unless default_provider.is_a? Proc
|
69
79
|
default_provider.call
|
data/lib/schemad/normalizer.rb
CHANGED
@@ -1,38 +1,51 @@
|
|
1
1
|
require 'schemad/extensions'
|
2
2
|
|
3
3
|
module Schemad
|
4
|
-
|
4
|
+
module Normalizer
|
5
|
+
extend ActiveSupport::Concern
|
5
6
|
include Schemad::Extensions
|
6
7
|
|
7
8
|
DELIMITER = "/"
|
8
9
|
|
9
10
|
InvalidPath = Class.new(Exception)
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
default_allowed = inherited_var(:@allowed_attributes, [])
|
16
|
-
subclass.instance_variable_set(:@allowed_attributes, default_allowed)
|
12
|
+
included do
|
13
|
+
instance_variable_set(:@normalizers, {})
|
14
|
+
instance_variable_set(:@allowed_attributes, [])
|
17
15
|
end
|
18
16
|
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
module ClassMethods
|
18
|
+
def inherited(subclass)
|
19
|
+
default_normalizers = inherited_var(:@normalizers, {})
|
20
|
+
subclass.instance_variable_set(:@normalizers, default_normalizers)
|
21
|
+
|
22
|
+
default_allowed = inherited_var(:@allowed_attributes, [])
|
23
|
+
subclass.instance_variable_set(:@allowed_attributes, default_allowed)
|
24
|
+
end
|
25
|
+
|
26
|
+
def include_fields(*fields)
|
27
|
+
@allowed_attributes.concat fields
|
28
|
+
end
|
22
29
|
|
23
|
-
|
24
|
-
|
25
|
-
|
30
|
+
def normalize(name, args={}, &block)
|
31
|
+
lookup = args[:key] || name
|
32
|
+
method_name = normalizer_method_name(name)
|
26
33
|
|
27
|
-
|
28
|
-
|
34
|
+
@normalizers[lookup] = name
|
35
|
+
@allowed_attributes << lookup
|
29
36
|
|
30
|
-
|
31
|
-
|
32
|
-
|
37
|
+
define_method method_name do |data|
|
38
|
+
value = find_value lookup, data
|
39
|
+
return value unless block_given?
|
33
40
|
|
34
|
-
|
41
|
+
yield value
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def normalizer_method_name(field)
|
46
|
+
"normalize_#{field}".to_sym
|
35
47
|
end
|
48
|
+
|
36
49
|
end
|
37
50
|
|
38
51
|
def normalize(data)
|
@@ -108,10 +121,6 @@ module Schemad
|
|
108
121
|
search_data steps, data[step]
|
109
122
|
end
|
110
123
|
|
111
|
-
def self.normalizer_method_name(field)
|
112
|
-
"normalize_#{field}".to_sym
|
113
|
-
end
|
114
|
-
|
115
124
|
def normalizer_method_name(field)
|
116
125
|
self.class.normalizer_method_name(field)
|
117
126
|
end
|
data/lib/schemad/version.rb
CHANGED
data/spec/entity_spec.rb
CHANGED
data/spec/fixtures/demo_class.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
class Ent
|
1
|
+
class Ent
|
2
|
+
include Schemad::Entity
|
3
|
+
|
2
4
|
attribute :forest, type: :string, default: "Green"
|
3
5
|
attribute :roads, type: :integer
|
4
6
|
attribute :beasts, type: :integer
|
5
7
|
attribute :world
|
6
8
|
attribute :cool, type: :boolean
|
7
9
|
attribute :created, type: :date_time, default: -> { Time.now }
|
8
|
-
end
|
10
|
+
end
|
data/spec/normalizer_spec.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'schemad/normalizer'
|
3
3
|
|
4
|
-
class Demalizer
|
4
|
+
class Demalizer
|
5
|
+
include Schemad::Normalizer
|
6
|
+
|
5
7
|
normalize :world, key: "Middle Earth" do |val|
|
6
8
|
val.upcase
|
7
9
|
end
|
@@ -72,7 +74,9 @@ describe Schemad::Normalizer do
|
|
72
74
|
end
|
73
75
|
|
74
76
|
context "can mine nested properties" do
|
75
|
-
class BucketNormalizer
|
77
|
+
class BucketNormalizer
|
78
|
+
include Schemad::Normalizer
|
79
|
+
|
76
80
|
normalize :answer_to_the_universe, key: "useless_root"
|
77
81
|
normalize :username, key: "author/user/username"
|
78
82
|
normalize :avatar_url, key: "author/user/links/avatar/href"
|
@@ -81,7 +85,8 @@ describe Schemad::Normalizer do
|
|
81
85
|
end
|
82
86
|
end
|
83
87
|
|
84
|
-
class BadNormalizer
|
88
|
+
class BadNormalizer
|
89
|
+
include Schemad::Normalizer
|
85
90
|
# missing the "links" part of the path
|
86
91
|
normalize :avatar_url, key: "author/user/avatar/href"
|
87
92
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schemad
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luke van der Hoeven
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -106,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
106
|
version: '0'
|
107
107
|
requirements: []
|
108
108
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.4.5
|
109
|
+
rubygems_version: 2.4.5.1
|
110
110
|
signing_key:
|
111
111
|
specification_version: 4
|
112
112
|
summary: Simple schema DSL for services
|