json_factory 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e4514793bfcddf9c571232e5cf6bef2f4f0e3604
4
- data.tar.gz: e6370cc5a01e97d48237e9ae60b6f23f6acd6d13
3
+ metadata.gz: 454931a891f470c353038999c80a2ec56bcb6123
4
+ data.tar.gz: 5a56f375ce2338492bc71e6994cbed1dca3dce20
5
5
  SHA512:
6
- metadata.gz: 7c49593eaacc118a094cec4ec95bd5a15c359507f870d2b7911e0445e1c2aeb5f87b065d38cfa67741368f187657dd623ba935bade271d0d7ea455e0ab3e9ce2
7
- data.tar.gz: f4ed8f8663d43b36e5f5a4c23af22f6a151470655e4766c27869a12ac1594d62db271aafd67b6853c5760586248485f13e146b7b513b75dc131f9a1431cc7562
6
+ metadata.gz: 4d83cf336f0a24cac3e33b7593b3c80b29531ae4edbca150fa59d7113c99b2e5beadeae88fa294ddadc86cb3fa8ed84b26bbe9039c68f2e5c4d611817d12c14f
7
+ data.tar.gz: 1bcf40a03c5647c892ab7738d0c420f244a978b76d9fb8a784c04022f382b362880713df43610d9e6b75faac22b8b957ac558844d5e78ff5972dbf2ce1b2c99c
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # JsonFactory
4
4
 
5
- JsonFactory is a Easy DSL to create JSON structures with the development focus on performance.
5
+ JsonFactory is a Easy DSL to create JSON with focus on performance and flexibility.
6
6
 
7
7
  ## Installation
8
8
 
