dm-is-predefined 0.3.1 → 0.4.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/ChangeLog.md +15 -0
- data/Gemfile +1 -1
- data/README.md +10 -6
- data/Rakefile +4 -4
- data/dm-is-predefined.gemspec +125 -13
- data/gemspec.yml +2 -2
- data/lib/dm-is-predefined/is/predefined.rb +169 -35
- data/spec/integration/models/migrated_model.rb +19 -0
- data/spec/integration/predefined_spec.rb +55 -17
- metadata +40 -44
data/ChangeLog.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
### 0.4.0 / 2011-07-28
|
2
|
+
|
3
|
+
* Added {DataMapper::Is::Predefined::MigrationMethods}.
|
4
|
+
* Overrides `auto_migrate!` and `auto_upgrade!` to auto-predefine
|
5
|
+
the resources after auto-migrations.
|
6
|
+
* Added {DataMapper::Is::Predefined::ClassMethods#predefine!}.
|
7
|
+
* Added {DataMapper::Is::Predefined::ClassMethods#predefined}.
|
8
|
+
* Added {DataMapper::Is::Predefined::ClassMethods#predefined?}.
|
9
|
+
* Added {DataMapper::Is::Predefined::ClassMethods#first_or_predefined}.
|
10
|
+
* Made {DataMapper::Is::Predefined::ClassMethods#predefined_attributes} public.
|
11
|
+
* Deprecated {DataMapper::Is::Predefined::ClassMethods#predefined_resource_with}
|
12
|
+
in favor of {DataMapper::Is::Predefined::ClassMethods#first_or_predefined}.
|
13
|
+
* Deprecated {DataMapper::Is::Predefined::ClassMethods#predefined_names}
|
14
|
+
in favor of {DataMapper::Is::Predefined::ClassMethods#predefined}.
|
15
|
+
|
1
16
|
### 0.3.1 / 2011-02-28
|
2
17
|
|
3
18
|
* Require dm-core ~> 1.0.
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -34,25 +34,29 @@ A DataMapper plugin for adding predefined resources to Models.
|
|
34
34
|
|
35
35
|
end
|
36
36
|
|
37
|
+
|
38
|
+
License.predefined
|
39
|
+
# => [:gpl2, :mit]
|
40
|
+
|
41
|
+
License.predefined?(:gpl2)
|
42
|
+
# => true
|
43
|
+
|
37
44
|
Licence.gpl2
|
38
45
|
# => #<Licence: id: 1, name: "GPL-2", url: "http://www.gnu.org/copyleft/gpl.html">
|
39
|
-
|
46
|
+
|
40
47
|
Licence.predefined_resource(:mit)
|
41
48
|
# => #<Licence: id: 2, name: "MIT">
|
42
49
|
|
43
|
-
License.
|
50
|
+
License.first_or_predefined(:name => 'GPL-2')
|
44
51
|
# => #<License: id: 1, name: "GPL-2", url: "http://www.gnu.org/copyleft/gpl.html">
|
45
52
|
|
46
|
-
License.predefined_names
|
47
|
-
# => [:gpl2, :mit]
|
48
|
-
|
49
53
|
## Requirements
|
50
54
|
|
51
55
|
* [dm-core](http://github.com/datamapper/dm-core/) ~> 1.0
|
52
56
|
|
53
57
|
## Install
|
54
58
|
|
55
|
-
$
|
59
|
+
$ gem install dm-is-predefined
|
56
60
|
|
57
61
|
## License
|
58
62
|
|
data/Rakefile
CHANGED
@@ -3,16 +3,16 @@ require 'rubygems'
|
|
3
3
|
begin
|
4
4
|
require 'bundler'
|
5
5
|
rescue LoadError => e
|
6
|
-
|
7
|
-
|
6
|
+
warn e.message
|
7
|
+
warn "Run `gem install bundler` to install Bundler."
|
8
8
|
exit e.status_code
|
9
9
|
end
|
10
10
|
|
11
11
|
begin
|
12
12
|
Bundler.setup(:development)
|
13
13
|
rescue Bundler::BundlerError => e
|
14
|
-
|
15
|
-
|
14
|
+
warn e.message
|
15
|
+
warn "Run `bundle install` to install missing gems"
|
16
16
|
exit e.status_code
|
17
17
|
end
|
18
18
|
|
data/dm-is-predefined.gemspec
CHANGED
@@ -1,15 +1,127 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
Gem::Specification.new do |gemspec|
|
6
|
+
files = if File.directory?('.git')
|
7
|
+
`git ls-files`.split($/)
|
8
|
+
elsif File.directory?('.hg')
|
9
|
+
`hg manifest`.split($/)
|
10
|
+
elsif File.directory?('.svn')
|
11
|
+
`svn ls -R`.split($/).select { |path| File.file?(path) }
|
12
|
+
else
|
13
|
+
Dir['{**/}{.*,*}'].select { |path| File.file?(path) }
|
14
|
+
end
|
15
|
+
|
16
|
+
filter_files = lambda { |paths|
|
17
|
+
case paths
|
18
|
+
when Array
|
19
|
+
(files & paths)
|
20
|
+
when String
|
21
|
+
(files & Dir[paths])
|
22
|
+
end
|
23
|
+
}
|
24
|
+
|
25
|
+
version = {
|
26
|
+
:file => 'lib/dm-is-predefined/version.rb',
|
27
|
+
:constant => 'DataMapper::Is::Predefined::VERSION'
|
28
|
+
}
|
29
|
+
|
30
|
+
defaults = {
|
31
|
+
'name' => File.basename(File.dirname(__FILE__)),
|
32
|
+
'files' => files,
|
33
|
+
'executables' => filter_files['bin/*'].map { |path| File.basename(path) },
|
34
|
+
'test_files' => filter_files['{test/{**/}*_test.rb,spec/{**/}*_spec.rb}'],
|
35
|
+
'extra_doc_files' => filter_files['*.{txt,rdoc,md,markdown,tt,textile}'],
|
36
|
+
}
|
37
|
+
|
38
|
+
metadata = defaults.merge(YAML.load_file('gemspec.yml'))
|
39
|
+
|
40
|
+
gemspec.name = metadata.fetch('name',defaults[:name])
|
41
|
+
gemspec.version = if metadata['version']
|
42
|
+
metadata['version']
|
43
|
+
elsif File.file?(version[:file])
|
44
|
+
require File.join('.',version[:file])
|
45
|
+
eval(version[:constant])
|
46
|
+
end
|
47
|
+
|
48
|
+
gemspec.summary = metadata.fetch('summary',metadata['description'])
|
49
|
+
gemspec.description = metadata.fetch('description',metadata['summary'])
|
50
|
+
|
51
|
+
case metadata['license']
|
52
|
+
when Array
|
53
|
+
gemspec.licenses = metadata['license']
|
54
|
+
when String
|
55
|
+
gemspec.license = metadata['license']
|
56
|
+
end
|
57
|
+
|
58
|
+
case metadata['authors']
|
59
|
+
when Array
|
60
|
+
gemspec.authors = metadata['authors']
|
61
|
+
when String
|
62
|
+
gemspec.author = metadata['authors']
|
63
|
+
end
|
64
|
+
|
65
|
+
gemspec.email = metadata['email']
|
66
|
+
gemspec.homepage = metadata['homepage']
|
67
|
+
|
68
|
+
case metadata['require_paths']
|
69
|
+
when Array
|
70
|
+
gemspec.require_paths = metadata['require_paths']
|
71
|
+
when String
|
72
|
+
gemspec.require_path = metadata['require_paths']
|
73
|
+
end
|
74
|
+
|
75
|
+
gemspec.files = filter_files[metadata['files']]
|
76
|
+
|
77
|
+
gemspec.executables = metadata['executables']
|
78
|
+
gemspec.extensions = metadata['extensions']
|
79
|
+
|
80
|
+
if Gem::VERSION < '1.7.'
|
81
|
+
gemspec.default_executable = gemspec.executables.first
|
82
|
+
end
|
83
|
+
|
84
|
+
gemspec.test_files = filter_files[metadata['test_files']]
|
85
|
+
|
86
|
+
unless gemspec.files.include?('.document')
|
87
|
+
gemspec.extra_rdoc_files = metadata['extra_doc_files']
|
88
|
+
end
|
89
|
+
|
90
|
+
gemspec.post_install_message = metadata['post_install_message']
|
91
|
+
gemspec.requirements = metadata['requirements']
|
92
|
+
|
93
|
+
if gemspec.respond_to?(:required_ruby_version=)
|
94
|
+
gemspec.required_ruby_version = metadata['required_ruby_version']
|
95
|
+
end
|
96
|
+
|
97
|
+
if gemspec.respond_to?(:required_rubygems_version=)
|
98
|
+
gemspec.required_rubygems_version = metadata['required_ruby_version']
|
99
|
+
end
|
100
|
+
|
101
|
+
parse_versions = lambda { |versions|
|
102
|
+
case versions
|
103
|
+
when Array
|
104
|
+
versions.map { |v| v.to_s }
|
105
|
+
when String
|
106
|
+
versions.split(/,\s*/)
|
107
|
+
end
|
108
|
+
}
|
109
|
+
|
110
|
+
if metadata['dependencies']
|
111
|
+
metadata['dependencies'].each do |name,versions|
|
112
|
+
gemspec.add_dependency(name,parse_versions[versions])
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
if metadata['runtime_dependencies']
|
117
|
+
metadata['runtime_dependencies'].each do |name,versions|
|
118
|
+
gemspec.add_runtime_dependency(name,parse_versions[versions])
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
if metadata['development_dependencies']
|
123
|
+
metadata['development_dependencies'].each do |name,versions|
|
124
|
+
gemspec.add_development_dependency(name,parse_versions[versions])
|
125
|
+
end
|
14
126
|
end
|
15
127
|
end
|
data/gemspec.yml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
name: dm-is-predefined
|
2
|
-
version: 0.
|
2
|
+
version: 0.4.0
|
3
3
|
summary: DataMapper plugin for adding predefined resources to models.
|
4
4
|
description:
|
5
5
|
A DataMapper plugin for adding predefined resources to Models.
|
@@ -15,4 +15,4 @@ dependencies:
|
|
15
15
|
|
16
16
|
development_dependencies:
|
17
17
|
bundler: ~> 1.0.0
|
18
|
-
yard: ~> 0.
|
18
|
+
yard: ~> 0.7.0
|
@@ -4,94 +4,225 @@ module DataMapper
|
|
4
4
|
module Is
|
5
5
|
module Predefined
|
6
6
|
#
|
7
|
-
# Fired when your plugin gets included into
|
7
|
+
# Fired when your plugin gets included into a Model.
|
8
|
+
#
|
9
|
+
# @note
|
10
|
+
# If the model already includes `DataMapper::Migrations`, then
|
11
|
+
# {MigrationMethods} will be extended into the Model.
|
12
|
+
#
|
13
|
+
# @api private
|
8
14
|
#
|
9
15
|
def is_predefined
|
10
16
|
extend DataMapper::Is::Predefined::ClassMethods
|
17
|
+
|
18
|
+
if defined?(DataMapper::Migrations) &&
|
19
|
+
included_modules.include?(DataMapper::Migrations)
|
20
|
+
extend MigrationMethods
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# @since 0.4.0
|
26
|
+
#
|
27
|
+
module MigrationMethods
|
28
|
+
#
|
29
|
+
# Auto-migrates the model, then creates all predefined resources.
|
30
|
+
#
|
31
|
+
# @param [Symbol] repository_name
|
32
|
+
# The repository to perform the migrations within.
|
33
|
+
#
|
34
|
+
# @return [true]
|
35
|
+
#
|
36
|
+
# @api public
|
37
|
+
#
|
38
|
+
def auto_migrate!(repository_name=self.repository_name)
|
39
|
+
result = super(repository_name)
|
40
|
+
|
41
|
+
predefine!(repository_name)
|
42
|
+
return result
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# Auto-upgrades the model, then creates any missing predefined
|
47
|
+
# resources.
|
48
|
+
#
|
49
|
+
# @param [Symbol] repository_name
|
50
|
+
# The repository to perform the upgrade within.
|
51
|
+
#
|
52
|
+
# @return [true]
|
53
|
+
#
|
54
|
+
# @api public
|
55
|
+
#
|
56
|
+
def auto_upgrade!(repository_name=self.repository_name)
|
57
|
+
result = super(repository_name)
|
58
|
+
|
59
|
+
predefine!(repository_name)
|
60
|
+
return result
|
61
|
+
end
|
11
62
|
end
|
12
63
|
|
13
64
|
module ClassMethods
|
65
|
+
#
|
66
|
+
# All pre-defined resources of the model.
|
67
|
+
#
|
68
|
+
# @return [Hash{Symbol => Hash}]
|
69
|
+
# The Hash of pre-defined resources and their attributes.
|
70
|
+
#
|
71
|
+
# @api semipublic
|
72
|
+
#
|
73
|
+
def predefined_attributes
|
74
|
+
@predefined_attributes ||= {}
|
75
|
+
end
|
76
|
+
|
14
77
|
#
|
15
78
|
# Returns the names of the predefined resources.
|
16
79
|
#
|
17
80
|
# @return [Array<Symbol>]
|
18
81
|
# The names of the predefined resources.
|
19
82
|
#
|
83
|
+
# @since 0.4.0
|
84
|
+
#
|
85
|
+
# @api public
|
86
|
+
#
|
87
|
+
def predefined
|
88
|
+
predefined_attributes.keys
|
89
|
+
end
|
90
|
+
|
91
|
+
#
|
92
|
+
# @see #predefined
|
93
|
+
#
|
94
|
+
# @deprecated Will be removed in 1.0.0.
|
95
|
+
#
|
20
96
|
# @since 0.2.1
|
21
97
|
#
|
22
98
|
def predefined_names
|
23
|
-
|
99
|
+
predefined
|
24
100
|
end
|
25
101
|
|
26
102
|
#
|
27
|
-
#
|
103
|
+
# Determines if a resource was predefined.
|
104
|
+
#
|
105
|
+
# @param [Symbol, String] name
|
106
|
+
# The name of the predefined resource to search for.
|
107
|
+
#
|
108
|
+
# @return [Boolean]
|
109
|
+
# Specifies whether the resource was predefined.
|
110
|
+
#
|
111
|
+
# @since 0.4.0
|
112
|
+
#
|
113
|
+
# @api public
|
114
|
+
#
|
115
|
+
def predefined?(name)
|
116
|
+
predefined_attributes.has_key?(name.to_sym)
|
117
|
+
end
|
118
|
+
|
119
|
+
#
|
120
|
+
# Finds or auto-creates the pre-defined resource with the given
|
121
|
+
# name.
|
28
122
|
#
|
29
123
|
# @param [Symbol, String] name
|
30
124
|
# The name of the pre-defined resource.
|
31
125
|
#
|
126
|
+
# @param [Hash{Symbol => Object}] extra_attributes
|
127
|
+
# Additional attributes to add to the predefined resource.
|
128
|
+
#
|
32
129
|
# @return [DataMapper::Resource]
|
33
130
|
# The pre-defined resource.
|
34
131
|
#
|
35
132
|
# @raise [UnknownResource]
|
36
|
-
# Indicates that there are no predefined attributes for the
|
37
|
-
# with the given name.
|
133
|
+
# Indicates that there are no predefined attributes for the
|
134
|
+
# resource with the given name.
|
38
135
|
#
|
39
136
|
# @since 0.2.1
|
40
137
|
#
|
138
|
+
# @api public
|
139
|
+
#
|
41
140
|
def predefined_resource(name)
|
42
141
|
name = name.to_sym
|
43
|
-
attributes = self.predefined_attributes[name]
|
44
142
|
|
45
|
-
unless
|
46
|
-
raise(UnknownResource,"The resource '#{name}' was not predefined"
|
143
|
+
unless predefined?(name)
|
144
|
+
raise(UnknownResource,"The resource '#{name}' was not predefined")
|
47
145
|
end
|
48
146
|
|
49
|
-
|
147
|
+
return first_or_create(predefined_attributes[name])
|
50
148
|
end
|
51
149
|
|
52
150
|
#
|
53
151
|
# Finds or auto-creates the predefined resource which shares the
|
54
152
|
# given attributes.
|
55
153
|
#
|
56
|
-
# @param [Hash{Symbol => Object}]
|
154
|
+
# @param [Hash{Symbol => Object}] conditions
|
155
|
+
# Query conditions.
|
156
|
+
#
|
157
|
+
# @param [Hash{Symbol => Object}] attributes
|
57
158
|
# The attribute names and values that the predefined resource
|
58
159
|
# should shared.
|
59
160
|
#
|
60
|
-
# @return [DataMapper::Resource]
|
161
|
+
# @return [DataMapper::Resource, nil]
|
61
162
|
# The predefined resource.
|
163
|
+
#
|
164
|
+
# @since 0.4.0
|
165
|
+
#
|
166
|
+
# @api public
|
167
|
+
#
|
168
|
+
def first_or_predefined(conditions={},attributes=conditions)
|
169
|
+
if (resource = first(conditions))
|
170
|
+
return resource
|
171
|
+
end
|
172
|
+
|
173
|
+
# if the resource wasn't found, search for matching
|
174
|
+
# predefined attributes
|
175
|
+
attributes = predefined_attributes.values.find do |attrs|
|
176
|
+
attrs.all? do |name,value|
|
177
|
+
attributes.has_key?(name) && (attributes[name] == value)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
# create the resource using the predefined attributes
|
182
|
+
create(attributes) if attributes
|
183
|
+
end
|
184
|
+
|
62
185
|
#
|
63
186
|
# @raise [UnknownResource]
|
64
187
|
# Could not find a predefined resource that shared all of the
|
65
188
|
# desired attributes.
|
66
189
|
#
|
190
|
+
# @deprecated
|
191
|
+
# Will be removed in 1.0.0. Use {#first_or_predefined} instead.
|
192
|
+
#
|
67
193
|
# @since 0.2.1
|
68
194
|
#
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
end
|
76
|
-
|
77
|
-
return predefined_resource(name) if shares_attributes
|
195
|
+
# @api public
|
196
|
+
#
|
197
|
+
def predefined_resource_with(query={})
|
198
|
+
unless (resource = first_or_predefined(query))
|
199
|
+
# no pre-existing or predefined resource matching the query
|
200
|
+
raise(UnknownResource,"Could not find a predefined resource which shared the given attributes")
|
78
201
|
end
|
79
202
|
|
80
|
-
|
203
|
+
return resource
|
81
204
|
end
|
82
205
|
|
83
|
-
protected
|
84
|
-
|
85
206
|
#
|
86
|
-
#
|
207
|
+
# Creates the predefined resources.
|
87
208
|
#
|
88
|
-
# @
|
89
|
-
# The
|
209
|
+
# @param [Symbol] repository_name
|
210
|
+
# The repository to perform the upgrade within.
|
90
211
|
#
|
91
|
-
|
92
|
-
|
212
|
+
# @since 0.4.0
|
213
|
+
#
|
214
|
+
# @api public
|
215
|
+
#
|
216
|
+
def predefine!(repository_name=self.repository_name)
|
217
|
+
DataMapper.repository(repository_name) do
|
218
|
+
predefined_attributes.each_value do |attributes|
|
219
|
+
first_or_create(attributes)
|
220
|
+
end
|
221
|
+
end
|
93
222
|
end
|
94
223
|
|
224
|
+
protected
|
225
|
+
|
95
226
|
#
|
96
227
|
# Defines a new pre-defined resource for the model.
|
97
228
|
#
|
@@ -102,26 +233,29 @@ module DataMapper
|
|
102
233
|
# The attributes for the pre-defined resource.
|
103
234
|
#
|
104
235
|
# @return [Hash]
|
105
|
-
# The attributes that will be assigned to the pre-defined
|
236
|
+
# The attributes that will be assigned to the pre-defined
|
237
|
+
# resource.
|
238
|
+
#
|
239
|
+
# @api public
|
106
240
|
#
|
107
241
|
def predefine(name,attributes={})
|
108
|
-
name = name.
|
242
|
+
name = name.to_sym
|
109
243
|
|
110
244
|
if attributes.empty?
|
111
|
-
raise(ArgumentError,"Cannot predefine a resource with no attributes"
|
245
|
+
raise(ArgumentError,"Cannot predefine a resource with no attributes")
|
112
246
|
end
|
113
247
|
|
114
|
-
|
248
|
+
predefined_attributes[name] = attributes
|
115
249
|
|
116
250
|
class_eval %{
|
117
251
|
class << self
|
118
|
-
define_method(#{name.
|
119
|
-
predefined_resource(#{name.
|
252
|
+
define_method(#{name.inspect}) do
|
253
|
+
predefined_resource(#{name.inspect})
|
120
254
|
end
|
121
255
|
end
|
122
256
|
}
|
123
257
|
|
124
|
-
attributes
|
258
|
+
return attributes
|
125
259
|
end
|
126
260
|
end # ClassMethods
|
127
261
|
end # Predefined
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'dm-is-predefined'
|
2
|
+
|
3
|
+
class MigratedModel
|
4
|
+
|
5
|
+
include DataMapper::Resource
|
6
|
+
include DataMapper::Migrations
|
7
|
+
|
8
|
+
is :predefined
|
9
|
+
|
10
|
+
# Primary key of the test model
|
11
|
+
property :id, Serial
|
12
|
+
|
13
|
+
# Name property to test String values
|
14
|
+
property :name, String
|
15
|
+
|
16
|
+
predefine :test1, :name => 'test1'
|
17
|
+
predefine :test2, :name => 'test2'
|
18
|
+
|
19
|
+
end
|
@@ -1,17 +1,56 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'integration/models/test_model'
|
3
|
+
require 'integration/models/migrated_model'
|
3
4
|
|
4
5
|
describe DataMapper::Is::Predefined do
|
5
6
|
before(:all) do
|
6
7
|
TestModel.auto_migrate!
|
7
8
|
end
|
8
9
|
|
10
|
+
context "migrations" do
|
11
|
+
it "should extend MigrationMethods, if Migrations are included" do
|
12
|
+
TestModel.should_not be_kind_of(DataMapper::Is::Predefined::MigrationMethods)
|
13
|
+
MigratedModel.should be_kind_of(DataMapper::Is::Predefined::MigrationMethods)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should create all predefined resources after auto_migrate!" do
|
17
|
+
MigratedModel.auto_migrate!
|
18
|
+
|
19
|
+
resources = MigratedModel.all
|
20
|
+
|
21
|
+
resources[0].id.should == 1
|
22
|
+
resources[0].name.should == 'test1'
|
23
|
+
|
24
|
+
resources[1].id.should == 2
|
25
|
+
resources[1].name.should == 'test2'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should create missing predefined resources after auto_upgrade!" do
|
29
|
+
MigratedModel.first(:name => 'test2').destroy!
|
30
|
+
|
31
|
+
MigratedModel.property :extra, String
|
32
|
+
MigratedModel.auto_upgrade!
|
33
|
+
|
34
|
+
resources = MigratedModel.all
|
35
|
+
|
36
|
+
resources[0].id.should == 1
|
37
|
+
resources[0].name.should == 'test1'
|
38
|
+
|
39
|
+
resources[1].id.should == 3
|
40
|
+
resources[1].name.should == 'test2'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
9
44
|
it "should define the @predefined_attributes instance variable" do
|
10
45
|
TestModel.should be_instance_variable_defined(:@predefined_attributes)
|
11
46
|
end
|
12
47
|
|
13
48
|
it "should provide the names of all predefined resources of a Model" do
|
14
|
-
TestModel.
|
49
|
+
TestModel.predefined.should =~ [:test1, :test2]
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should determine if a predefined resource was defined" do
|
53
|
+
TestModel.should be_predefined(:test2)
|
15
54
|
end
|
16
55
|
|
17
56
|
it "should be able to define resources of a Model" do
|
@@ -56,34 +95,33 @@ describe DataMapper::Is::Predefined do
|
|
56
95
|
end
|
57
96
|
end
|
58
97
|
|
59
|
-
describe "
|
98
|
+
describe "first_or_predefined" do
|
60
99
|
it "should find resources based on attributes they share" do
|
61
|
-
test2 = TestModel.
|
100
|
+
test2 = TestModel.first_or_predefined(:name => 'test2', :number => 2)
|
62
101
|
|
63
102
|
test2.name.should == 'test2'
|
64
103
|
end
|
65
104
|
|
66
|
-
it "should
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
105
|
+
it "should allow specifying different query and predefined attributes" do
|
106
|
+
test2 = TestModel.first_or_predefined(
|
107
|
+
{:name.like => '%test2%'},
|
108
|
+
{:name => 'test2', :number => 2}
|
109
|
+
)
|
71
110
|
|
72
|
-
|
73
|
-
lambda {
|
74
|
-
TestModel.predefined_resource_with(:missing => 1, :typo => 'yo')
|
75
|
-
}.should raise_error(DataMapper::Is::Predefined::UnknownResource)
|
111
|
+
test2.name.should == 'test2'
|
76
112
|
end
|
77
113
|
|
78
|
-
it "should
|
79
|
-
|
80
|
-
|
81
|
-
|
114
|
+
it "should return nil if no resource shares any attribute values" do
|
115
|
+
resource = TestModel.first_or_predefined(:number => 100, :optional => 'bla')
|
116
|
+
|
117
|
+
resource.should be_nil
|
82
118
|
end
|
119
|
+
end
|
83
120
|
|
121
|
+
describe "predefined_resource_with" do
|
84
122
|
it "should raise UnknownResource if no resource shares any attribute values" do
|
85
123
|
lambda {
|
86
|
-
TestModel.predefined_resource_with(:number =>
|
124
|
+
TestModel.predefined_resource_with(:number => 100, :optional => 'bla')
|
87
125
|
}.should raise_error(DataMapper::Is::Predefined::UnknownResource)
|
88
126
|
end
|
89
127
|
end
|
metadata
CHANGED
@@ -1,63 +1,60 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-is-predefined
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.0
|
4
5
|
prerelease:
|
5
|
-
version: 0.3.1
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Postmodern
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2011-02-28 00:00:00 -08:00
|
12
|
+
date: 2011-07-28 00:00:00.000000000 -07:00
|
14
13
|
default_executable:
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
17
16
|
name: dm-core
|
18
|
-
requirement: &
|
17
|
+
requirement: &11760400 !ruby/object:Gem::Requirement
|
19
18
|
none: false
|
20
|
-
requirements:
|
19
|
+
requirements:
|
21
20
|
- - ~>
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version:
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '1.0'
|
24
23
|
type: :runtime
|
25
24
|
prerelease: false
|
26
|
-
version_requirements: *
|
27
|
-
- !ruby/object:Gem::Dependency
|
25
|
+
version_requirements: *11760400
|
26
|
+
- !ruby/object:Gem::Dependency
|
28
27
|
name: bundler
|
29
|
-
requirement: &
|
28
|
+
requirement: &11758740 !ruby/object:Gem::Requirement
|
30
29
|
none: false
|
31
|
-
requirements:
|
30
|
+
requirements:
|
32
31
|
- - ~>
|
33
|
-
- !ruby/object:Gem::Version
|
32
|
+
- !ruby/object:Gem::Version
|
34
33
|
version: 1.0.0
|
35
34
|
type: :development
|
36
35
|
prerelease: false
|
37
|
-
version_requirements: *
|
38
|
-
- !ruby/object:Gem::Dependency
|
36
|
+
version_requirements: *11758740
|
37
|
+
- !ruby/object:Gem::Dependency
|
39
38
|
name: yard
|
40
|
-
requirement: &
|
39
|
+
requirement: &11757200 !ruby/object:Gem::Requirement
|
41
40
|
none: false
|
42
|
-
requirements:
|
41
|
+
requirements:
|
43
42
|
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: 0.
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 0.7.0
|
46
45
|
type: :development
|
47
46
|
prerelease: false
|
48
|
-
version_requirements: *
|
47
|
+
version_requirements: *11757200
|
49
48
|
description: A DataMapper plugin for adding predefined resources to Models.
|
50
|
-
email:
|
49
|
+
email:
|
51
50
|
- postmodern.mod3@gmail.com
|
52
51
|
executables: []
|
53
|
-
|
54
52
|
extensions: []
|
55
|
-
|
56
|
-
extra_rdoc_files:
|
53
|
+
extra_rdoc_files:
|
57
54
|
- README.md
|
58
55
|
- ChangeLog.md
|
59
56
|
- LICENSE.txt
|
60
|
-
files:
|
57
|
+
files:
|
61
58
|
- .document
|
62
59
|
- .rspec
|
63
60
|
- .yardopts
|
@@ -71,36 +68,35 @@ files:
|
|
71
68
|
- lib/dm-is-predefined.rb
|
72
69
|
- lib/dm-is-predefined/is/exceptions/unknown_resource.rb
|
73
70
|
- lib/dm-is-predefined/is/predefined.rb
|
71
|
+
- spec/integration/models/migrated_model.rb
|
74
72
|
- spec/integration/models/test_model.rb
|
75
73
|
- spec/integration/predefined_spec.rb
|
76
74
|
- spec/spec_helper.rb
|
77
75
|
has_rdoc: yard
|
78
76
|
homepage: http://github.com/postmodern/dm-is-predefined
|
79
|
-
licenses:
|
77
|
+
licenses:
|
80
78
|
- MIT
|
81
79
|
post_install_message:
|
82
80
|
rdoc_options: []
|
83
|
-
|
84
|
-
require_paths:
|
81
|
+
require_paths:
|
85
82
|
- lib
|
86
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
84
|
none: false
|
88
|
-
requirements:
|
89
|
-
- -
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
version:
|
92
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ! '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
90
|
none: false
|
94
|
-
requirements:
|
95
|
-
- -
|
96
|
-
- !ruby/object:Gem::Version
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
97
94
|
version: 1.3.6
|
98
95
|
requirements: []
|
99
|
-
|
100
96
|
rubyforge_project: dm-is-predefined
|
101
|
-
rubygems_version: 1.
|
97
|
+
rubygems_version: 1.6.2
|
102
98
|
signing_key:
|
103
99
|
specification_version: 3
|
104
100
|
summary: DataMapper plugin for adding predefined resources to models.
|
105
|
-
test_files:
|
101
|
+
test_files:
|
106
102
|
- spec/integration/predefined_spec.rb
|