faker_maker 1.1.2 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/README.md +69 -0
- data/Rakefile +2 -0
- data/bin/console +1 -0
- data/faker_maker.gemspec +4 -2
- data/lib/faker_maker.rb +2 -0
- data/lib/faker_maker/attribute.rb +15 -1
- data/lib/faker_maker/base.rb +2 -0
- data/lib/faker_maker/definition_proxy.rb +2 -0
- data/lib/faker_maker/factory.rb +20 -3
- data/lib/faker_maker/version.rb +3 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8dad7967bc0e3c689498afafca60a7b9c691aa8af466880ac5af87d5668e4706
|
4
|
+
data.tar.gz: c7659747e882e4a9361507759629f4482068475c859dc9883a79ffdb62b916fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb83e7d087b54877d133d89b7b00f4c849eb8355c5dc9233b53dfe69d8a9096ec8f2da6edc5539a2334ab7afc880e1c5fb6369b590e69b31e8a7a99fb94b39f2
|
7
|
+
data.tar.gz: 1e661f28f49569d73dbeeb8ddbd27226a5d124522d6fd07b53be9341f7021f7dc46595d9d1f55303f62df92a1d49b7276c68e854fee6f84e03b1866aa6197c79
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -140,8 +140,33 @@ FakerMaker.factory :basket do
|
|
140
140
|
end
|
141
141
|
```
|
142
142
|
|
143
|
+
### Organising dependencies
|
144
|
+
|
145
|
+
Factory definition files are Plain Ol' Ruby. If you depend on another factory because you either extend from it or use it just add a `require` or (depending on your load path) `require_relative` to the top of your file.
|
146
|
+
|
143
147
|
### JSON field names
|
144
148
|
|
149
|
+
JavaScript likes to use camelCase, Ruby's idiom is to use snake_case. This can make make manipulating factory-built objects in ruby ugly. To avoid this, you can call your fields one thing and ask the JSON outputter to rename the field when generating JSON.
|
150
|
+
|
151
|
+
```ruby
|
152
|
+
FakerMaker.factory :vehicle do
|
153
|
+
wheels { 4 }
|
154
|
+
colour { Faker::Color.color_name }
|
155
|
+
engine_capacity(json: 'engineCapacity') { rand( 600..2500 ) }
|
156
|
+
end
|
157
|
+
|
158
|
+
v = FM[:vehicle].build
|
159
|
+
v.engine_capacity = 125
|
160
|
+
```
|
161
|
+
|
162
|
+
and calls to `as_json` and `to_json` will report the fieldname as `engineCapacity`.
|
163
|
+
|
164
|
+
```ruby
|
165
|
+
v.to_json
|
166
|
+
|
167
|
+
=> "{\"wheels\":4,\"colour\":\"blue\",\"engineCapacity\":125}"
|
168
|
+
```
|
169
|
+
|
145
170
|
### Building instances
|
146
171
|
|
147
172
|
Instances are Plain Ol' Ruby Objects and the attributes are attached with getters and setters with their values assigned to the value return from their block at build time.
|
@@ -166,6 +191,14 @@ or by passing in a block:
|
|
166
191
|
result = FakerMaker[:item].build{ |i| i.name = 'Electric Sheep' }
|
167
192
|
```
|
168
193
|
|
194
|
+
this is particularly useful for overriding nested values, since all the getters and setters of the embedded objects are already constructed:
|
195
|
+
|
196
|
+
```ruby
|
197
|
+
result = FakerMaker[:basket].build do |b|
|
198
|
+
b.items.first.name = 'Neon Badger'
|
199
|
+
end
|
200
|
+
```
|
201
|
+
|
169
202
|
if you're crazy enough to want to do both styles during creation, the values in the block will be preserved, e.g.
|
170
203
|
|
171
204
|
```ruby
|
@@ -192,6 +225,42 @@ As another convenience, `FakerMaker` is also assigned to the variable `FM` to it
|
|
192
225
|
result = FM[:basket].build
|
193
226
|
```
|
194
227
|
|
228
|
+
### Omitting fields
|
229
|
+
|
230
|
+
Sometimes you want a field present, other times you don't. This is often the case when you want to skip fields which have null or empty values.
|
231
|
+
|
232
|
+
```ruby
|
233
|
+
FakerMaker.factory :user do
|
234
|
+
name {'Patsy Stone'}
|
235
|
+
email(omit: :nil) {'patsy@fabulous.co.uk'}
|
236
|
+
admin {false}
|
237
|
+
end
|
238
|
+
|
239
|
+
FM[:user].build.as_json
|
240
|
+
=> {:name=>"Patsy Stone", :email=>"patsy@fabulous.co.uk", :admin=>false}
|
241
|
+
|
242
|
+
FM[:user].build(email: nil).as_json
|
243
|
+
=> {:name=>"Patsy Stone", :admin=>false}
|
244
|
+
```
|
245
|
+
|
246
|
+
The `omit` modifier can take a single value or an array. If it is passed a value and the attribute equals this value, it will not be included in the output from `as_json` (which returns a Ruby Hash) or in `to_json` methods.
|
247
|
+
|
248
|
+
There are three special modifiers:
|
249
|
+
|
250
|
+
* `:nil` (symbol) to omit output when the attribute is set to nil
|
251
|
+
* `:empty` to omit output when the value is an empty string, an empty array or an empty hash
|
252
|
+
* `:always` to never output this attibute.
|
253
|
+
|
254
|
+
These can be mixed with real values, e.g.
|
255
|
+
|
256
|
+
```ruby
|
257
|
+
FakerMaker.factory :user do
|
258
|
+
name {'Patsy Stone'}
|
259
|
+
email(omit: [:nil, :empty, 'test@foobar.com']) {'patsy@fabulous.co.uk'}
|
260
|
+
admin {false}
|
261
|
+
end
|
262
|
+
```
|
263
|
+
|
195
264
|
### Embedding factories
|
196
265
|
|
197
266
|
To use factories with factories, the following pattern is recommended:
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
data/faker_maker.gemspec
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Disable rubocop checks for the .gemspec
|
2
4
|
# I'll take the output from 'bundle gem new' to be authoritative
|
3
5
|
# rubocop:disable all
|
@@ -39,10 +41,10 @@ Gem::Specification.new do |spec|
|
|
39
41
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
40
42
|
spec.require_paths = ['lib']
|
41
43
|
|
42
|
-
spec.add_dependency 'activesupport', '>= 5.2', '<
|
44
|
+
spec.add_dependency 'activesupport', '>= 5.2', '< 7'
|
43
45
|
|
44
46
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
45
|
-
spec.add_development_dependency 'faker', '~> 1
|
47
|
+
spec.add_development_dependency 'faker', '~> 2.1'
|
46
48
|
spec.add_development_dependency 'pry', '~> 0.12'
|
47
49
|
spec.add_development_dependency 'rake', '~> 12.3'
|
48
50
|
spec.add_development_dependency 'rspec', '~> 3.8'
|
data/lib/faker_maker.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module FakerMaker
|
2
4
|
# Attributes describe the fields of classes
|
3
5
|
class Attribute
|
@@ -9,6 +11,7 @@ module FakerMaker
|
|
9
11
|
@block = block || proc { nil }
|
10
12
|
@cardinality = options[:has] || 1
|
11
13
|
@translation = options[:json]
|
14
|
+
@omit = *options[:omit]
|
12
15
|
@array = options[:array] == true
|
13
16
|
end
|
14
17
|
|
@@ -27,6 +30,17 @@ module FakerMaker
|
|
27
30
|
def translation?
|
28
31
|
!@translation.blank?
|
29
32
|
end
|
33
|
+
|
34
|
+
def omit?( value )
|
35
|
+
case value
|
36
|
+
when nil
|
37
|
+
@omit.include? :nil
|
38
|
+
when '', [], {}
|
39
|
+
@omit.include? :empty
|
40
|
+
else
|
41
|
+
@omit.include?( :always ) || @omit.include?( value )
|
42
|
+
end
|
43
|
+
end
|
30
44
|
|
31
45
|
private
|
32
46
|
|
@@ -35,7 +49,7 @@ module FakerMaker
|
|
35
49
|
end
|
36
50
|
|
37
51
|
def assert_valid_options( options )
|
38
|
-
options.assert_valid_keys :has, :array, :json
|
52
|
+
options.assert_valid_keys :has, :array, :json, :omit
|
39
53
|
end
|
40
54
|
end
|
41
55
|
end
|
data/lib/faker_maker/base.rb
CHANGED
data/lib/faker_maker/factory.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# rubocop:disable Metrics/ClassLength
|
2
4
|
module FakerMaker
|
3
5
|
# Factories construct instances of a fake
|
4
6
|
class Factory
|
5
|
-
attr_reader :name, :
|
7
|
+
attr_reader :name, :class_name, :parent
|
6
8
|
|
7
9
|
def initialize( name, options = {} )
|
8
10
|
assert_valid_options options
|
@@ -47,6 +49,10 @@ module FakerMaker
|
|
47
49
|
build.to_json
|
48
50
|
end
|
49
51
|
|
52
|
+
def as_json(*_args)
|
53
|
+
build.as_json
|
54
|
+
end
|
55
|
+
|
50
56
|
def parent?
|
51
57
|
!@parent.nil?
|
52
58
|
end
|
@@ -65,7 +71,16 @@ module FakerMaker
|
|
65
71
|
|
66
72
|
def attribute_names( collection = [] )
|
67
73
|
collection |= FakerMaker[parent].attribute_names( collection ) if parent?
|
68
|
-
collection | attributes.map( &:name )
|
74
|
+
collection | @attributes.map( &:name )
|
75
|
+
end
|
76
|
+
|
77
|
+
def attributes( collection = [] )
|
78
|
+
collection |= FakerMaker[parent].attributes( collection ) if parent?
|
79
|
+
collection | @attributes
|
80
|
+
end
|
81
|
+
|
82
|
+
def find_attribute( name = '' )
|
83
|
+
attributes.filter { |a| a.name == name }.first
|
69
84
|
end
|
70
85
|
|
71
86
|
protected
|
@@ -116,7 +131,9 @@ module FakerMaker
|
|
116
131
|
|
117
132
|
def attach_json_overrides_to_class
|
118
133
|
@klass.define_method :as_json do |options = {}|
|
119
|
-
super( options.merge( except: 'fm_factory' ) )
|
134
|
+
super( options.merge( except: 'fm_factory' ) )
|
135
|
+
.transform_keys { |key| @fm_factory.json_key_map[key] || key }
|
136
|
+
.filter { |key, value| !@fm_factory.find_attribute(key)&.omit?( value ) }
|
120
137
|
end
|
121
138
|
end
|
122
139
|
|
data/lib/faker_maker/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faker_maker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nigel Brookes-Thomas
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '5.2'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '7'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '5.2'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '7'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: bundler
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,14 +50,14 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '1
|
53
|
+
version: '2.1'
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: '1
|
60
|
+
version: '2.1'
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: pry
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|