@@ -22,108 +22,123 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- | DSL Method | Description |
26
- | ---------- |:------------------------------------------------------------------- |
27
- | value | Generates a JSON value. |
28
- | object | Generates a JSON object structure. |
29
- | member | Adds a key-value pair to a JSON object. |
30
- | array | Generates a JSON array structure. |
31
- | element | Adds a value to a JSON array. |
32
- | partial | Loads the given partial and evaluates it using the local variables. |
33
- | cache | Caches the given content under the specified key. |
25
+ | DSL Method | Description |
26
+ | ------------------------------------ |:------------------------------------------------------------------- |
27
+ | [value](#value-method) | Generates a JSON value. |
28
+ | [object](#object-method) | Generates a JSON object. |
29
+ | [member](#member-method) | Adds a key-value pair to a JSON object. |
30
+ | [array](#array-method) | Generates a JSON array. |
31
+ | [object_array](#object_array-method) | Generates a JSON array. |
32
+ | [element](#element-method) | Adds a value to a JSON array. |
33
+ | [partial](#partial-method) | Loads the given partial and evaluates it using the local variables. |
34
+ | [cache](#cache-method) | Caches the given content under the specified key. |
35
+ | [object_if](#object_if-method) | Generates a JSON object if condition is true. |
34
36
 
35
- ##### Top level object JSON structure
37
+ ##### value method
36
38
 
37
39
  ```ruby
38
40
  factory = <<-RUBY
39
- json.object do
40
- json.member :data do
41
- json.object do
42
- json.member :id, object.id
43
- json.member :name, object.name
44
- json.member :test_array do
45
- json.object_array(object.test_objects) do |test_object|
46
- json.member :id, test_object.id)
47
- json.member :name, test_object.name
48
- end
49
- end
41
+ value nil
42
+ RUBY
43
+
44
+ puts JSONFactory.build(factory) # => null
45
+ ```
46
+
47
+ ##### object method
48
+
49
+ ```ruby
50
+ factory = <<-RUBY
51
+ object do
52
+ member :data do
53
+ object do
54
+ member :id, object.id
50
55
  end
51
56
  end
52
57
  end
53
58
  RUBY
54
59
 
55
60
  # test data
56
- test_object_1 = OpenStruct.new(id: '001', name: 'TestObject2')
57
- test_object_2 = OpenStruct.new(id: '002', name: 'TestObject3')
58
- test_object = OpenStruct.new(id: '1', name: 'TestObject1', test_objects: [test_object_1, test_object_2])
61
+ test_object = OpenStruct.new(id: 1)
59
62
 
60
- puts JSONFactory.build(factory, object: test_object)
63
+ puts JSONFactory.build(factory, object: test_object) # => {"data":{"id":1}}
61
64
  ```
62
65
 
63
- ```json
64
- {
65
- "data": {
66
- "id": "1",
67
- "name": "TestObject1",
68
- "test_array": [
69
- { "id": "001", "name": "TestObject2" },
70
- { "id": "002", "name": "TestObject3" }
71
- ]
72
- }
73
- }
66
+ ##### member method
67
+
68
+ ```ruby
69
+ factory = <<-RUBY
70
+ object do
71
+ member :foo, 'bar'
72
+ end
73
+ RUBY
74
+
75
+ puts JSONFactory.build(factory) # => {"foo":"bar"}
74
76
  ```
75
77
 
76
- ##### Top level array JSON structure
78
+ ##### array method
77
79
 
78
80
  ```ruby
79
81
  factory = <<-RUBY
80
- json.object_array objects do |test_object|
81
- json.member :id, test_object.id
82
- json.member :name, test_object.name
82
+ array
83
+ objects.each do |test_object|
84
+ element :id, test_object.id
85
+ end
83
86
  end
84
87
  RUBY
85
88
 
86
89
  # test data
87
- test_object_1 = OpenStruct.new(id: '001', name: 'TestObject2')
88
- test_object_2 = OpenStruct.new(id: '002', name: 'TestObject3')
90
+ test_object_1 = OpenStruct.new(id: 1)
91
+ test_object_2 = OpenStruct.new(id: 2)
89
92
 
90
- puts JSONFactory.build(factory, objects: [test_object_1, test_object_2])
93
+ puts JSONFactory.build(factory, objects: [test_object_1, test_object_2]) # => [{"id": 1},{"id":2}]
91
94
  ```
92
95
 
93
- ```json
94
- [
95
- { "id": "001", "name": "TestObject2" },
96
- { "id": "002", "name": "TestObject3" }
97
- ]
96
+ ##### object_array method
97
+
98
+ ```ruby
99
+ factory = <<-RUBY
100
+ object_array objects do |test_object|
101
+ member :id, test_object.id
102
+ end
103
+ RUBY
104
+
105
+ # test data
106
+ test_object_1 = OpenStruct.new(id: 1)
107
+ test_object_2 = OpenStruct.new(id: 2)
108
+
109
+ puts JSONFactory.build(factory, objects: [test_object_1, test_object_2]) # => [{"id":1},{"id":2}]
98
110
  ```
99
111
 
100
- ##### Load jfactory files
112
+ ##### element method
101
113
 
102
114
  ```ruby
103
- # tmp/test.jfactory
104
- json.member :id, test_object.id
105
- json.member :name, test_object.name
106
- ```
115
+ factory = <<-RUBY
116
+ array
117
+ objects.each do |test_object|
118
+ element :id, test_object.id
119
+ end
120
+ end
121
+ RUBY
107
122
 
108
- ```ruby
109
- # test data
110
- test_object = OpenStruct.new(id: '1', name: 'TestObject1')
123
+ # test data
124
+ test_object_1 = OpenStruct.new(id: 1)
125
+ test_object_2 = OpenStruct.new(id: 2)
111
126
 
112
- puts JSONFactory.build('tmp/test.jfactory', object: test_object).build # => { "id": 1, name: "TestObject1" }
113
- ```
127
+ puts JSONFactory.build(factory, objects: [test_object_1, test_object_2]) # => [{"id": 1},{"id":2}]
128
+ ```
114
129
 
115
- ##### Load partials
130
+ ##### partial method
116
131
 
117
132
  ```ruby
118
133
  # tmp/_test_partial.jfactory
119
- json.member :id, test_object.id
120
- json.member :name, test_object.name
134
+ member :id, test_object.id
135
+ member :name, test_object.name
121
136
  ```
122
137
 
123
138
  ```ruby
124
139
  # tmp/test.jfactory
125
- json.object do
126
- json.partial 'tmp/test_partial', test_object: object
140
+ object do
141
+ partial 'tmp/test_partial', test_object: object
127
142
  end
128
143
  ```
129
144
 
@@ -134,16 +149,16 @@ test_object = OpenStruct.new(id: '1', name: 'TestObject1')
134
149
  puts JSONFactory.build('tmp/test.jfactory', object: test_object).build # => { "id": 1, name: "TestObject1" }
135
150
  ```
136
151
 
137
- ##### Use cache stores
152
+ ##### cache method
138
153
 
139
154
  ```ruby
140
155
  factory = <<-RUBY
141
- json.object do
142
- json.member :data do
143
- json.object do
144
- json.cache 'test-cache-key' do
145
- json.member :id, object.id
146
- json.member :name, object.name
156
+ object do
157
+ member :data do
158
+ object do
159
+ cache 'test-cache-key' do
160
+ member :id, object.id
161
+ member :name, object.name
147
162
  end
148
163
  end
149
164
  end
@@ -153,11 +168,56 @@ RUBY
153
168
  # test data
154
169
  test_object = OpenStruct.new(id: '1', name: 'TestObject1')
155
170
 
171
+ # set cache store
156
172
  JSONFactory::Cache.instance.store = ActiveSupport::Cache::MemoryStore.new
157
173
 
158
174
  puts JSONFactory.build(factory, object: test_object) # => { "data": { "id": "1", "name": "TestObject1" } }
159
175
  ```
160
176
 
177
+ ##### object_if method
178
+
179
+ ```ruby
180
+ factory = <<-RUBY
181
+ object do
182
+ member :data do
183
+ object_if true do
184
+ member :foo, 'bar'
185
+ end
186
+ end
187
+ end
188
+ RUBY
189
+
190
+ puts JSONFactory.build(factory) # => { "data": { "foo": "bar" } }
191
+ ```
192
+ ```ruby
193
+ factory = <<-RUBY
194
+ object do
195
+ member :data do
196
+ object_if false do
197
+ member :foo, 'bar'
198
+ end
199
+ end
200
+ end
201
+ RUBY
202
+
203
+ puts JSONFactory.build(factory) # => { "data": null }
204
+ ```
205
+
206
+ ##### Load jfactory files
207
+
208
+ ```ruby
209
+ # tmp/test.jfactory
210
+ member :id, test_object.id
211
+ member :name, test_object.name
212
+ ```
213
+
214
+ ```ruby
215
+ # test data
216
+ test_object = OpenStruct.new(id: '1', name: 'TestObject1')
217
+
218
+ puts JSONFactory.build('tmp/test.jfactory', object: test_object).build # => { "id": 1, name: "TestObject1" }
219
+ ```
220
+
161
221
  ## Development
162
222
 
163
223
  To install this gem onto your local machine, run `bundle exec rake install`.
@@ -11,7 +11,6 @@ require_relative 'json_factory/errors'
11
11
  require_relative 'json_factory/state'
12
12
  require_relative 'json_factory/converter'
13
13
  require_relative 'json_factory/dsl'
14
- require_relative 'json_factory/dsl/object_array'
15
14
  require_relative 'json_factory/template_store'
16
15
  require_relative 'json_factory/json_builder'
17
16
  require_relative 'json_factory/builder'
@@ -15,5 +15,9 @@ module JSONFactory
15
15
  def include_helper(mod)
16
16
  @helpers.push(mod)
17
17
  end
18
+
19
+ def extend_dsl(mod)
20
+ JSONFactory::DSL.include(mod)
21
+ end
18
22
  end
19
23
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'dsl/object_array'
4
+ require_relative 'dsl/object_if'
5
+
3
6
  module JSONFactory
4
7
  class DSL
5
8
  def self.check_arity(argc, expected)
@@ -14,7 +14,7 @@ module JSONFactory
14
14
  # json.array do
15
15
  # [1,2,3].each do |id|
16
16
  # json.object do
17
- # json.member :id, id
17
+ # json.element :id, id
18
18
  # end
19
19
  # end
20
20
  # end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JSONFactory
4
+ class DSL
5
+ # Helper method to generate an object.
6
+ #
7
+ # json.object_if(true) do |id|
8
+ # json.member :foo, 'bar'
9
+ # end
10
+ # # generates: {"foo":"bar"}
11
+ #
12
+ # json.object_if(false) do |id|
13
+ # json.member :foo, 'bar'
14
+ # end
15
+ # # generates: null
16
+ def object_if(value, &block)
17
+ value ? object(&block) : value(nil)
18
+ end
19
+ end
20
+ end
@@ -84,11 +84,12 @@ module JSONFactory
84
84
  end
85
85
 
86
86
  def evaluate(string, local_variables, filename)
87
- binding = jfactory
87
+ dsl = DSL.new(self)
88
+ binding = jfactory(dsl)
88
89
  local_variables.each_pair do |key, value|
89
90
  binding.local_variable_set(key, value)
90
91
  end
91
- binding.local_variable_set(BUILDER_VARIABLE_NAME, DSL.new(self))
92
+ binding.local_variable_set(BUILDER_VARIABLE_NAME, dsl)
92
93
  eval(string, binding, filename.to_s) # rubocop:disable Security/Eval
93
94
  end
94
95
 
@@ -145,7 +146,7 @@ end
145
146
 
146
147
  JSONFactory::JSONBuilder.class_eval do
147
148
  # Returns an empty evaluation context, similar to Ruby's main object.
148
- def jfactory
149
+ def jfactory(__dsl__)
149
150
  Object.allocate.instance_eval do
150
151
  class << self
151
152
  JSONFactory.configure.helpers.each { |mod| include mod }
@@ -155,6 +156,19 @@ JSONFactory::JSONBuilder.class_eval do
155
156
  end
156
157
  alias inspect to_s
157
158
  end
159
+
160
+ define_singleton_method(:__dsl__) do
161
+ __dsl__
162
+ end
163
+
164
+ def method_missing(method_name, *args, &block)
165
+ if __dsl__.respond_to?(method_name)
166
+ __dsl__.send(method_name, *args, &block)
167
+ else
168
+ super
169
+ end
170
+ end
171
+
158
172
  return binding
159
173
  end
160
174
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JSONFactory
4
- VERSION = '0.4.0'
4
+ VERSION = '0.5.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_factory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Klaiber
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-24 00:00:00.000000000 Z
11
+ date: 2018-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -171,7 +171,6 @@ files:
171
171
  - examples/benchmark.rb
172
172
  - examples/fixtures/_test_partial.jfactory
173
173
  - examples/fixtures/test.jfactory
174
- - examples/readme_examples.rb
175
174
  - json_factory.gemspec
176
175
  - lib/json_factory.rb
177
176
  - lib/json_factory/builder.rb
@@ -180,6 +179,7 @@ files:
180
179
  - lib/json_factory/converter.rb
181
180
  - lib/json_factory/dsl.rb
182
181
  - lib/json_factory/dsl/object_array.rb
182
+ - lib/json_factory/dsl/object_if.rb
183
183
  - lib/json_factory/errors.rb
184
184
  - lib/json_factory/json_builder.rb
185
185
  - lib/json_factory/railtie.rb
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../lib/json_factory'
4
-
5
- # test data
6
- test_object1 = OpenStruct.new(id: '001', name: 'TestObject2')
7
- test_object2 = OpenStruct.new(id: '002', name: 'TestObject3')
8
- test_object = OpenStruct.new(id: '1', name: 'TestObject1', description: 'Test2', test_objects: [test_object1, test_object2])
9
-
10
- factory = <<-RUBY
11
- object! do
12
- object!(:data) do
13
- member!(:id, object.id)
14
- member!(:name, object.name)
15
- member!(:test_array) do
16
- array!(object.test_objects) do |test_object|
17
- member!(:id, test_object.id)
18
- member!(:name, test_object.name)
19
- end
20
- end
21
- end
22
- end
23
- RUBY
24
-
25
- # create context object
26
- context = JSONFactory::Context.new(object: test_object)
27
-
28
- puts JSONFactory::JSONBuilder.new(factory, context).build
29
-
30
- factory = <<-RUBY
31
- array! objects do |test_object|
32
- member!(:id, test_object.id)
33
- member!(:name, test_object.name)
34
- end
35
- RUBY
36
- # create context object
37
- context = JSONFactory::Context.new(objects: [test_object1, test_object2])
38
-
39
- puts JSONFactory::JSONBuilder.new(factory, context).build