minimapper-extras 0.0.1 → 0.0.2
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 +27 -1
- data/lib/minimapper/extras/version.rb +1 -1
- data/lib/minimapper/factory_girl.rb +51 -0
- data/minimapper-extras.gemspec +2 -0
- data/spec/minimapper/factory_girl_spec.rb +71 -0
- metadata +33 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0ad3696155f47065eb0f5378f2029eba9320aa5
|
4
|
+
data.tar.gz: b0cb60bb92ed7458ac6a8a19a67f731bd8de730c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bae580892e3dafc93ddaa787285345ba2ae3bac3fa4d402d9c91d101d7f934fbb9ce5c5c65751e1947f50338aa8477c4d304a35e608b1800aff6a5a6fe1e4cca
|
7
|
+
data.tar.gz: 6e8361ebff43f1a1fae9edd035096e163b93a3f4e847caba91ad83c7cda2513836726b2e1509f12dc157386f64640cf170fb9c6f4aa556d82f2029f19b457d20
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
# Minimapper::Extras
|
5
5
|
|
6
|
-
Extra tools for minimapper.
|
6
|
+
Extra tools for [minimapper](https://github.com/joakimk/minimapper).
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
@@ -23,6 +23,32 @@ Or install it yourself as:
|
|
23
23
|
|
24
24
|
For now, see the specs. TODO: Write docs.
|
25
25
|
|
26
|
+
## Custom FactoryGirl strategy
|
27
|
+
|
28
|
+
Add this to your spec_helper after loading FactoryGirl:
|
29
|
+
|
30
|
+
require "minimapper/factory_girl"
|
31
|
+
|
32
|
+
It changes the create strategy used by FactoryGirl to make it compatible with minimapper.
|
33
|
+
|
34
|
+
So far it only supports saving single entities and belongs_to associations.
|
35
|
+
|
36
|
+
It assumes you can access your mappers though something like "Repository.employees". You can override that by
|
37
|
+
changing CreateThroughRepositoryStrategy::Create#mapper_with_name.
|
38
|
+
|
39
|
+
It also assumes the model has accessors for related objects, we use the "minimapper/entity/belongs_to" to do this.
|
40
|
+
|
41
|
+
Example factory definition:
|
42
|
+
|
43
|
+
require "customer"
|
44
|
+
|
45
|
+
FactoryGirl.define do
|
46
|
+
factory :order do
|
47
|
+
customer { FactoryGirl.build(:customer) }
|
48
|
+
description "ref. 123"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
26
52
|
## Contributing
|
27
53
|
|
28
54
|
1. Fork it
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "attr_extras"
|
2
|
+
require "backports/1.9.1/kernel/public_send"
|
3
|
+
|
4
|
+
class CreateThroughRepositoryStrategy
|
5
|
+
def result(evaluation)
|
6
|
+
Create.new(evaluation.object).create
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
class Create
|
12
|
+
pattr_initialize :entity
|
13
|
+
|
14
|
+
def create
|
15
|
+
entity_class = entity.class
|
16
|
+
mapper_name = entity_class.name.underscore.pluralize
|
17
|
+
|
18
|
+
# Recursively creates all dependencies of this entity before
|
19
|
+
# going on to the the entity itself. This is here so that we can do
|
20
|
+
# "customer { FactoryGirl.build(:customer) }" in factories.
|
21
|
+
create_dependencies
|
22
|
+
|
23
|
+
if mapper_with_name(mapper_name).create(entity)
|
24
|
+
entity
|
25
|
+
else
|
26
|
+
errors = entity.errors.full_messages.join(", ")
|
27
|
+
raise "Can't create invalid record: #{errors}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Override this if you want to access the mappers some other way.
|
32
|
+
def mapper_with_name(name)
|
33
|
+
Repository.public_send(name)
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_dependencies
|
37
|
+
associated_entity_names.each do |name|
|
38
|
+
dependency_entity = self.class.new(entity.public_send(name)).create
|
39
|
+
entity.public_send("#{name}=", dependency_entity)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def associated_entity_names
|
44
|
+
entity.class.column_names.find_all { |name| name[-3..-1] == '_id' }.map do |belongs_to_id|
|
45
|
+
belongs_to_id[0...-3]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
FactoryGirl.register_strategy(:create, CreateThroughRepositoryStrategy)
|
data/minimapper-extras.gemspec
CHANGED
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
20
|
spec.add_dependency "minimapper"
|
21
|
+
spec.add_dependency "attr_extras"
|
22
|
+
spec.add_dependency "backports"
|
21
23
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
24
|
spec.add_development_dependency "rake"
|
23
25
|
spec.add_development_dependency "rspec"
|
@@ -0,0 +1,71 @@
|
|
1
|
+
FactoryGirl = Class.new do
|
2
|
+
def self.register_strategy(name, klass)
|
3
|
+
end
|
4
|
+
end
|
5
|
+
|
6
|
+
Repository = Class.new
|
7
|
+
|
8
|
+
require "minimapper/factory_girl"
|
9
|
+
require "minimapper/entity"
|
10
|
+
require "minimapper/entity/belongs_to"
|
11
|
+
|
12
|
+
class Payment
|
13
|
+
include Minimapper::Entity
|
14
|
+
|
15
|
+
attribute :amount
|
16
|
+
end
|
17
|
+
|
18
|
+
class Order
|
19
|
+
include Minimapper::Entity
|
20
|
+
|
21
|
+
attribute :name
|
22
|
+
belongs_to :payment
|
23
|
+
end
|
24
|
+
|
25
|
+
class Location
|
26
|
+
include Minimapper::Entity
|
27
|
+
|
28
|
+
attribute :name
|
29
|
+
end
|
30
|
+
|
31
|
+
describe CreateThroughRepositoryStrategy do
|
32
|
+
let(:entity) { Location.new }
|
33
|
+
let(:location_mapper) { mock }
|
34
|
+
let(:evaluation) { mock(:object => entity) }
|
35
|
+
|
36
|
+
before do
|
37
|
+
Repository.stub(:locations).and_return(location_mapper)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "can create a single entity though a factory class" do
|
41
|
+
location_mapper.should_receive(:create).with(entity).and_return(true)
|
42
|
+
CreateThroughRepositoryStrategy.new.result(evaluation)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "raises if the entity isn't valid after create" do
|
46
|
+
entity.errors.add :base, "some error"
|
47
|
+
location_mapper.stub(:create => false)
|
48
|
+
lambda {
|
49
|
+
CreateThroughRepositoryStrategy.new.result(evaluation)
|
50
|
+
}.should raise_error("Can't create invalid record: some error")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe CreateThroughRepositoryStrategy, "when there are belongs_to associations" do
|
55
|
+
let(:payment_mapper) { mock }
|
56
|
+
let(:order_mapper) { mock }
|
57
|
+
|
58
|
+
before do
|
59
|
+
Repository.stub(:orders => order_mapper)
|
60
|
+
Repository.stub(:payments => payment_mapper)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "creates dependencies first" do
|
64
|
+
payment = Payment.new
|
65
|
+
order = Order.new(:payment => payment)
|
66
|
+
payment_mapper.should_receive(:create).ordered.with(payment).and_return(true)
|
67
|
+
order_mapper.should_receive(:create).ordered.with(order).and_return(true)
|
68
|
+
evaluation = mock(:object => order)
|
69
|
+
CreateThroughRepositoryStrategy.new.result(evaluation)
|
70
|
+
end
|
71
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minimapper-extras
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joakim Kolsjö
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: minimapper
|
@@ -25,6 +25,34 @@ dependencies:
|
|
25
25
|
- - '>='
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: attr_extras
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: backports
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
28
56
|
- !ruby/object:Gem::Dependency
|
29
57
|
name: bundler
|
30
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,11 +128,13 @@ files:
|
|
100
128
|
- lib/minimapper/entity/serialized_association.rb
|
101
129
|
- lib/minimapper/extras.rb
|
102
130
|
- lib/minimapper/extras/version.rb
|
131
|
+
- lib/minimapper/factory_girl.rb
|
103
132
|
- minimapper-extras.gemspec
|
104
133
|
- script/ci
|
105
134
|
- script/turbux_rspec
|
106
135
|
- spec/minimapper/entity/belongs_to_spec.rb
|
107
136
|
- spec/minimapper/entity/serialized_association_spec.rb
|
137
|
+
- spec/minimapper/factory_girl_spec.rb
|
108
138
|
- spec/spec_helper.rb
|
109
139
|
homepage: ''
|
110
140
|
licenses:
|
@@ -133,4 +163,5 @@ summary: Extras for Minimapper.
|
|
133
163
|
test_files:
|
134
164
|
- spec/minimapper/entity/belongs_to_spec.rb
|
135
165
|
- spec/minimapper/entity/serialized_association_spec.rb
|
166
|
+
- spec/minimapper/factory_girl_spec.rb
|
136
167
|
- spec/spec_helper.rb
|