yogo-datamapper 0.3.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.
- data/.document +5 -0
- data/.gitignore +24 -0
- data/Gemfile +26 -0
- data/Gemfile.lock +137 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +57 -0
- data/VERSION +1 -0
- data/features/step_definitions/yogo-datamapper_steps.rb +0 -0
- data/features/support/env.rb +1 -0
- data/features/yogo-datamapper.feature +9 -0
- data/lib/yogo/datamapper/model/common/properties.rb +15 -0
- data/lib/yogo/datamapper/model/configuration.rb +31 -0
- data/lib/yogo/datamapper/model/operations.rb +11 -0
- data/lib/yogo/datamapper/model/operations/add.rb +31 -0
- data/lib/yogo/datamapper/model/operations/clear.rb +30 -0
- data/lib/yogo/datamapper/model/stored/configuration.rb +25 -0
- data/lib/yogo/datamapper/repository_manager.rb +30 -0
- data/lib/yogo/datamapper/repository_manager/model.rb +40 -0
- data/lib/yogo/datamapper/repository_manager/resource.rb +91 -0
- data/spec/spec_helper.rb +2 -0
- data/yogo-datamapper.gemspec +89 -0
- metadata +209 -0
data/.document
ADDED
data/.gitignore
ADDED
data/Gemfile
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
source :rubygems
|
|
2
|
+
gemspec
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# Development and Test Dependencies
|
|
6
|
+
#
|
|
7
|
+
group :development, :test do
|
|
8
|
+
gem "rake"
|
|
9
|
+
gem "jeweler"
|
|
10
|
+
gem "yard"
|
|
11
|
+
gem "yardstick"
|
|
12
|
+
# Testing gems
|
|
13
|
+
gem "rspec"
|
|
14
|
+
gem "rack-test"
|
|
15
|
+
gem "cucumber"
|
|
16
|
+
|
|
17
|
+
platforms(:mri_19) do
|
|
18
|
+
gem "ruby-debug19", :require => "ruby-debug"
|
|
19
|
+
gem "rack-debug19", :require => "rack-debug"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
platforms(:mri_18) do
|
|
23
|
+
gem "ruby-debug"
|
|
24
|
+
gem "rack-debug"
|
|
25
|
+
end
|
|
26
|
+
end
|
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
yogo-datamapper (0.3.0)
|
|
5
|
+
dm-aggregates (~> 1.0.2)
|
|
6
|
+
dm-core (~> 1.0.2)
|
|
7
|
+
dm-is-remixable
|
|
8
|
+
dm-migrations
|
|
9
|
+
dm-timestamps
|
|
10
|
+
dm-types (~> 1.0.2)
|
|
11
|
+
dm-validations
|
|
12
|
+
yogo-operation
|
|
13
|
+
yogo-support
|
|
14
|
+
|
|
15
|
+
GEM
|
|
16
|
+
remote: http://rubygems.org/
|
|
17
|
+
specs:
|
|
18
|
+
addressable (2.2.2)
|
|
19
|
+
archive-tar-minitar (0.5.2)
|
|
20
|
+
builder (2.1.2)
|
|
21
|
+
columnize (0.3.1)
|
|
22
|
+
cucumber (0.9.3)
|
|
23
|
+
builder (~> 2.1.2)
|
|
24
|
+
diff-lcs (~> 1.1.2)
|
|
25
|
+
gherkin (~> 2.2.9)
|
|
26
|
+
json (~> 1.4.6)
|
|
27
|
+
term-ansicolor (~> 1.0.5)
|
|
28
|
+
dataflow (0.3.1)
|
|
29
|
+
diff-lcs (1.1.2)
|
|
30
|
+
dm-aggregates (1.0.2)
|
|
31
|
+
dm-core (~> 1.0.2)
|
|
32
|
+
dm-core (1.0.2)
|
|
33
|
+
addressable (~> 2.2)
|
|
34
|
+
extlib (~> 0.9.15)
|
|
35
|
+
dm-is-remixable (1.0.2)
|
|
36
|
+
dm-core (~> 1.0.2)
|
|
37
|
+
dm-migrations (1.0.2)
|
|
38
|
+
dm-core (~> 1.0.2)
|
|
39
|
+
dm-timestamps (1.0.2)
|
|
40
|
+
dm-core (~> 1.0.2)
|
|
41
|
+
dm-types (1.0.2)
|
|
42
|
+
dm-core (~> 1.0.2)
|
|
43
|
+
fastercsv (~> 1.5.3)
|
|
44
|
+
json_pure (~> 1.4)
|
|
45
|
+
stringex (~> 1.1.0)
|
|
46
|
+
uuidtools (~> 2.1.1)
|
|
47
|
+
dm-validations (1.0.2)
|
|
48
|
+
dm-core (~> 1.0.2)
|
|
49
|
+
extlib (0.9.15)
|
|
50
|
+
fastercsv (1.5.3)
|
|
51
|
+
gemcutter (0.6.1)
|
|
52
|
+
gherkin (2.2.9)
|
|
53
|
+
json (~> 1.4.6)
|
|
54
|
+
term-ansicolor (~> 1.0.5)
|
|
55
|
+
git (1.2.5)
|
|
56
|
+
jeweler (1.4.0)
|
|
57
|
+
gemcutter (>= 0.1.0)
|
|
58
|
+
git (>= 1.2.5)
|
|
59
|
+
rubyforge (>= 2.0.0)
|
|
60
|
+
json (1.4.6)
|
|
61
|
+
json_pure (1.4.6)
|
|
62
|
+
linecache (0.43)
|
|
63
|
+
linecache19 (0.5.11)
|
|
64
|
+
ruby_core_source (>= 0.1.4)
|
|
65
|
+
rack (1.2.1)
|
|
66
|
+
rack-debug (1.4.2)
|
|
67
|
+
rack (>= 1.0)
|
|
68
|
+
ruby-debug (>= 0.10)
|
|
69
|
+
rack-debug19 (1.4.2)
|
|
70
|
+
rack (>= 1.0)
|
|
71
|
+
ruby-debug19 (>= 0.11.6)
|
|
72
|
+
rack-test (0.5.6)
|
|
73
|
+
rack (>= 1.0)
|
|
74
|
+
rake (0.8.7)
|
|
75
|
+
rspec (2.0.1)
|
|
76
|
+
rspec-core (~> 2.0.1)
|
|
77
|
+
rspec-expectations (~> 2.0.1)
|
|
78
|
+
rspec-mocks (~> 2.0.1)
|
|
79
|
+
rspec-core (2.0.1)
|
|
80
|
+
rspec-expectations (2.0.1)
|
|
81
|
+
diff-lcs (>= 1.1.2)
|
|
82
|
+
rspec-mocks (2.0.1)
|
|
83
|
+
rspec-core (~> 2.0.1)
|
|
84
|
+
rspec-expectations (~> 2.0.1)
|
|
85
|
+
ruby-debug (0.10.3)
|
|
86
|
+
columnize (>= 0.1)
|
|
87
|
+
ruby-debug-base (~> 0.10.3.0)
|
|
88
|
+
ruby-debug-base (0.10.3)
|
|
89
|
+
linecache (>= 0.3)
|
|
90
|
+
ruby-debug-base19 (0.11.24)
|
|
91
|
+
columnize (>= 0.3.1)
|
|
92
|
+
linecache19 (>= 0.5.11)
|
|
93
|
+
ruby_core_source (>= 0.1.4)
|
|
94
|
+
ruby-debug19 (0.11.6)
|
|
95
|
+
columnize (>= 0.3.1)
|
|
96
|
+
linecache19 (>= 0.5.11)
|
|
97
|
+
ruby-debug-base19 (>= 0.11.19)
|
|
98
|
+
ruby_core_source (0.1.4)
|
|
99
|
+
archive-tar-minitar (>= 0.5.2)
|
|
100
|
+
rubyforge (2.0.4)
|
|
101
|
+
json_pure (>= 1.1.7)
|
|
102
|
+
stringex (1.1.0)
|
|
103
|
+
term-ansicolor (1.0.5)
|
|
104
|
+
uuidtools (2.1.1)
|
|
105
|
+
yard (0.6.1)
|
|
106
|
+
yardstick (0.1.0)
|
|
107
|
+
yard (~> 0.2)
|
|
108
|
+
yogo-operation (0.1.2)
|
|
109
|
+
dataflow
|
|
110
|
+
yogo-support (~> 0.1.0)
|
|
111
|
+
yogo-support (0.1.1)
|
|
112
|
+
|
|
113
|
+
PLATFORMS
|
|
114
|
+
ruby
|
|
115
|
+
|
|
116
|
+
DEPENDENCIES
|
|
117
|
+
cucumber
|
|
118
|
+
dm-aggregates (~> 1.0.2)
|
|
119
|
+
dm-core (~> 1.0.2)
|
|
120
|
+
dm-is-remixable
|
|
121
|
+
dm-migrations
|
|
122
|
+
dm-timestamps
|
|
123
|
+
dm-types (~> 1.0.2)
|
|
124
|
+
dm-validations
|
|
125
|
+
jeweler
|
|
126
|
+
rack-debug
|
|
127
|
+
rack-debug19
|
|
128
|
+
rack-test
|
|
129
|
+
rake
|
|
130
|
+
rspec
|
|
131
|
+
ruby-debug
|
|
132
|
+
ruby-debug19
|
|
133
|
+
yard
|
|
134
|
+
yardstick
|
|
135
|
+
yogo-datamapper!
|
|
136
|
+
yogo-operation
|
|
137
|
+
yogo-support
|
data/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright (c) 2010 Ryan Heimbuch, Montana State University
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
= yogo-datamapper
|
|
2
|
+
|
|
3
|
+
Description goes here.
|
|
4
|
+
|
|
5
|
+
== Note on Patches/Pull Requests
|
|
6
|
+
|
|
7
|
+
* Fork the project.
|
|
8
|
+
* Make your feature addition or bug fix.
|
|
9
|
+
* Add tests for it. This is important so I don't break it in a
|
|
10
|
+
future version unintentionally.
|
|
11
|
+
* Commit, do not mess with rakefile, version, or history.
|
|
12
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
|
13
|
+
* Send me a pull request. Bonus points for topic branches.
|
|
14
|
+
|
|
15
|
+
== Copyright
|
|
16
|
+
|
|
17
|
+
Copyright (c) 2010 Ryan Heimbuch, Montana State University. See LICENSE for details.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
begin
|
|
2
|
+
require 'bundler'
|
|
3
|
+
Bundler.setup
|
|
4
|
+
rescue LoadError
|
|
5
|
+
puts "Bundler is not intalled. Install with: gem install bundler"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
require 'jeweler'
|
|
9
|
+
Jeweler::Tasks.new do |gem|
|
|
10
|
+
gem.name = %q{yogo-datamapper}
|
|
11
|
+
gem.authors = ["Ryan Heimbuch"]
|
|
12
|
+
gem.description = %q{Yogo extensions to DataMapper}
|
|
13
|
+
gem.email = %q{rheimbuch@gmail.com}
|
|
14
|
+
gem.homepage = %q{http://github.com/yogo/yogo-datamapper}
|
|
15
|
+
gem.summary = %q{Yogo extensions to DataMapper}
|
|
16
|
+
gem.add_dependency( %q<dm-core>, "~> 1.0.2")
|
|
17
|
+
gem.add_dependency( %q<dm-aggregates>, "~> 1.0.2")
|
|
18
|
+
gem.add_dependency( %q<dm-types>, "~> 1.0.2")
|
|
19
|
+
gem.add_dependency( %q<dm-migrations>, ">= 0" )
|
|
20
|
+
gem.add_dependency( %q<dm-validations>, ">= 0" )
|
|
21
|
+
gem.add_dependency( %q<dm-timestamps>, ">= 0" )
|
|
22
|
+
gem.add_dependency( %q<dm-is-remixable>, ">= 0" )
|
|
23
|
+
gem.add_dependency( %q<yogo-support>, ">= 0" )
|
|
24
|
+
gem.add_dependency( %q<yogo-operation>, ">= 0" )
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
begin
|
|
28
|
+
require 'rspec/core/rake_task'
|
|
29
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
30
|
+
|
|
31
|
+
desc 'Run all examples using rcov'
|
|
32
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
|
33
|
+
spec.rcov = true
|
|
34
|
+
spec.rcov_opts = %[-Ilib -Ispec --exclude "mocks,expectations,gems/*,spec/resources,spec/lib,spec/spec_helper.rb,db/*,/Library/Ruby/*,config/*"]
|
|
35
|
+
spec.rcov_opts << %[--no-html --aggregate coverage.data]
|
|
36
|
+
end
|
|
37
|
+
rescue LoadError
|
|
38
|
+
puts "RSpec not installed. Install with: bundle install"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
begin
|
|
42
|
+
require 'cucumber/rake/task'
|
|
43
|
+
Cucumber::Rake::Task.new(:features)
|
|
44
|
+
rescue LoadError
|
|
45
|
+
task :features do
|
|
46
|
+
abort "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
begin
|
|
51
|
+
require 'yard'
|
|
52
|
+
YARD::Rake::YardocTask.new
|
|
53
|
+
rescue LoadError
|
|
54
|
+
task :yardoc do
|
|
55
|
+
abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
|
56
|
+
end
|
|
57
|
+
end
|
data/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.3.0
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require 'yogo/datamapper/model/operations/add'
|
|
2
|
+
require 'dm-types/uuid'
|
|
3
|
+
|
|
4
|
+
module Yogo
|
|
5
|
+
module DataMapper
|
|
6
|
+
module Model
|
|
7
|
+
module Common
|
|
8
|
+
module Properties
|
|
9
|
+
UUIDKey = Operations::Add::Property.partial(X, :id, ::DataMapper::Property::UUID, {:key => true, :default => lambda{|*args| UUIDTools::UUID.timestamp_create}})
|
|
10
|
+
|
|
11
|
+
end # Properties
|
|
12
|
+
end # Common
|
|
13
|
+
end # Model
|
|
14
|
+
end # DataMapper
|
|
15
|
+
end # Yogo
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'yogo/datamapper/model/operations/clear'
|
|
2
|
+
require 'yogo/datamapper/model/operations/add'
|
|
3
|
+
|
|
4
|
+
module Yogo
|
|
5
|
+
module DataMapper
|
|
6
|
+
module Model
|
|
7
|
+
module Configuration
|
|
8
|
+
|
|
9
|
+
def operation_definitions
|
|
10
|
+
@_operation_definitions ||= []
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def operation(op_name, *args)
|
|
14
|
+
op_def = [op_name.to_s, args].flatten
|
|
15
|
+
operation_definitions << op_def unless operation_definitions.include?(op_def)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def to_proc
|
|
19
|
+
ops = operation_definitions.map{|op_def| Operations[op_def.first] }
|
|
20
|
+
partial_ops = []
|
|
21
|
+
ops.each_with_index do |op, i|
|
|
22
|
+
next unless op
|
|
23
|
+
partial_ops[i] = op.partial(X, *operation_definitions[i][1..-1])
|
|
24
|
+
end
|
|
25
|
+
partial_ops.compact!
|
|
26
|
+
partial_ops.reduce{|composed, partial_op| composed * partial_op}
|
|
27
|
+
end
|
|
28
|
+
end # Configuration
|
|
29
|
+
end # Model
|
|
30
|
+
end # DataMapper
|
|
31
|
+
end # Yogo
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'yogo/operation'
|
|
2
|
+
require 'yogo/datamapper/model/operations'
|
|
3
|
+
|
|
4
|
+
module Yogo
|
|
5
|
+
module DataMapper
|
|
6
|
+
module Model
|
|
7
|
+
Operations['add/property'] = Op.on(::DataMapper::Model) do |model, name, type, options|
|
|
8
|
+
type ||= "String"
|
|
9
|
+
options ||= {}
|
|
10
|
+
|
|
11
|
+
type = ::DataMapper::Property.find_class(type.to_s)
|
|
12
|
+
|
|
13
|
+
model.property(name, type, options)
|
|
14
|
+
model
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
Operations['add/relationship'] = Op.on(::DataMapper::Model) do |model, method, *args|
|
|
18
|
+
model.send(method, *args)
|
|
19
|
+
model
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
Operations['add/has_relationship'] = Operations['add/relationship'].partial(X, :has, X, X, X)
|
|
23
|
+
|
|
24
|
+
Operations['add/has_n'] = Operations['add/has_relationship'].partial(X, Infinity, X, X)
|
|
25
|
+
|
|
26
|
+
Operations['add/has_1'] = Operations['add/has_relationship'].partial(X, 1, X, X)
|
|
27
|
+
|
|
28
|
+
Operations['add/belongs_to'] = Operations['add/relationship'].partial(X, :belongs_to, X, X)
|
|
29
|
+
end # Model
|
|
30
|
+
end # DataMapper
|
|
31
|
+
end # Yogo
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'yogo/operation'
|
|
2
|
+
require 'yogo/datamapper/model/operations'
|
|
3
|
+
|
|
4
|
+
module Yogo
|
|
5
|
+
module DataMapper
|
|
6
|
+
module Model
|
|
7
|
+
|
|
8
|
+
Operations['clear/properties'] = Op.on(::DataMapper::Model) do |model|
|
|
9
|
+
model.properties.clear
|
|
10
|
+
model.properties.instance_variable_get(:@properties).clear #clear out the name index
|
|
11
|
+
model
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
Operations['clear/relationships'] = Op.on(::DataMapper::Model) do |model|
|
|
15
|
+
model.relationships.clear
|
|
16
|
+
model
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
Operations['clear/validators'] = Op.on(::DataMapper::Model) do |model|
|
|
20
|
+
model.validators.clear!
|
|
21
|
+
model
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
Operations['clear/all'] = Operations['clear/properties'] *
|
|
25
|
+
Operations['clear/relationships'] *
|
|
26
|
+
Operations['clear/validators']
|
|
27
|
+
|
|
28
|
+
end # Model
|
|
29
|
+
end # DataMapper
|
|
30
|
+
end # Yogo
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'yogo/configuration'
|
|
2
|
+
require 'yogo/datamapper/model/configuration'
|
|
3
|
+
require 'yogo/datamapper/model/common/properties'
|
|
4
|
+
|
|
5
|
+
require 'dm-types/uuid'
|
|
6
|
+
require 'dm-types/yaml'
|
|
7
|
+
|
|
8
|
+
module Yogo
|
|
9
|
+
module DataMapper
|
|
10
|
+
module Model
|
|
11
|
+
module Stored
|
|
12
|
+
module Configuration
|
|
13
|
+
include ::DataMapper::Resource
|
|
14
|
+
include Dynamic::Configuration
|
|
15
|
+
|
|
16
|
+
is :remixable
|
|
17
|
+
|
|
18
|
+
Common::Properties::UUIDKey[self]
|
|
19
|
+
|
|
20
|
+
property :operation_definitions, Yaml, :default => lambda {|*args| []}
|
|
21
|
+
end # Configuration
|
|
22
|
+
end # Stored
|
|
23
|
+
end # Model
|
|
24
|
+
end # DataMapper
|
|
25
|
+
end # Yogo
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'yogo/datamapper/repository_manager/model'
|
|
2
|
+
require 'yogo/datamapper/repository_manager/resource'
|
|
3
|
+
|
|
4
|
+
module Yogo
|
|
5
|
+
module DataMapper
|
|
6
|
+
module RepositoryManager
|
|
7
|
+
def self.included(base)
|
|
8
|
+
base.class_eval do
|
|
9
|
+
extend(RepositoryManager::Model)
|
|
10
|
+
include(RepositoryManager::Resource)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end # RepositoryManager
|
|
14
|
+
end # DataMapper
|
|
15
|
+
end # Yogo
|
|
16
|
+
|
|
17
|
+
module DataMapper
|
|
18
|
+
module Is
|
|
19
|
+
module RepositoryManager
|
|
20
|
+
def is_repository_manager
|
|
21
|
+
include(Yogo::DataMapper::RepositoryManager)
|
|
22
|
+
end
|
|
23
|
+
end # RepositoryManager
|
|
24
|
+
end # Is
|
|
25
|
+
|
|
26
|
+
if const_defined?("Model")
|
|
27
|
+
Model.append_extensions(Is::RepositoryManager)
|
|
28
|
+
end
|
|
29
|
+
end # DataMapper
|
|
30
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Yogo
|
|
2
|
+
module DataMapper
|
|
3
|
+
module RepositoryManager
|
|
4
|
+
module Model
|
|
5
|
+
# Class method for informing Project instances about what kinds of models
|
|
6
|
+
# might be stored inside thier Project#managed_repository.
|
|
7
|
+
#
|
|
8
|
+
# @param [DataMapper::Model] model class that might be stored in Project managed_repositories
|
|
9
|
+
# @return [Array<DataMapper::Model>] list of currently managed models
|
|
10
|
+
def manage(*args)
|
|
11
|
+
@managed_models ||= []
|
|
12
|
+
models = args
|
|
13
|
+
|
|
14
|
+
@managed_models += models
|
|
15
|
+
@managed_models.uniq!
|
|
16
|
+
|
|
17
|
+
@managed_models
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Models that are currently managed by Project instances.
|
|
21
|
+
# @return [Array<DataMapper::Model>] list of currently managed models
|
|
22
|
+
def managed_models
|
|
23
|
+
@managed_models
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Ensure that Relation models are also managed
|
|
27
|
+
def finalize_managed_models!
|
|
28
|
+
models = []
|
|
29
|
+
@managed_models.each do |m|
|
|
30
|
+
models += m.relationships.values.map{|r| r.child_model }
|
|
31
|
+
models += m.relationships.values.map{|r| r.parent_model }
|
|
32
|
+
end
|
|
33
|
+
@managed_models += models
|
|
34
|
+
@managed_models.uniq!
|
|
35
|
+
@managed_models
|
|
36
|
+
end
|
|
37
|
+
end # Model
|
|
38
|
+
end # RepositoryManager
|
|
39
|
+
end # DataMapper
|
|
40
|
+
end # Yogo
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
module Yogo
|
|
2
|
+
module DataMapper
|
|
3
|
+
module RepositoryManager
|
|
4
|
+
module Resource
|
|
5
|
+
def managed_repository_name
|
|
6
|
+
raise NotImplementedError
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def adapter_config
|
|
10
|
+
raise NotImplementedError
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def adapter
|
|
14
|
+
begin
|
|
15
|
+
::DataMapper.repository(managed_repository_name).adapter
|
|
16
|
+
rescue ::DataMapper::RepositoryNotSetupError
|
|
17
|
+
::DataMapper.setup(managed_repository_name, adapter_config)
|
|
18
|
+
retry
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def managed_repository(&block)
|
|
23
|
+
adapter # ensure the adapter get's setup or exists
|
|
24
|
+
if block_given?
|
|
25
|
+
::DataMapper.repository(managed_repository_name, &block)
|
|
26
|
+
else
|
|
27
|
+
::DataMapper.repository(managed_repository_name)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Ensure that models that models managed by the Project
|
|
32
|
+
# are properly migrated/upgraded inside the Project managed repository.
|
|
33
|
+
#
|
|
34
|
+
# @author Ryan Heimbuch
|
|
35
|
+
# @todo Refactor this method into a module in yogo-project
|
|
36
|
+
def prepare_models
|
|
37
|
+
adapter # ensure the adapter exists or is setup
|
|
38
|
+
managed_repository.scope {
|
|
39
|
+
self.class.finalize_managed_models!
|
|
40
|
+
self.class.managed_models.each do |klass|
|
|
41
|
+
klass.auto_upgrade!
|
|
42
|
+
end
|
|
43
|
+
}
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Ensure that models that we might store in the Project#managed_repository
|
|
47
|
+
# are properly migrated/upgrade whenever the Project changes.
|
|
48
|
+
# @author Ryan Heimbuch
|
|
49
|
+
# @see Project#prepare_models
|
|
50
|
+
after :save, :prepare_models
|
|
51
|
+
|
|
52
|
+
# Builds a "new", unsaved datamapper resource, that is explicitly
|
|
53
|
+
# bound to the Project#managed_repository.
|
|
54
|
+
# If you want to create a new resource that will be saved inside the
|
|
55
|
+
# repository of a Project, you should always use this method.
|
|
56
|
+
#
|
|
57
|
+
# @example Create a new site that is stored in myProject.managed_repository
|
|
58
|
+
# managedSite = myProject.build_managed(Voeis::Site, :name => ...)
|
|
59
|
+
#
|
|
60
|
+
# @example Doing any of these will NOT work consistently (if at all)
|
|
61
|
+
# managedSite1 = Voeis::Site.new(:name => ...)
|
|
62
|
+
# managedSite1.save # WILL NOT save in myProject.managed_repository
|
|
63
|
+
#
|
|
64
|
+
# managedSite2 = myProject.managed_repository{Voeis::Site.new(:name => ...)}
|
|
65
|
+
# managedSite2.save # WILL NOT save in myProject.managed_repository
|
|
66
|
+
#
|
|
67
|
+
# Boring Details:
|
|
68
|
+
# Initially "new" model resources do not bind themselves to any repository.
|
|
69
|
+
# At some point a "new" resource will persist itself and bind itself exclusively
|
|
70
|
+
# to the repository that it "persisted into". This step is fiddly to catch, and
|
|
71
|
+
# happens deep inside the DataMapper code. It is MUCH easier to explictly bind
|
|
72
|
+
# the "new" resource to a particular repository immediately after calling #new.
|
|
73
|
+
# This requires using reflection to modify the internal state of the resource object,
|
|
74
|
+
# so it is best sealed inside a single method, rather than scattered throughout
|
|
75
|
+
# the codebase.
|
|
76
|
+
#
|
|
77
|
+
# @todo Refactor into module in yogo-project
|
|
78
|
+
# @author Ryan Heimbuch
|
|
79
|
+
def build_managed(model_klass, attributes={})
|
|
80
|
+
unless self.class.managed_models.include? model_klass
|
|
81
|
+
self.class.manage(model_klass)
|
|
82
|
+
prepare_models
|
|
83
|
+
end
|
|
84
|
+
res = model_klass.new(attributes)
|
|
85
|
+
res.instance_variable_set(:@_repository, managed_repository)
|
|
86
|
+
res
|
|
87
|
+
end
|
|
88
|
+
end # RepositoryModels
|
|
89
|
+
end # RepositoryManager
|
|
90
|
+
end # DataMapper
|
|
91
|
+
end # Yogo
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Generated by jeweler
|
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
|
4
|
+
# -*- encoding: utf-8 -*-
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |s|
|
|
7
|
+
s.name = %q{yogo-datamapper}
|
|
8
|
+
s.version = "0.3.0"
|
|
9
|
+
|
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
|
+
s.authors = ["Ryan Heimbuch"]
|
|
12
|
+
s.date = %q{2010-11-01}
|
|
13
|
+
s.description = %q{Yogo extensions to DataMapper}
|
|
14
|
+
s.email = %q{rheimbuch@gmail.com}
|
|
15
|
+
s.extra_rdoc_files = [
|
|
16
|
+
"LICENSE",
|
|
17
|
+
"README.rdoc"
|
|
18
|
+
]
|
|
19
|
+
s.files = [
|
|
20
|
+
".document",
|
|
21
|
+
".gitignore",
|
|
22
|
+
"Gemfile",
|
|
23
|
+
"Gemfile.lock",
|
|
24
|
+
"LICENSE",
|
|
25
|
+
"README.rdoc",
|
|
26
|
+
"Rakefile",
|
|
27
|
+
"VERSION",
|
|
28
|
+
"features/step_definitions/yogo-datamapper_steps.rb",
|
|
29
|
+
"features/support/env.rb",
|
|
30
|
+
"features/yogo-datamapper.feature",
|
|
31
|
+
"lib/yogo/datamapper/model/common/properties.rb",
|
|
32
|
+
"lib/yogo/datamapper/model/configuration.rb",
|
|
33
|
+
"lib/yogo/datamapper/model/operations.rb",
|
|
34
|
+
"lib/yogo/datamapper/model/operations/add.rb",
|
|
35
|
+
"lib/yogo/datamapper/model/operations/clear.rb",
|
|
36
|
+
"lib/yogo/datamapper/model/stored/configuration.rb",
|
|
37
|
+
"lib/yogo/datamapper/repository_manager.rb",
|
|
38
|
+
"lib/yogo/datamapper/repository_manager/model.rb",
|
|
39
|
+
"lib/yogo/datamapper/repository_manager/resource.rb",
|
|
40
|
+
"spec/spec_helper.rb",
|
|
41
|
+
"yogo-datamapper.gemspec"
|
|
42
|
+
]
|
|
43
|
+
s.homepage = %q{http://github.com/yogo/yogo-datamapper}
|
|
44
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
|
45
|
+
s.require_paths = ["lib"]
|
|
46
|
+
s.rubygems_version = %q{1.3.7}
|
|
47
|
+
s.summary = %q{Yogo extensions to DataMapper}
|
|
48
|
+
s.test_files = [
|
|
49
|
+
"spec/spec_helper.rb"
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
if s.respond_to? :specification_version then
|
|
53
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
|
54
|
+
s.specification_version = 3
|
|
55
|
+
|
|
56
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
|
57
|
+
s.add_runtime_dependency(%q<dm-core>, ["~> 1.0.2"])
|
|
58
|
+
s.add_runtime_dependency(%q<dm-aggregates>, ["~> 1.0.2"])
|
|
59
|
+
s.add_runtime_dependency(%q<dm-types>, ["~> 1.0.2"])
|
|
60
|
+
s.add_runtime_dependency(%q<dm-migrations>, [">= 0"])
|
|
61
|
+
s.add_runtime_dependency(%q<dm-validations>, [">= 0"])
|
|
62
|
+
s.add_runtime_dependency(%q<dm-timestamps>, [">= 0"])
|
|
63
|
+
s.add_runtime_dependency(%q<dm-is-remixable>, [">= 0"])
|
|
64
|
+
s.add_runtime_dependency(%q<yogo-support>, [">= 0"])
|
|
65
|
+
s.add_runtime_dependency(%q<yogo-operation>, [">= 0"])
|
|
66
|
+
else
|
|
67
|
+
s.add_dependency(%q<dm-core>, ["~> 1.0.2"])
|
|
68
|
+
s.add_dependency(%q<dm-aggregates>, ["~> 1.0.2"])
|
|
69
|
+
s.add_dependency(%q<dm-types>, ["~> 1.0.2"])
|
|
70
|
+
s.add_dependency(%q<dm-migrations>, [">= 0"])
|
|
71
|
+
s.add_dependency(%q<dm-validations>, [">= 0"])
|
|
72
|
+
s.add_dependency(%q<dm-timestamps>, [">= 0"])
|
|
73
|
+
s.add_dependency(%q<dm-is-remixable>, [">= 0"])
|
|
74
|
+
s.add_dependency(%q<yogo-support>, [">= 0"])
|
|
75
|
+
s.add_dependency(%q<yogo-operation>, [">= 0"])
|
|
76
|
+
end
|
|
77
|
+
else
|
|
78
|
+
s.add_dependency(%q<dm-core>, ["~> 1.0.2"])
|
|
79
|
+
s.add_dependency(%q<dm-aggregates>, ["~> 1.0.2"])
|
|
80
|
+
s.add_dependency(%q<dm-types>, ["~> 1.0.2"])
|
|
81
|
+
s.add_dependency(%q<dm-migrations>, [">= 0"])
|
|
82
|
+
s.add_dependency(%q<dm-validations>, [">= 0"])
|
|
83
|
+
s.add_dependency(%q<dm-timestamps>, [">= 0"])
|
|
84
|
+
s.add_dependency(%q<dm-is-remixable>, [">= 0"])
|
|
85
|
+
s.add_dependency(%q<yogo-support>, [">= 0"])
|
|
86
|
+
s.add_dependency(%q<yogo-operation>, [">= 0"])
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
metadata
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: yogo-datamapper
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
prerelease: false
|
|
5
|
+
segments:
|
|
6
|
+
- 0
|
|
7
|
+
- 3
|
|
8
|
+
- 0
|
|
9
|
+
version: 0.3.0
|
|
10
|
+
platform: ruby
|
|
11
|
+
authors:
|
|
12
|
+
- Ryan Heimbuch
|
|
13
|
+
autorequire:
|
|
14
|
+
bindir: bin
|
|
15
|
+
cert_chain: []
|
|
16
|
+
|
|
17
|
+
date: 2010-11-01 00:00:00 -06:00
|
|
18
|
+
default_executable:
|
|
19
|
+
dependencies:
|
|
20
|
+
- !ruby/object:Gem::Dependency
|
|
21
|
+
name: dm-core
|
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
|
23
|
+
none: false
|
|
24
|
+
requirements:
|
|
25
|
+
- - ~>
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
segments:
|
|
28
|
+
- 1
|
|
29
|
+
- 0
|
|
30
|
+
- 2
|
|
31
|
+
version: 1.0.2
|
|
32
|
+
type: :runtime
|
|
33
|
+
prerelease: false
|
|
34
|
+
version_requirements: *id001
|
|
35
|
+
- !ruby/object:Gem::Dependency
|
|
36
|
+
name: dm-aggregates
|
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
|
38
|
+
none: false
|
|
39
|
+
requirements:
|
|
40
|
+
- - ~>
|
|
41
|
+
- !ruby/object:Gem::Version
|
|
42
|
+
segments:
|
|
43
|
+
- 1
|
|
44
|
+
- 0
|
|
45
|
+
- 2
|
|
46
|
+
version: 1.0.2
|
|
47
|
+
type: :runtime
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: *id002
|
|
50
|
+
- !ruby/object:Gem::Dependency
|
|
51
|
+
name: dm-types
|
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
|
53
|
+
none: false
|
|
54
|
+
requirements:
|
|
55
|
+
- - ~>
|
|
56
|
+
- !ruby/object:Gem::Version
|
|
57
|
+
segments:
|
|
58
|
+
- 1
|
|
59
|
+
- 0
|
|
60
|
+
- 2
|
|
61
|
+
version: 1.0.2
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: *id003
|
|
65
|
+
- !ruby/object:Gem::Dependency
|
|
66
|
+
name: dm-migrations
|
|
67
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
|
68
|
+
none: false
|
|
69
|
+
requirements:
|
|
70
|
+
- - ">="
|
|
71
|
+
- !ruby/object:Gem::Version
|
|
72
|
+
segments:
|
|
73
|
+
- 0
|
|
74
|
+
version: "0"
|
|
75
|
+
type: :runtime
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: *id004
|
|
78
|
+
- !ruby/object:Gem::Dependency
|
|
79
|
+
name: dm-validations
|
|
80
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
|
81
|
+
none: false
|
|
82
|
+
requirements:
|
|
83
|
+
- - ">="
|
|
84
|
+
- !ruby/object:Gem::Version
|
|
85
|
+
segments:
|
|
86
|
+
- 0
|
|
87
|
+
version: "0"
|
|
88
|
+
type: :runtime
|
|
89
|
+
prerelease: false
|
|
90
|
+
version_requirements: *id005
|
|
91
|
+
- !ruby/object:Gem::Dependency
|
|
92
|
+
name: dm-timestamps
|
|
93
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
|
94
|
+
none: false
|
|
95
|
+
requirements:
|
|
96
|
+
- - ">="
|
|
97
|
+
- !ruby/object:Gem::Version
|
|
98
|
+
segments:
|
|
99
|
+
- 0
|
|
100
|
+
version: "0"
|
|
101
|
+
type: :runtime
|
|
102
|
+
prerelease: false
|
|
103
|
+
version_requirements: *id006
|
|
104
|
+
- !ruby/object:Gem::Dependency
|
|
105
|
+
name: dm-is-remixable
|
|
106
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
|
107
|
+
none: false
|
|
108
|
+
requirements:
|
|
109
|
+
- - ">="
|
|
110
|
+
- !ruby/object:Gem::Version
|
|
111
|
+
segments:
|
|
112
|
+
- 0
|
|
113
|
+
version: "0"
|
|
114
|
+
type: :runtime
|
|
115
|
+
prerelease: false
|
|
116
|
+
version_requirements: *id007
|
|
117
|
+
- !ruby/object:Gem::Dependency
|
|
118
|
+
name: yogo-support
|
|
119
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
|
120
|
+
none: false
|
|
121
|
+
requirements:
|
|
122
|
+
- - ">="
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
segments:
|
|
125
|
+
- 0
|
|
126
|
+
version: "0"
|
|
127
|
+
type: :runtime
|
|
128
|
+
prerelease: false
|
|
129
|
+
version_requirements: *id008
|
|
130
|
+
- !ruby/object:Gem::Dependency
|
|
131
|
+
name: yogo-operation
|
|
132
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
|
133
|
+
none: false
|
|
134
|
+
requirements:
|
|
135
|
+
- - ">="
|
|
136
|
+
- !ruby/object:Gem::Version
|
|
137
|
+
segments:
|
|
138
|
+
- 0
|
|
139
|
+
version: "0"
|
|
140
|
+
type: :runtime
|
|
141
|
+
prerelease: false
|
|
142
|
+
version_requirements: *id009
|
|
143
|
+
description: Yogo extensions to DataMapper
|
|
144
|
+
email: rheimbuch@gmail.com
|
|
145
|
+
executables: []
|
|
146
|
+
|
|
147
|
+
extensions: []
|
|
148
|
+
|
|
149
|
+
extra_rdoc_files:
|
|
150
|
+
- LICENSE
|
|
151
|
+
- README.rdoc
|
|
152
|
+
files:
|
|
153
|
+
- .document
|
|
154
|
+
- .gitignore
|
|
155
|
+
- Gemfile
|
|
156
|
+
- Gemfile.lock
|
|
157
|
+
- LICENSE
|
|
158
|
+
- README.rdoc
|
|
159
|
+
- Rakefile
|
|
160
|
+
- VERSION
|
|
161
|
+
- features/step_definitions/yogo-datamapper_steps.rb
|
|
162
|
+
- features/support/env.rb
|
|
163
|
+
- features/yogo-datamapper.feature
|
|
164
|
+
- lib/yogo/datamapper/model/common/properties.rb
|
|
165
|
+
- lib/yogo/datamapper/model/configuration.rb
|
|
166
|
+
- lib/yogo/datamapper/model/operations.rb
|
|
167
|
+
- lib/yogo/datamapper/model/operations/add.rb
|
|
168
|
+
- lib/yogo/datamapper/model/operations/clear.rb
|
|
169
|
+
- lib/yogo/datamapper/model/stored/configuration.rb
|
|
170
|
+
- lib/yogo/datamapper/repository_manager.rb
|
|
171
|
+
- lib/yogo/datamapper/repository_manager/model.rb
|
|
172
|
+
- lib/yogo/datamapper/repository_manager/resource.rb
|
|
173
|
+
- spec/spec_helper.rb
|
|
174
|
+
- yogo-datamapper.gemspec
|
|
175
|
+
has_rdoc: true
|
|
176
|
+
homepage: http://github.com/yogo/yogo-datamapper
|
|
177
|
+
licenses: []
|
|
178
|
+
|
|
179
|
+
post_install_message:
|
|
180
|
+
rdoc_options:
|
|
181
|
+
- --charset=UTF-8
|
|
182
|
+
require_paths:
|
|
183
|
+
- lib
|
|
184
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
185
|
+
none: false
|
|
186
|
+
requirements:
|
|
187
|
+
- - ">="
|
|
188
|
+
- !ruby/object:Gem::Version
|
|
189
|
+
hash: -1712098966994122377
|
|
190
|
+
segments:
|
|
191
|
+
- 0
|
|
192
|
+
version: "0"
|
|
193
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
|
+
none: false
|
|
195
|
+
requirements:
|
|
196
|
+
- - ">="
|
|
197
|
+
- !ruby/object:Gem::Version
|
|
198
|
+
segments:
|
|
199
|
+
- 0
|
|
200
|
+
version: "0"
|
|
201
|
+
requirements: []
|
|
202
|
+
|
|
203
|
+
rubyforge_project:
|
|
204
|
+
rubygems_version: 1.3.7
|
|
205
|
+
signing_key:
|
|
206
|
+
specification_version: 3
|
|
207
|
+
summary: Yogo extensions to DataMapper
|
|
208
|
+
test_files:
|
|
209
|
+
- spec/spec_helper.rb
|