datamapper2 0.0.1

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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in dm2.gemspec
4
+ gemspec
@@ -0,0 +1,6 @@
1
+ guard 'rspec', :version => 2 do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/dm2/(.+)\.rb$}) { |m| puts "spec/unit/#{m[1]}_spec.rb"; "spec/unit/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
6
+
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "dm2/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "datamapper2"
7
+ s.version = Dm2::VERSION
8
+ s.authors = ["kurko"]
9
+ s.email = ["chavedomundo@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Implements the DataMapper pattern for you.}
12
+ s.description = %q{Implements the DataMapper pattern for you.}
13
+
14
+ s.rubyforge_project = "dm2"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_development_dependency "rspec"
22
+ s.add_development_dependency "guard"
23
+ end
@@ -0,0 +1,5 @@
1
+ require "dm2/version"
2
+
3
+ module Dm2
4
+ # Your code goes here...
5
+ end
@@ -0,0 +1,23 @@
1
+ module DataMapper
2
+ class Mapper
3
+ @@observed_attributes = []
4
+ @@attributes_values = {}
5
+
6
+ class << self
7
+ def attributes(*attributes)
8
+ @@observed_attributes = attributes
9
+ end
10
+
11
+ def unit_of_work(object, method, values)
12
+ @@attributes_values = unit_of_work_observer.observe(object, self, method, values)
13
+ end
14
+
15
+ def unit_of_work_observer
16
+ DataMapper::UnitOfWork::Observer
17
+ end
18
+
19
+ def observed_attributes; @@observed_attributes; end
20
+ def attributes_values; @@attributes_values; end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ module DataMapper::UnitOfWork
2
+ class Observer
3
+ class << self
4
+ def observe(object, mapper, method, values)
5
+
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,37 @@
1
+ class Object
2
+ def self.method_added name
3
+ return true unless has_mapper?
4
+ return if @__last_methods_added && @__last_methods_added.include?(name)
5
+ return if self.methods.include?(name) && name != :name
6
+ send :set_unit_of_work_observer, name
7
+ end
8
+
9
+ def self.set_unit_of_work_observer method_name
10
+ modified_method = :"modified_#{method_name}"
11
+ @__last_methods_added = [method_name, modified_method]
12
+
13
+ alias_method modified_method, method_name
14
+ define_value_method method_name
15
+
16
+ @__last_methods_added = nil
17
+ end
18
+
19
+ def self.has_mapper?
20
+ Module.const_defined?("#{self}Mapper")
21
+ rescue
22
+ false
23
+ end
24
+
25
+ def self.define_value_method method_name
26
+ modified_method = modified_method_name method_name
27
+ define_method method_name.to_s do |*args, &block|
28
+ returned = send modified_method, *args, &block
29
+ Kernel.const_get("#{self.class}Mapper").unit_of_work self, method_name, args
30
+ returned
31
+ end
32
+ end
33
+
34
+ def self.modified_method_name method_name
35
+ :"modified_#{method_name}"
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module Dm2
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,10 @@
1
+ require "rubygems"
2
+ require "bundler/setup"
3
+
4
+ Dir["lib/**/*.rb"].each { |f| require "./"+f }
5
+ Dir["spec/support/**/*.rb"].each { |f| require "./"+f }
6
+
7
+ RSpec.configure do |config|
8
+ config.filter_run wip: true
9
+ config.run_all_when_everything_filtered = true
10
+ end
@@ -0,0 +1,45 @@
1
+ require "spec_helper"
2
+
3
+ describe DataMapper::Mapper do
4
+
5
+ class Mapper < DataMapper::Mapper
6
+ end
7
+
8
+ subject { Mapper }
9
+
10
+ before do
11
+
12
+ end
13
+
14
+ describe "#attributes" do
15
+ it "should define attributes to map" do
16
+ expect { subject.attributes(:name, :age) }
17
+ .to change { subject.observed_attributes }
18
+ .from([])
19
+ .to([:name, :age])
20
+ end
21
+ end
22
+
23
+ describe "#unit_of_work" do
24
+ class DummyMapperMapper < DataMapper::Mapper; end
25
+ class DummyMapper
26
+ attr_accessor :age
27
+ end
28
+
29
+ before do
30
+ @observer = double("Observer")
31
+ @dummy = DummyMapper.new
32
+ @dummy.age = 100
33
+ DummyMapperMapper.stub(:unit_of_work_observer).and_return(@observer)
34
+ end
35
+
36
+ it "transmits the message to UnitOfWork::Observer" do
37
+ @observer.should_receive(:observe)
38
+ .with(anything, DummyMapperMapper, an_instance_of(Symbol), an_instance_of(Array))
39
+ .and_return(@observer)
40
+
41
+ DummyMapperMapper.unit_of_work(@dummy, :a_method, [])
42
+ DummyMapperMapper.attributes_values.should == @observer
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,110 @@
1
+ require "spec_helper"
2
+
3
+ describe "Observer definition" do
4
+
5
+ class Person; end
6
+ class PersonMapper; def unit_of_work; end; end
7
+ class Account; end
8
+ class DoubleMapper; def unit_of_work; end; end
9
+
10
+ describe "objects without a unit of work observer" do
11
+ context "mapper observer is not set" do
12
+ before do
13
+ Object.should_not_receive(:set_unit_of_work_observer)
14
+ end
15
+
16
+ it "when a method is added" do
17
+ class Account; def new_method; end; end
18
+ end
19
+
20
+ it "when an attr_accessor is set" do
21
+ class Account; attr_accessor :attr_accessor_method; end
22
+ end
23
+
24
+ it "when an attr_reader is set" do
25
+ class Account; attr_reader :attr_reader_method; end
26
+ end
27
+
28
+ it "when an attr_write is set" do
29
+ class Account; attr_writer :attr_writer_method; end
30
+ end
31
+ end
32
+ end
33
+
34
+ describe "objects with a unit of work observer" do
35
+ context "mapper observer is set" do
36
+ it "when a method is added" do
37
+ Object.should_receive(:set_unit_of_work_observer).once
38
+ class Person; def new_method; end; end
39
+ end
40
+
41
+ it "when an attr_accessor is set" do
42
+ Object.should_receive(:set_unit_of_work_observer).exactly(4).times
43
+ class Person; attr_accessor :attr_accessor_method, :second_attr_acessor_method; end
44
+ end
45
+
46
+ it "when an attr_reader is set" do
47
+ Object.should_receive(:set_unit_of_work_observer).once
48
+ class Person; attr_writer :attr_writer_method; end
49
+ end
50
+
51
+ it "when an attr_write is set" do
52
+ Object.should_receive(:set_unit_of_work_observer).once
53
+ class Person; attr_reader :attr_reader_method; end
54
+ end
55
+ end
56
+ end
57
+
58
+ describe "#set_unit_of_work_observer" do
59
+ it "sets an after filter for a pre-existent object" do
60
+ class Person; def has_after_filter; end; end
61
+ person = Person.new
62
+ PersonMapper.should_receive(:unit_of_work).with(person, :has_after_filter, []).once
63
+ person.has_after_filter
64
+ end
65
+
66
+ it "sets an after filter for a new object" do
67
+ class Double; def has_after_filter; end; end
68
+ a_double = Double.new
69
+ DoubleMapper.should_receive(:unit_of_work).with(a_double, :has_after_filter, []).once
70
+ a_double.has_after_filter
71
+ end
72
+ end
73
+
74
+ describe "unit of work observer" do
75
+ class UoWObserverPersonMapper
76
+ @@last_call = []
77
+ def self.unit_of_work(object, property, args)
78
+ @@last_call << [object, property, args]
79
+ end
80
+ def self.last_call; @@last_call; end
81
+ end
82
+
83
+ class UoWObserverPerson
84
+ attr_accessor :first_name
85
+ def initialize; end
86
+ def whatever;end
87
+ end
88
+
89
+ it "should register each call sepparatelly" do
90
+ person = UoWObserverPerson.new
91
+ UoWObserverPersonMapper.last_call.should include [person, :initialize, []]
92
+ person.first_name = "John Doe"
93
+ UoWObserverPersonMapper.last_call.should include [person, :first_name=, ["John Doe"]]
94
+ person.whatever
95
+ UoWObserverPersonMapper.last_call.should include [person, :whatever, []]
96
+ UoWObserverPersonMapper.last_call.last[0].first_name.should == "John Doe"
97
+ end
98
+ end
99
+
100
+ describe "#has_mapper?" do
101
+ it "should return true for Person" do
102
+ Person.has_mapper?.should == true
103
+ end
104
+
105
+ it "should return false for Account" do
106
+ Account.has_mapper?.should == false
107
+ end
108
+ end
109
+
110
+ end
@@ -0,0 +1,12 @@
1
+ require "spec_helper"
2
+
3
+ describe DataMapper::UnitOfWork::Observer do
4
+ subject { DataMapper::UnitOfWork::Observer }
5
+
6
+ class DummyDomainObject; end
7
+
8
+ it "saves" do
9
+ subject.observe(DummyDomainObject.new, Class, "age", [100])
10
+ end
11
+
12
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: datamapper2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - kurko
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70178025149380 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70178025149380
25
+ - !ruby/object:Gem::Dependency
26
+ name: guard
27
+ requirement: &70178025147800 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70178025147800
36
+ description: Implements the DataMapper pattern for you.
37
+ email:
38
+ - chavedomundo@gmail.com
39
+ executables: []
40
+ extensions: []
41
+ extra_rdoc_files: []
42
+ files:
43
+ - .gitignore
44
+ - .rspec
45
+ - Gemfile
46
+ - Guardfile
47
+ - Rakefile
48
+ - dm2.gemspec
49
+ - lib/dm2.rb
50
+ - lib/dm2/mapper.rb
51
+ - lib/dm2/unit_of_work/observer.rb
52
+ - lib/dm2/unit_of_work/observer_definition.rb
53
+ - lib/dm2/version.rb
54
+ - spec/spec_helper.rb
55
+ - spec/unit/mapper_spec.rb
56
+ - spec/unit/unit_of_work/observer_definition_spec.rb
57
+ - spec/unit/unit_of_work/observer_spec.rb
58
+ homepage: ''
59
+ licenses: []
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubyforge_project: dm2
78
+ rubygems_version: 1.8.11
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: Implements the DataMapper pattern for you.
82
+ test_files:
83
+ - spec/spec_helper.rb
84
+ - spec/unit/mapper_spec.rb
85
+ - spec/unit/unit_of_work/observer_definition_spec.rb
86
+ - spec/unit/unit_of_work/observer_spec.rb