parametric 0.2.0 → 0.2.1
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/README.md +28 -0
- data/lib/parametric/dsl.rb +18 -7
- data/lib/parametric/version.rb +1 -1
- data/spec/dsl_spec.rb +25 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac256ff264b098720b8104c163e3f63e34b1caf4bd72bfa037451f4748b4982a
|
4
|
+
data.tar.gz: 9e4f467c327b68fdc24b9da3068f784c75df95b9e642d804eaf5d1e743ad635c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91b8cea04a00f942e1fd6f1fd20a70b60903e3b959c434d489ad0431154700f176f7905ebe19957d11b9741617da22dac24dc9d05b8ee6abb90914537ea268c5
|
7
|
+
data.tar.gz: b2e705e5a45f5b795f19a4c222684375109389cfd8407e1875aea8da9ab82e52a66621a7906d9045d792d9c7ff4d8bd76d5af39ef02488fc63ff7c290fc2c9ba
|
data/README.md
CHANGED
@@ -742,6 +742,34 @@ class CreateUserForm
|
|
742
742
|
end
|
743
743
|
```
|
744
744
|
|
745
|
+
## Multiple schema definitions
|
746
|
+
|
747
|
+
Form objects can optionally define more than one schema by giving them names:
|
748
|
+
|
749
|
+
```ruby
|
750
|
+
class UpdateUserForm
|
751
|
+
include Parametric::DSL
|
752
|
+
|
753
|
+
# a schema named :query
|
754
|
+
# for example for query parameters
|
755
|
+
schema(:query) do
|
756
|
+
field(:user_id).type(:integer).present
|
757
|
+
end
|
758
|
+
|
759
|
+
# a schema for PUT body parameters
|
760
|
+
schema(:payload) do
|
761
|
+
field(:name).present
|
762
|
+
field(:age).present
|
763
|
+
end
|
764
|
+
end
|
765
|
+
```
|
766
|
+
|
767
|
+
Named schemas are inherited and can be extended and given options in the same way as the nameless version.
|
768
|
+
|
769
|
+
Named schemas can be retrieved by name, ie. `UpdateUserForm.schema(:query)`.
|
770
|
+
|
771
|
+
If no name given, `.schema` uses `:schema` as default schema name.
|
772
|
+
|
745
773
|
## Expanding fields dynamically
|
746
774
|
|
747
775
|
Sometimes you don't know the exact field names but you want to allow arbitrary fields depending on a given pattern.
|
data/lib/parametric/dsl.rb
CHANGED
@@ -22,26 +22,37 @@ module Parametric
|
|
22
22
|
#
|
23
23
|
# foo.params # => {title: "A title", age: 20}
|
24
24
|
#
|
25
|
+
DEFAULT_SCHEMA_NAME = :schema
|
26
|
+
|
25
27
|
def self.included(base)
|
26
28
|
base.extend(ClassMethods)
|
27
|
-
base.
|
29
|
+
base.schemas = {DEFAULT_SCHEMA_NAME => Parametric::Schema.new}
|
28
30
|
end
|
29
31
|
|
30
32
|
module ClassMethods
|
31
33
|
def schema=(sc)
|
32
|
-
@
|
34
|
+
@schemas[DEFAULT_SCHEMA_NAME] = sc
|
35
|
+
end
|
36
|
+
|
37
|
+
def schemas=(sc)
|
38
|
+
@schemas = sc
|
33
39
|
end
|
34
40
|
|
35
41
|
def inherited(subclass)
|
36
|
-
subclass.
|
42
|
+
subclass.schemas = @schemas.each_with_object({}) do |(key, sc), hash|
|
43
|
+
hash[key] = sc.merge(Parametric::Schema.new)
|
44
|
+
end
|
37
45
|
end
|
38
46
|
|
39
|
-
def schema(
|
40
|
-
|
47
|
+
def schema(*args, &block)
|
48
|
+
options = args.last.is_a?(Hash) ? args.last : {}
|
49
|
+
key = args.first.is_a?(Symbol) ? args.first : DEFAULT_SCHEMA_NAME
|
50
|
+
current_schema = @schemas.fetch(key) { Parametric::Schema.new }
|
51
|
+
return current_schema unless options.any? || block_given?
|
41
52
|
|
42
53
|
new_schema = Parametric::Schema.new(options, &block)
|
43
|
-
@
|
44
|
-
after_define_schema(@
|
54
|
+
@schemas[key] = current_schema ? current_schema.merge(new_schema) : new_schema
|
55
|
+
after_define_schema(@schemas[key])
|
45
56
|
end
|
46
57
|
|
47
58
|
def after_define_schema(sc)
|
data/lib/parametric/version.rb
CHANGED
data/spec/dsl_spec.rb
CHANGED
@@ -5,6 +5,10 @@ describe "classes including DSL module" do
|
|
5
5
|
class Parent
|
6
6
|
include Parametric::DSL
|
7
7
|
|
8
|
+
schema :extras, search_type: :string do |opts|
|
9
|
+
field(:search).policy(opts[:search_type])
|
10
|
+
end
|
11
|
+
|
8
12
|
schema(age_type: :integer) do |opts|
|
9
13
|
field(:title).policy(:string)
|
10
14
|
field(:age).policy(opts[:age_type])
|
@@ -12,12 +16,18 @@ describe "classes including DSL module" do
|
|
12
16
|
end
|
13
17
|
|
14
18
|
class Child < Parent
|
19
|
+
schema :extras do
|
20
|
+
field(:query).type(:string)
|
21
|
+
end
|
22
|
+
|
15
23
|
schema(age_type: :string) do
|
16
24
|
field(:description).policy(:string)
|
17
25
|
end
|
18
26
|
end
|
19
27
|
|
20
28
|
class GrandChild < Child
|
29
|
+
schema :extras, search_type: :integer
|
30
|
+
|
21
31
|
schema(age_type: :integer)
|
22
32
|
end
|
23
33
|
|
@@ -42,6 +52,16 @@ describe "classes including DSL module" do
|
|
42
52
|
expect(child_output[:title]).to eq "A title"
|
43
53
|
expect(child_output[:age]).to eq "38"
|
44
54
|
expect(child_output[:description]).to eq "A description"
|
55
|
+
|
56
|
+
# named schema
|
57
|
+
parent_output = Parent.schema(:extras).resolve(search: 10, query: 'foo').output
|
58
|
+
child_output = Child.schema(:extras).resolve(search: 10, query: 'foo').output
|
59
|
+
|
60
|
+
expect(parent_output.keys).to match_array([:search])
|
61
|
+
expect(parent_output[:search]).to eq "10"
|
62
|
+
expect(child_output.keys).to match_array([:search, :query])
|
63
|
+
expect(child_output[:search]).to eq "10"
|
64
|
+
expect(child_output[:query]).to eq "foo"
|
45
65
|
end
|
46
66
|
|
47
67
|
it "inherits options" do
|
@@ -51,6 +71,11 @@ describe "classes including DSL module" do
|
|
51
71
|
expect(grand_child_output[:title]).to eq "A title"
|
52
72
|
expect(grand_child_output[:age]).to eq 38
|
53
73
|
expect(grand_child_output[:description]).to eq "A description"
|
74
|
+
|
75
|
+
# named schema
|
76
|
+
grand_child_output = GrandChild.schema(:extras).resolve(search: "100", query: "bar").output
|
77
|
+
expect(grand_child_output.keys).to match_array([:search, :query])
|
78
|
+
expect(grand_child_output[:search]).to eq 100
|
54
79
|
end
|
55
80
|
end
|
56
81
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parametric
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ismael Celis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-08-
|
11
|
+
date: 2018-08-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|