declarative 0.0.3 → 0.0.4
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/CHANGES.md +4 -0
- data/README.md +3 -3
- data/lib/declarative.rb +2 -24
- data/lib/declarative/deep_dup.rb +14 -0
- data/lib/declarative/definitions.rb +11 -4
- data/lib/declarative/heritage.rb +36 -0
- data/lib/declarative/schema.rb +7 -11
- data/lib/declarative/version.rb +1 -1
- data/test/definitions_test.rb +20 -0
- data/test/heritage_test.rb +20 -3
- data/test/schema_test.rb +1 -6
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 777087a37a008f6db451fe0d998180119cef3a43
|
4
|
+
data.tar.gz: 9dc8ca151863c9c438c9fd45f3784472c0270e7e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ad76a30355469122e73ef454c393f6f1827648687b5a507f7e066100be68c180562133cae14b37160313e92cecb8838d437b9da3dcac38d037f5b86d9645819
|
7
|
+
data.tar.gz: a1a0cd8836cdd1eb93da1dd0ea5d782cc39fc82f650625f26ec550e9430e7ccc8438ef5a41fefef11add1336c320fd889e97367ee2c302ea56ada71732cb56e5
|
data/CHANGES.md
CHANGED
data/README.md
CHANGED
@@ -70,7 +70,7 @@ Override `::nested_builder` to define your own way of doing that.
|
|
70
70
|
|
71
71
|
```ruby
|
72
72
|
class Model
|
73
|
-
|
73
|
+
extend Declarative::Schema
|
74
74
|
|
75
75
|
def self.default_nested_class
|
76
76
|
Model
|
@@ -92,7 +92,7 @@ You can automatically include modules into all nested schemas by using `::featur
|
|
92
92
|
|
93
93
|
```ruby
|
94
94
|
class Model
|
95
|
-
|
95
|
+
extend Declarative::Schema
|
96
96
|
feature Bla
|
97
97
|
```
|
98
98
|
|
@@ -100,7 +100,7 @@ class Model
|
|
100
100
|
|
101
101
|
```ruby
|
102
102
|
class Model
|
103
|
-
|
103
|
+
extend Declarative::Schema
|
104
104
|
defaults visible: true
|
105
105
|
```
|
106
106
|
|
data/lib/declarative.rb
CHANGED
@@ -1,31 +1,9 @@
|
|
1
1
|
require "declarative/version"
|
2
2
|
require "declarative/definitions"
|
3
|
+
require "declarative/heritage"
|
3
4
|
require "declarative/defaults"
|
4
5
|
require "declarative/schema"
|
6
|
+
require "declarative/deep_dup"
|
5
7
|
|
6
8
|
module Declarative
|
7
|
-
module DSL
|
8
|
-
def heritage
|
9
|
-
@heritage ||= Heritage.new
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
module Inheritance
|
14
|
-
def included(includer)
|
15
|
-
heritage.(includer)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
class Heritage < Array
|
21
|
-
def record(method, name, options=nil, &block)
|
22
|
-
self << {method: method, args: [name, options ? options.dup : nil].compact, block: block} # DISCUSS: options.dup.
|
23
|
-
end
|
24
|
-
|
25
|
-
def call(inheritor)
|
26
|
-
each do |cfg|
|
27
|
-
inheritor.send(cfg[:method], *cfg[:args], &cfg[:block])
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
9
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Declarative
|
2
|
+
class DeepDup
|
3
|
+
def self.call(args)
|
4
|
+
return Array[*dup_items(args)] if args.is_a?(Array)
|
5
|
+
return Hash[dup_items(args)] if args.is_a?(Hash)
|
6
|
+
args
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
def self.dup_items(arr)
|
11
|
+
arr.to_a.collect { |v| call(v) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -2,15 +2,22 @@ module Declarative
|
|
2
2
|
class Definitions < Hash
|
3
3
|
class Definition
|
4
4
|
def initialize(name, options={}, &block)
|
5
|
-
@options = options.
|
5
|
+
@options = options.dup
|
6
6
|
@options[:name] = name.to_s
|
7
7
|
end
|
8
8
|
|
9
|
-
attr_reader :options # TODO: are we gonna keep this?
|
10
|
-
|
11
9
|
def [](name)
|
12
10
|
@options[name]
|
13
11
|
end
|
12
|
+
|
13
|
+
def merge!(hash) # TODO: this should return a new Definition instance.
|
14
|
+
@options.merge!(hash)
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def merge(hash) # TODO: should be called #copy.
|
19
|
+
DeepDup.(@options).merge(hash)
|
20
|
+
end
|
14
21
|
end
|
15
22
|
|
16
23
|
def initialize(definition_class)
|
@@ -34,7 +41,7 @@ module Declarative
|
|
34
41
|
|
35
42
|
if options.delete(:inherit) and parent_property = get(name)
|
36
43
|
base = parent_property[:nested]
|
37
|
-
options = parent_property.
|
44
|
+
options = parent_property.merge(options) # TODO: Definition#merge
|
38
45
|
end
|
39
46
|
|
40
47
|
if options[:_nested_builder]
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Declarative
|
2
|
+
class Heritage < Array
|
3
|
+
def record(method, *args, &block)
|
4
|
+
self << {method: method, args: DeepDup.(args), block: block} # DISCUSS: options.dup.
|
5
|
+
end
|
6
|
+
|
7
|
+
def call(inheritor)
|
8
|
+
each do |cfg|
|
9
|
+
inheritor.send(cfg[:method], *cfg[:args], &cfg[:block])
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
module DSL
|
15
|
+
def heritage
|
16
|
+
@heritage ||= Heritage.new
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# To be extended into classes using Heritage. Inherits the heritage.
|
21
|
+
module Inherited
|
22
|
+
def inherited(subclass)
|
23
|
+
super
|
24
|
+
heritage.(subclass)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# To be included into modules using Heritage. When included, inherits the heritage.
|
29
|
+
module Included
|
30
|
+
def included(mod)
|
31
|
+
super
|
32
|
+
heritage.(mod)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/declarative/schema.rb
CHANGED
@@ -10,6 +10,13 @@ module Declarative
|
|
10
10
|
#
|
11
11
|
# Requirements to includer: ::default_nested_class, override building with ::nested_builder.
|
12
12
|
module Schema
|
13
|
+
def self.extended(extender)
|
14
|
+
extender.extend DSL # ::property
|
15
|
+
extender.extend Feature # ::feature
|
16
|
+
extender.extend Heritage::DSL # ::heritage
|
17
|
+
extender.extend Heritage::Inherited # ::included
|
18
|
+
end
|
19
|
+
|
13
20
|
module DSL
|
14
21
|
def property(name, options={}, &block)
|
15
22
|
heritage.record(:property, name, options, &block)
|
@@ -53,17 +60,6 @@ module Declarative
|
|
53
60
|
end
|
54
61
|
end
|
55
62
|
|
56
|
-
module Heritage
|
57
|
-
def heritage
|
58
|
-
@heritage ||= ::Declarative::Heritage.new
|
59
|
-
end
|
60
|
-
|
61
|
-
def inherited(subclass) # DISCUSS: this could be in Decorator? but then we couldn't do B < A(include X) for non-decorators, right?
|
62
|
-
super
|
63
|
-
heritage.(subclass)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
63
|
module Feature
|
68
64
|
# features are registered as defaults using _features, which in turn get translated to
|
69
65
|
# Class.new... { feature mod } which makes it recursive in nested schemas.
|
data/lib/declarative/version.rb
CHANGED
data/test/definitions_test.rb
CHANGED
@@ -77,6 +77,26 @@ class DefinitionsTest < Minitest::Spec
|
|
77
77
|
|
78
78
|
|
79
79
|
schema.inspect.must_equal '{"artist"=>#<Declarative::Definitions::Definition: @options={:cool=>true, :nested=>{"name"=>#<Declarative::Definitions::Definition: @options={:name=>"name"}>, "band"=>#<Declarative::Definitions::Definition: @options={:crazy=>nil, :nested=>{"location"=>#<Declarative::Definitions::Definition: @options={:name=>"location"}>, "genre"=>#<Declarative::Definitions::Definition: @options={:name=>"genre"}>}, :name=>"band", :normal=>false}>}, :name=>"artist", :uncool=>false}>, "id"=>#<Declarative::Definitions::Definition: @options={:unique=>false, :value=>1, :name=>"id"}>}'
|
80
|
+
end
|
81
|
+
|
82
|
+
it "#add with nested options followed by inherit: true" do
|
83
|
+
schema.add :id, deserializer: options = { render: false }
|
84
|
+
schema.add :id, inherit: true
|
85
|
+
|
86
|
+
schema.get(:id)[:deserializer][:parse] = true
|
87
|
+
|
88
|
+
options.must_equal(render: false)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
class DefinitionTest < Minitest::Spec
|
94
|
+
let (:definition) { Declarative::Definitions::Definition.new(:name) }
|
80
95
|
|
96
|
+
it "#merge does return deep copy" do
|
97
|
+
options = { render: false }
|
98
|
+
merged = definition.merge(options)
|
99
|
+
definition.merge!(render: true)
|
100
|
+
merged.must_equal(:name=>"name", render: false)
|
81
101
|
end
|
82
102
|
end
|
data/test/heritage_test.rb
CHANGED
@@ -1,17 +1,34 @@
|
|
1
1
|
require "test_helper"
|
2
2
|
|
3
3
|
class HeritageTest < Minitest::Spec
|
4
|
+
P = Proc.new{}.extend(Declarative::Inspect)
|
4
5
|
# #record
|
5
6
|
module RepresenterA
|
6
|
-
extend Declarative::DSL
|
7
|
+
extend Declarative::Heritage::DSL
|
7
8
|
|
8
9
|
# one arg.
|
9
10
|
heritage.record(:representation_wrap=, true)
|
10
11
|
# 2 args.
|
11
12
|
heritage.record(:property, :name, enable: true)
|
12
13
|
# 3 args.
|
13
|
-
heritage.record(:property, :id, {}, &
|
14
|
+
heritage.record(:property, :id, {}, &P)
|
14
15
|
end
|
15
16
|
|
16
|
-
it { RepresenterA.heritage.inspect.must_equal "[{:method=>:representation_wrap=, :args=>[true], :block=>nil}, {:method=>:property, :args=>[:name, {:enable=>true}], :block=>nil}, {:method=>:property, :args=>[:id, {}], :block=>#<Proc:@heritage_test.rb:
|
17
|
+
it { RepresenterA.heritage.inspect.must_equal "[{:method=>:representation_wrap=, :args=>[true], :block=>nil}, {:method=>:property, :args=>[:name, {:enable=>true}], :block=>nil}, {:method=>:property, :args=>[:id, {}], :block=>#<Proc:@heritage_test.rb:4>}]" }
|
18
|
+
|
19
|
+
|
20
|
+
describe "dup of arguments" do
|
21
|
+
module B
|
22
|
+
extend Declarative::Heritage::DSL
|
23
|
+
|
24
|
+
options = {render: true, nested: {render: false}}
|
25
|
+
|
26
|
+
heritage.record(:property, :name, options, &P)
|
27
|
+
|
28
|
+
options[:parse] = true
|
29
|
+
options[:nested][:parse] = false
|
30
|
+
end
|
31
|
+
|
32
|
+
it { B.heritage.inspect.must_equal "[{:method=>:property, :args=>[:name, {:render=>true, :nested=>{:render=>false}}], :block=>#<Proc:@heritage_test.rb:4>}]" }
|
33
|
+
end
|
17
34
|
end
|
data/test/schema_test.rb
CHANGED
@@ -2,9 +2,7 @@ require "test_helper"
|
|
2
2
|
|
3
3
|
class SchemaTest < Minitest::Spec
|
4
4
|
class Decorator
|
5
|
-
extend Declarative::Schema
|
6
|
-
extend Declarative::Schema::Feature # TODO: make automatic
|
7
|
-
extend Declarative::Schema::Heritage # TODO: make automatic
|
5
|
+
extend Declarative::Schema
|
8
6
|
|
9
7
|
def self.default_nested_class
|
10
8
|
Decorator
|
@@ -38,8 +36,6 @@ class SchemaTest < Minitest::Spec
|
|
38
36
|
it do
|
39
37
|
Concrete.extend(Declarative::Inspect::Schema)
|
40
38
|
Concrete.inspect
|
41
|
-
pp Concrete.definitions.get(:artist).options
|
42
|
-
# pp Concrete.definitions.get(:artist)[:nested].definitions.get(:band)[:nested].definitions
|
43
39
|
Concrete.inspect.gsub(/\s/, "").must_equal 'Schema:{
|
44
40
|
"links"=>#<Declarative::Definitions::Definition:@options={:render_nil=>true,:as=>"LINKS",:name=>"links"}>,
|
45
41
|
"artist"=>#<Declarative::Definitions::Definition:@options={:render_nil=>true,:as=>"ARTIST",:cool=>true,:nested=>Schema:{
|
@@ -60,7 +56,6 @@ class SchemaTest < Minitest::Spec
|
|
60
56
|
it do
|
61
57
|
InheritingConcrete.extend(Declarative::Inspect::Schema)
|
62
58
|
InheritingConcrete.inspect
|
63
|
-
pp InheritingConcrete.definitions.get(:artist).options
|
64
59
|
# pp InheritingConcrete.definitions.get(:artist)[:nested].definitions.get(:band)[:nested].definitions
|
65
60
|
InheritingConcrete.inspect.gsub(/\s/, "").must_equal 'Schema:{
|
66
61
|
"links"=>#<Declarative::Definitions::Definition:@options={:render_nil=>true,:as=>"LINKS",:name=>"links"}>,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: declarative
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Sutterer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: uber
|
@@ -82,8 +82,10 @@ files:
|
|
82
82
|
- Rakefile
|
83
83
|
- declarative.gemspec
|
84
84
|
- lib/declarative.rb
|
85
|
+
- lib/declarative/deep_dup.rb
|
85
86
|
- lib/declarative/defaults.rb
|
86
87
|
- lib/declarative/definitions.rb
|
88
|
+
- lib/declarative/heritage.rb
|
87
89
|
- lib/declarative/schema.rb
|
88
90
|
- lib/declarative/testing.rb
|
89
91
|
- lib/declarative/version.rb
|