rom_factory 0.1.4 → 0.2.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: c5ac450487482db00a4f6ba28454409e86441ac4
4
- data.tar.gz: 3aa5e4ee48c68be0afb9e5e3afc61d16295af506
3
+ metadata.gz: 4d7f88e94fe99eaadc2cbb839963787530887f7f
4
+ data.tar.gz: 0da62949cdf773cdd64a28668d743e0cfb6f9c85
5
5
  SHA512:
6
- metadata.gz: 29ef6d2648714d2c987d6c1944a46224a89287b650e9bbb6cad5564ad65741f4efce5ef7f67f0d79ea63e465976de8e42ca51ab44c154984277d5bbeab191ef8
7
- data.tar.gz: 71cbbf7ae86f88bfd4debbb6bc86c928a322060685a994a5f76cb32b3f66fa355a5711896cca593613caa2109b95c17ebebf27e78cd6a98d6172bb1dc55dacf9
6
+ metadata.gz: f46be1666a758535f5019b7143f2a62ca09e45bb68fe3d9d9df950c3579b8eb2e700f604430192e944f0fb390e8a90ada9662af95d467d7877b13062179a227f
7
+ data.tar.gz: f174b5ef4097aabbb85d2b070ba40913d0f6beccc3abb9b85498a61f9db9197cb2d189f81f027796de66c1812120d94cee18c2c8e4a140a30c3f786c5ee13138
data/README.md CHANGED
@@ -40,6 +40,7 @@ RomFactory::Config.configure do |config|
40
40
  config.container = container
41
41
  end
42
42
  ```
43
+
43
44
  ## Simple use case
44
45
 
45
46
  After configuration is done, you can define the factory as follows:
@@ -73,6 +74,25 @@ user = RomFactory::Builder.create(:user)
73
74
  user.created_at #=> 2016-08-27 18:17:08 -0500
74
75
  ```
75
76
 
77
+ ### Sequencing
78
+
79
+ If you want attributes to be unique each time you build a factory, you can use sequence to achieve that:
80
+ ```ruby
81
+ RomFactory::Builder.define do |b|
82
+ b.factory(relation: :users, name: :user) do |f|
83
+ f.first_name "Janis"
84
+ f.last_name "Miezitis"
85
+ f.sequence :email do |n|
86
+ "janjiss#{n}@gmail.com"
87
+ end
88
+ end
89
+ end
90
+ user = RomFactory::Builder.create(:user)
91
+ user.email #=> janjiss1@gmail.com
92
+ user2 = RomFactory::Builder.create(:user)
93
+ user2.email #=> janjiss2@gmail.com
94
+ ```
95
+
76
96
  ## License
77
97
 
78
98
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/lib/rom_factory.rb CHANGED
@@ -4,6 +4,10 @@ require "dry-container"
4
4
  require "rom_factory/version"
5
5
  require "rom_factory/config"
6
6
  require "rom_factory/builder"
7
+ require "rom_factory/factory"
8
+ require "rom_factory/attributes/callable"
9
+ require "rom_factory/attributes/regular"
10
+ require "rom_factory/attributes/sequence"
7
11
 
8
12
  module RomFactory
9
13
  # Your code goes here...
@@ -0,0 +1,13 @@
1
+ module RomFactory
2
+ module Attributes
3
+ class Callable
4
+ def initialize(block)
5
+ @block = block
6
+ end
7
+
8
+ def call
9
+ @block.call
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module RomFactory
2
+ module Attributes
3
+ class Regular
4
+ def initialize(value)
5
+ @value = value
6
+ end
7
+
8
+ def call
9
+ @value
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module RomFactory
2
+ module Attributes
3
+ class Sequence
4
+ def initialize(&block)
5
+ @count = 0
6
+ @block = block
7
+ end
8
+
9
+ def call
10
+ @block.call(@count += 1)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -7,7 +7,7 @@ module RomFactory
7
7
  end
8
8
 
9
9
  def self.define(&block)
10
- factory = new(&block)
10
+ factory = Factory.new(&block)
11
11
  raise ArgumentError, "Factory with key #{factory._name} already present" if container.key?(factory._name)
12
12
  container.register(factory._name, factory)
13
13
  end
@@ -17,47 +17,5 @@ module RomFactory
17
17
  factory = container.resolve(name)
18
18
  factory.create(attrs)
19
19
  end
20
-
21
- def initialize
22
- yield(self)
23
- end
24
-
25
- def factory(name:, relation:, &block)
26
- @_relation = RomFactory::Config.config.container.relations.fetch(relation)
27
- @_name = name
28
- @_schema = {}
29
- define_methods_from_relation
30
- yield(self)
31
- end
32
-
33
- def create(attrs)
34
- values = _schema.merge(attrs).map do |k, v|
35
- if v.respond_to?(:call)
36
- [k, v.call]
37
- else
38
- [k, v]
39
- end
40
- end
41
- record_id = _relation.insert(values.to_h)
42
- OpenStruct.new(_relation.where(id: record_id).one)
43
- end
44
-
45
- attr_reader :_name
46
-
47
- private
48
-
49
- attr_reader :_relation, :_schema
50
-
51
- def define_methods_from_relation
52
- _relation.attributes.each do |a|
53
- define_singleton_method a, Proc.new {|v = nil, &block|
54
- if block
55
- _schema[a] = block
56
- else
57
- _schema[a] = v
58
- end
59
- }
60
- end
61
- end
62
20
  end
63
21
  end
