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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 42df3b244862e78e980ea66d96b31a8bd2d8c6ce
4
- data.tar.gz: efe6cba3602a1253e5f775b22bb162050362f90a
3
+ metadata.gz: e0ad3696155f47065eb0f5378f2029eba9320aa5
4
+ data.tar.gz: b0cb60bb92ed7458ac6a8a19a67f731bd8de730c
5
5
  SHA512:
6
- metadata.gz: a58cb2feb537a00740dbe89c1f84ee55b7a116cdda136f5fe29e2fccad7d2c4f73462400bba4044f44eb2b7bc46810c81d93122c2220a6dc3b7402f36c29537a
7
- data.tar.gz: b88fa0ed5eacf7b8e89e638d96d91ca55003574cf34bcd7834ca89e2c8f8679335ac84d02174b58f0d2db4279a4e730bb525839b884069a19c22a35af4f1006d
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
@@ -1,5 +1,5 @@
1
1
  module Minimapper
2
2
  module Extras
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
@@ -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)
@@ -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.1
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-22 00:00:00.000000000 Z
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