json_factory 0.4.0 → 0.5.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 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