@@ -0,0 +1,62 @@
1
+ module RomFactory
2
+ class Factory
3
+ def initialize
4
+ yield(self)
5
+ end
6
+
7
+ def factory(name:, relation:, &block)
8
+ @_relation = RomFactory::Config.config.container.relations.fetch(relation)
9
+ @_name = name
10
+ @_schema = {}
11
+ yield(self)
12
+ end
13
+
14
+ def create(attrs)
15
+ values = _schema.merge(wrap_attributes_to_callable(attrs)).map {|k, v| [k, v.call]}
16
+ record_id = _relation.insert(values.to_h)
17
+ OpenStruct.new(values.to_h.merge(id: record_id))
18
+ end
19
+
20
+ def sequence(method_id, &block)
21
+ if _relation.attributes.include?(method_id)
22
+ define_sequence_method(method_id, block)
23
+ end
24
+ self.send(method_id)
25
+ end
26
+
27
+ attr_reader :_name
28
+
29
+ private
30
+
31
+ attr_reader :_relation, :_schema
32
+
33
+ def wrap_attributes_to_callable(attrs)
34
+ attrs.map {|k, v| [k, RomFactory::Attributes::Regular.new(v)]}.to_h
35
+ end
36
+
37
+ def method_missing(method_id, *arguments, &block)
38
+ if _relation.attributes.include?(method_id)
39
+ define_regular_method(method_id)
40
+ self.send(method_id, *arguments, &block)
41
+ else
42
+ super
43
+ end
44
+ end
45
+
46
+ def define_sequence_method(method_id, block)
47
+ self.define_singleton_method method_id, ->(){
48
+ _schema[method_id] = RomFactory::Attributes::Sequence.new(&block)
49
+ }
50
+ end
51
+
52
+ def define_regular_method(method_id)
53
+ define_singleton_method method_id, Proc.new {|v = nil, &block|
54
+ if block
55
+ _schema[method_id] = RomFactory::Attributes::Callable.new(block)
56
+ else
57
+ _schema[method_id] = RomFactory::Attributes::Regular.new(v)
58
+ end
59
+ }
60
+ end
61
+ end
62
+ end
@@ -1,3 +1,3 @@
1
1
  module RomFactory
2
- VERSION = "0.1.4"
2
+ VERSION = "0.2.0"
3
3
  end
data/rom_factory.gemspec CHANGED
@@ -9,9 +9,9 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Janis Miezitis"]
10
10
  spec.email = ["janjiss@gmail.com"]
11
11
 
12
- spec.summary = %q{ROM based Factory girl inspired builder library to make your specs awesome}
12
+ spec.summary = %q{ROM based builder library to make your specs awesome. DSL partially inspired by FactoryGirl.}
13
13
  spec.description = %q{}
14
- spec.homepage = ""
14
+ spec.homepage = "https://github.com/janjiss/rom_factory"
15
15
  spec.license = "MIT"
16
16
 
17
17
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
@@ -30,12 +30,12 @@ Gem::Specification.new do |spec|
30
30
  spec.add_dependency "dry-configurable", "~> 0.1"
31
31
  spec.add_dependency "dry-container", "~> 0.3"
32
32
 
33
- spec.add_development_dependency "bundler", "~> 1.13.1"
33
+ spec.add_development_dependency 'bundler', '~> 1.13'
34
34
  spec.add_development_dependency "rake", "~> 10.0"
35
35
  spec.add_development_dependency "rspec", "~> 3.0"
36
36
  spec.add_development_dependency "rom", "~> 2.0"
37
- spec.add_development_dependency "rom-repository", "~> 0.3.1"
38
- spec.add_development_dependency "rom-sql", "~> 0.8.0"
39
- spec.add_development_dependency "sqlite3", "~> 1.3.11"
40
- spec.add_development_dependency "pry"
37
+ spec.add_development_dependency "rom-repository", "~> 0.3"
38
+ spec.add_development_dependency "rom-sql", "~> 0.8"
39
+ spec.add_development_dependency "sqlite3", "~> 1.3"
40
+ spec.add_development_dependency "pry", "~> 0.10"
41
41
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rom_factory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janis Miezitis
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-17 00:00:00.000000000 Z
11
+ date: 2016-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-configurable
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.13.1
47
+ version: '1.13'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.13.1
54
+ version: '1.13'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -100,56 +100,56 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 0.3.1
103
+ version: '0.3'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 0.3.1
110
+ version: '0.3'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rom-sql
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 0.8.0
117
+ version: '0.8'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 0.8.0
124
+ version: '0.8'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: sqlite3
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 1.3.11
131
+ version: '1.3'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 1.3.11
138
+ version: '1.3'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: pry
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ">="
143
+ - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '0'
145
+ version: '0.10'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ">="
150
+ - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '0'
152
+ version: '0.10'
153
153
  description: ''
154
154
  email:
155
155
  - janjiss@gmail.com
@@ -168,11 +168,15 @@ files:
168
168
  - bin/console
169
169
  - bin/setup
170
170
  - lib/rom_factory.rb
171
+ - lib/rom_factory/attributes/callable.rb
172
+ - lib/rom_factory/attributes/regular.rb
173
+ - lib/rom_factory/attributes/sequence.rb
171
174
  - lib/rom_factory/builder.rb
172
175
  - lib/rom_factory/config.rb
176
+ - lib/rom_factory/factory.rb
173
177
  - lib/rom_factory/version.rb
174
178
  - rom_factory.gemspec
175
- homepage: ''
179
+ homepage: https://github.com/janjiss/rom_factory
176
180
  licenses:
177
181
  - MIT
178
182
  metadata:
@@ -196,5 +200,6 @@ rubyforge_project:
196
200
  rubygems_version: 2.5.1
197
201
  signing_key:
198
202
  specification_version: 4
199
- summary: ROM based Factory girl inspired builder library to make your specs awesome
203
+ summary: ROM based builder library to make your specs awesome. DSL partially inspired
204
+ by FactoryGirl.
200
205
  test_files: []