dm-is-remixable 0.9.8 → 0.9.9
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +14 -1
- data/Manifest.txt +2 -0
- data/README.txt +11 -11
- data/Rakefile +15 -41
- data/TODO +1 -1
- data/lib/dm-is-remixable/is/remixable.rb +11 -7
- data/lib/dm-is-remixable/is/version.rb +1 -1
- data/lib/dm-is-remixable.rb +3 -7
- data/spec/data/commentable.rb +1 -1
- data/spec/data/image.rb +4 -4
- data/spec/integration/remixable_spec.rb +16 -16
- data/spec/spec.opts +0 -1
- data/spec/spec_helper.rb +13 -9
- data/tasks/install.rb +13 -0
- data/tasks/spec.rb +25 -0
- metadata +6 -3
data/History.txt
CHANGED
@@ -1,5 +1,18 @@
|
|
1
|
+
=== 0.9.9 / 2009-01-04
|
2
|
+
|
3
|
+
* 1 bug fix:
|
4
|
+
|
5
|
+
* belongs_to association names are no longer made plural.
|
6
|
+
|
7
|
+
=== 0.9.8 / 2008-12-07
|
8
|
+
|
9
|
+
* 2 minor enhancements:
|
10
|
+
|
11
|
+
* When using :as remixables ONLY create the given accessor instead of creating the default and aliasing it.
|
12
|
+
* Remixable Modules can now namespace methods to remixing classes and generated class.
|
13
|
+
|
1
14
|
=== 0.9.3 / 2008-07-31
|
2
15
|
|
3
|
-
* 1 major enhancement
|
16
|
+
* 1 major enhancement:
|
4
17
|
|
5
18
|
* Pre-Release, super beta.
|
data/Manifest.txt
CHANGED
data/README.txt
CHANGED
@@ -133,38 +133,38 @@ modules are present the are attached appropriately to the other classes.
|
|
133
133
|
module ExampleRemixable
|
134
134
|
include DataMapper::Resource
|
135
135
|
is :remixable
|
136
|
-
|
136
|
+
|
137
137
|
#... your properies ...
|
138
|
-
|
138
|
+
|
139
139
|
# Class methods that will be attached to class doing the remixing...
|
140
|
-
#
|
140
|
+
#
|
141
141
|
# These methods would be attached to the User class given:
|
142
142
|
# User.remixes n, :images
|
143
|
-
#
|
143
|
+
#
|
144
144
|
module RemixerClassMethods
|
145
145
|
end
|
146
|
-
|
146
|
+
|
147
147
|
# Instances methods that will be attached to objects of the class doing the remixing...
|
148
|
-
#
|
148
|
+
#
|
149
149
|
# These methods would be attached to User objects given:
|
150
150
|
# User.remixes n, :images
|
151
151
|
#
|
152
152
|
module RemixerInstanceMethods
|
153
153
|
end
|
154
|
-
|
154
|
+
|
155
155
|
# Class methods that will be attached to genereated remixed class
|
156
|
-
#
|
156
|
+
#
|
157
157
|
# These methods would be attached to the UserImage class given:
|
158
158
|
# User.remixes n, :images
|
159
159
|
#
|
160
160
|
module RemixeeClassMethods
|
161
161
|
end
|
162
|
-
|
162
|
+
|
163
163
|
# Instances methods that will be attached to objects of the genereated remixed class
|
164
|
-
#
|
164
|
+
#
|
165
165
|
# These methods would be attached to UserImage objects given:
|
166
166
|
# User.remixes n, :images
|
167
167
|
#
|
168
168
|
module RemixeeInstanceMethods
|
169
169
|
end
|
170
|
-
end
|
170
|
+
end
|
data/Rakefile
CHANGED
@@ -1,51 +1,25 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'spec'
|
3
|
-
require 'spec/rake/spectask'
|
4
1
|
require 'pathname'
|
2
|
+
require 'rubygems'
|
3
|
+
|
4
|
+
ROOT = Pathname(__FILE__).dirname.expand_path
|
5
|
+
JRUBY = RUBY_PLATFORM =~ /java/
|
6
|
+
WINDOWS = Gem.win_platform?
|
7
|
+
SUDO = (WINDOWS || JRUBY) ? '' : ('sudo' unless ENV['SUDOLESS'])
|
5
8
|
|
6
|
-
ROOT = Pathname(__FILE__).dirname.expand_path
|
7
9
|
require ROOT + 'lib/dm-is-remixable/is/version'
|
8
10
|
|
9
11
|
AUTHOR = "Cory O'Daniel"
|
10
|
-
EMAIL =
|
11
|
-
GEM_NAME =
|
12
|
+
EMAIL = 'dm-is-remixable [a] coryodaniel [d] com'
|
13
|
+
GEM_NAME = 'dm-is-remixable'
|
12
14
|
GEM_VERSION = DataMapper::Is::Remixable::VERSION
|
13
15
|
GEM_DEPENDENCIES = [['dm-core', "~>#{GEM_VERSION}"]]
|
14
|
-
GEM_CLEAN = [
|
15
|
-
GEM_EXTRAS = { :has_rdoc => true, :extra_rdoc_files => %w[ README.txt LICENSE TODO ] }
|
16
|
-
|
17
|
-
PROJECT_NAME = "datamapper"
|
18
|
-
PROJECT_URL = "http://github.com/sam/dm-more/tree/master/dm-is-remixable"
|
19
|
-
PROJECT_DESCRIPTION = PROJECT_SUMMARY = "dm-is-remixable allow you to create reusable data functionality"
|
20
|
-
|
21
|
-
require ROOT.parent + 'tasks/hoe'
|
22
|
-
|
23
|
-
task :default => [ :spec ]
|
24
|
-
|
25
|
-
WIN32 = (RUBY_PLATFORM =~ /win32|mingw|cygwin/) rescue nil
|
26
|
-
SUDO = WIN32 ? '' : ('sudo' unless ENV['SUDOLESS'])
|
27
|
-
|
28
|
-
desc "Install #{GEM_NAME} #{GEM_VERSION}"
|
29
|
-
task :install => [ :package ] do
|
30
|
-
sh "#{SUDO} gem install --local pkg/#{GEM_NAME}-#{GEM_VERSION} --no-ri --no-rdoc --no-update-sources", :verbose => false
|
31
|
-
end
|
32
|
-
|
33
|
-
desc "Uninstall #{GEM_NAME} #{GEM_VERSION} (default ruby)"
|
34
|
-
task :uninstall => [ :clobber ] do
|
35
|
-
sh "#{SUDO} gem uninstall #{GEM_NAME} -v#{GEM_VERSION} -I -x", :verbose => false
|
36
|
-
end
|
16
|
+
GEM_CLEAN = %w[ log pkg coverage ]
|
17
|
+
GEM_EXTRAS = { :has_rdoc => true, :extra_rdoc_files => %w[ README.txt LICENSE TODO History.txt ] }
|
37
18
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
t.spec_files = Pathname.glob((ROOT + 'spec/**/*_spec.rb').to_s)
|
19
|
+
PROJECT_NAME = 'datamapper'
|
20
|
+
PROJECT_URL = "http://github.com/sam/dm-more/tree/master/#{GEM_NAME}"
|
21
|
+
PROJECT_DESCRIPTION = PROJECT_SUMMARY = 'dm-is-remixable allow you to create reusable data functionality'
|
42
22
|
|
43
|
-
|
44
|
-
|
45
|
-
t.rcov_opts << '--exclude' << 'spec'
|
46
|
-
t.rcov_opts << '--text-summary'
|
47
|
-
t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
|
48
|
-
rescue Exception
|
49
|
-
# rcov not installed
|
50
|
-
end
|
23
|
+
[ ROOT, ROOT.parent ].each do |dir|
|
24
|
+
Pathname.glob(dir.join('tasks/**/*.rb').to_s).each { |f| require f }
|
51
25
|
end
|
data/TODO
CHANGED
@@ -55,7 +55,7 @@ module DataMapper
|
|
55
55
|
extend DataMapper::Is::Remixable::RemixeeClassMethods
|
56
56
|
include DataMapper::Is::Remixable::RemixeeInstanceMethods
|
57
57
|
@is_remixable = true
|
58
|
-
|
58
|
+
|
59
59
|
# support clean suffixes for nested modules
|
60
60
|
default_suffix = Extlib::Inflection.demodulize(self.name).singular.snake_case
|
61
61
|
suffix(options.delete(:suffix) || default_suffix)
|
@@ -287,7 +287,7 @@ module DataMapper
|
|
287
287
|
def remix_one_to_many(cardinality, model, options)
|
288
288
|
self.has cardinality, (options[:as] || options[:table_name]).to_sym, :class_name => model.name
|
289
289
|
model.property Extlib::Inflection.foreign_key(self.name).intern, Integer, :nullable => false
|
290
|
-
model.belongs_to
|
290
|
+
model.belongs_to belongs_to_name(self.name)
|
291
291
|
end
|
292
292
|
|
293
293
|
# - remix_many_to_many
|
@@ -309,13 +309,13 @@ module DataMapper
|
|
309
309
|
self.has cardinality, (options[:as] || options[:table_name]).to_sym, :class_name => model.name
|
310
310
|
options[:other_model].has cardinality, options[:table_name].intern
|
311
311
|
|
312
|
-
model.belongs_to
|
313
|
-
model.belongs_to
|
312
|
+
model.belongs_to belongs_to_name(self.name)
|
313
|
+
model.belongs_to belongs_to_name(options[:other_model].name)
|
314
314
|
else
|
315
315
|
raise Exception, "options[:via] must be specified when Remixing a module between two of the same class" unless options[:via]
|
316
316
|
|
317
317
|
self.has cardinality, (options[:as] || options[:table_name]).to_sym, :class_name => model.name
|
318
|
-
model.belongs_to
|
318
|
+
model.belongs_to belongs_to_name(self.name)
|
319
319
|
model.belongs_to options[:via].intern, :class_name => options[:other_model].name, :child_key => ["#{options[:via]}_id".intern]
|
320
320
|
end
|
321
321
|
end
|
@@ -353,16 +353,20 @@ module DataMapper
|
|
353
353
|
if Object.full_const_defined? "#{remixable}::RemixeeInstanceMethods"
|
354
354
|
model.send :include, Object.full_const_get("#{remixable}::RemixeeInstanceMethods")
|
355
355
|
end
|
356
|
-
|
356
|
+
|
357
357
|
model
|
358
358
|
end
|
359
359
|
|
360
|
+
def belongs_to_name(class_name)
|
361
|
+
class_name.to_const_path.gsub(/\//, '_').to_sym
|
362
|
+
end
|
363
|
+
|
360
364
|
end # RemixerClassMethods
|
361
365
|
|
362
366
|
# - RemixeeClassMethods
|
363
367
|
# ==== Description
|
364
368
|
# Methods available to any model that is :remixable
|
365
|
-
module RemixeeClassMethods
|
369
|
+
module RemixeeClassMethods
|
366
370
|
# - suffix
|
367
371
|
# ==== Description
|
368
372
|
# modifies the storage name suffix, which is by default based on the Remixable Module name
|
data/lib/dm-is-remixable.rb
CHANGED
@@ -1,15 +1,11 @@
|
|
1
|
-
# Needed to import datamapper and other gems
|
2
|
-
require 'rubygems'
|
3
1
|
require 'pathname'
|
2
|
+
require 'rubygems'
|
4
3
|
|
5
|
-
|
6
|
-
gem 'dm-core', '~>0.9.7'
|
4
|
+
gem 'dm-core', '~>0.9.9'
|
7
5
|
require 'dm-core'
|
8
6
|
|
9
|
-
|
10
|
-
require Pathname(__FILE__).dirname.expand_path / 'dm-is-remixable' / 'is' / 'remixable.rb'
|
7
|
+
require Pathname(__FILE__).dirname.expand_path / 'dm-is-remixable' / 'is' / 'remixable'
|
11
8
|
|
12
|
-
# Include the plugin in Resource
|
13
9
|
module DataMapper
|
14
10
|
module Resource
|
15
11
|
module ClassMethods
|
data/spec/data/commentable.rb
CHANGED
data/spec/data/image.rb
CHANGED
@@ -6,7 +6,7 @@ module Image
|
|
6
6
|
property :id, Integer, :key => true, :serial => true
|
7
7
|
property :description, String
|
8
8
|
property :path, String
|
9
|
-
|
9
|
+
|
10
10
|
# These methods will be available to the class remixing this module
|
11
11
|
# If 'User' remixes 'Images', these methods will be available to a User class
|
12
12
|
#
|
@@ -15,7 +15,7 @@ module Image
|
|
15
15
|
'CLASS METHOD FOR REMIXER'
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
# These methods will be available to instantiated objects of the remixing this module
|
20
20
|
# If 'User' remixes 'Images', these methods will be available to a User object
|
21
21
|
#
|
@@ -24,7 +24,7 @@ module Image
|
|
24
24
|
'INSTANCE METHOD FOR REMIXER'
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
# These methods will be available to the Generated Remixed Class
|
29
29
|
# If 'User' remixes 'Images', these methods will be available to UserImage class
|
30
30
|
#
|
@@ -33,7 +33,7 @@ module Image
|
|
33
33
|
'CLASS METHOD FOR REMIXEE'
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
# These methods will be available to an instantiated Generated Remixed Class
|
38
38
|
# If 'User' remixes 'Images', these methods will be available to a UserImage object
|
39
39
|
#
|
@@ -213,7 +213,7 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
|
|
213
213
|
user2.comments.length.should be(0)
|
214
214
|
|
215
215
|
comment.commentor.first_name.should == "Testy"
|
216
|
-
|
216
|
+
|
217
217
|
user.comments.length.should be(1)
|
218
218
|
end
|
219
219
|
|
@@ -240,7 +240,7 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
|
|
240
240
|
article.comments.first.should be(ac)
|
241
241
|
user.article_comments.first.should be(ac)
|
242
242
|
end
|
243
|
-
|
243
|
+
|
244
244
|
# Example:
|
245
245
|
# Remixable Image add functionality to any class that remixes it
|
246
246
|
# Image::RemixerClassMethods defines a method called 'total_images' that counts the total number of images for the class
|
@@ -249,17 +249,17 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
|
|
249
249
|
# User.remixes n, :images
|
250
250
|
# User.total_images => count of all images owned by all users
|
251
251
|
# User.first.most_viewed_image => would return the most viewed image
|
252
|
-
#
|
252
|
+
#
|
253
253
|
it "should add a remixables' 'RemixerClassMethods' modules to the remixing class" do
|
254
254
|
Article.respond_to?(:test_remixer_class_method).should be(true)
|
255
255
|
Article.test_remixer_class_method.should == 'CLASS METHOD FOR REMIXER'
|
256
256
|
end
|
257
|
-
|
257
|
+
|
258
258
|
it "should add a remixables' 'RemixerInstanceMethods' modules to the remixing class" do
|
259
259
|
Article.new.respond_to?(:test_remixer_instance_method).should be(true)
|
260
260
|
Article.new.test_remixer_instance_method.should == 'INSTANCE METHOD FOR REMIXER'
|
261
261
|
end
|
262
|
-
|
262
|
+
|
263
263
|
# Example:
|
264
264
|
# Remixable Image add functionality to any class that remixes it
|
265
265
|
# Image::RemixeeClassMethods defines a method called 'damaged_files' would return a list of all images with invalid checksums (or whatev)
|
@@ -274,49 +274,49 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
|
|
274
274
|
ArticleImage.respond_to?(:test_remixee_class_method).should be(true)
|
275
275
|
ArticleImage.test_remixee_class_method.should == 'CLASS METHOD FOR REMIXEE'
|
276
276
|
end
|
277
|
-
|
277
|
+
|
278
278
|
it "should add a remixables' 'RemixeeInstanceMethods' modules to the generated remixed class" do
|
279
279
|
ArticleImage.new.respond_to?(:test_remixee_instance_method).should be(true)
|
280
280
|
ArticleImage.new.test_remixee_instance_method.should == 'INSTANCE METHOD FOR REMIXEE'
|
281
281
|
end
|
282
|
-
|
282
|
+
|
283
283
|
# Example:
|
284
284
|
# User.remixes n, :images, :as => "pics"
|
285
285
|
# User.first.pics would be the acessor for images
|
286
286
|
# User.first.user_images should raise method not found
|
287
287
|
#
|
288
288
|
it 'should remove the original attribute accessor when attaching an optional one' do
|
289
|
-
Article.new.respond_to?(:pics).should be(true)
|
289
|
+
Article.new.respond_to?(:pics).should be(true)
|
290
290
|
User.new.respond_to?(:user_addresses).should be(true)
|
291
291
|
end
|
292
|
-
|
292
|
+
|
293
293
|
# Currently:
|
294
294
|
# Submission.remixes n, :comments
|
295
295
|
# SubmissionComment.new.user = User.first => throws exception, accessor name is 'users' instead
|
296
296
|
#
|
297
297
|
# Example:
|
298
|
-
# User.remix 1, :images
|
298
|
+
# User.remix 1, :images
|
299
299
|
# # => User.image & UserImage.user
|
300
300
|
#
|
301
|
-
# User.remix n, :images
|
301
|
+
# User.remix n, :images
|
302
302
|
# # => User.images & UserImage.user
|
303
|
-
#
|
303
|
+
#
|
304
304
|
# User.remix n, :comments, :for => 'User', :via => 'commentor'
|
305
305
|
# # => User.comments & UserComment.user & UserComment.commentor
|
306
306
|
#
|
307
307
|
it 'should pluralize accessor names with respect to cardinality' do
|
308
308
|
pending
|
309
309
|
end
|
310
|
-
|
310
|
+
|
311
311
|
# Note:
|
312
312
|
# Currently the :via flag allows one to specify another name for the field, but it always appends _id
|
313
|
-
#
|
313
|
+
#
|
314
314
|
# Example:
|
315
315
|
# User w/ PK being 'login_name'
|
316
316
|
# User.remixes n, :comments, :for => 'User', :via => 'commentor'
|
317
|
-
#
|
317
|
+
#
|
318
318
|
# Comment Table:
|
319
|
-
# * id
|
319
|
+
# * id
|
320
320
|
# * text
|
321
321
|
# * user_login_name
|
322
322
|
# * commentor_id #=> should be able to specify it to be commentor_login_name
|
data/spec/spec.opts
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,22 +1,26 @@
|
|
1
|
+
require 'pathname'
|
1
2
|
require 'rubygems'
|
2
|
-
|
3
|
+
|
4
|
+
gem 'rspec', '~>1.1.11'
|
3
5
|
require 'spec'
|
4
|
-
|
5
|
-
|
6
|
+
|
7
|
+
ROOT = Pathname(__FILE__).dirname.parent.expand_path
|
8
|
+
|
9
|
+
# use local dm-types if running from dm-more directly
|
10
|
+
lib = ROOT.parent.join('dm-types', 'lib').expand_path
|
11
|
+
$LOAD_PATH.unshift(lib) if lib.directory?
|
12
|
+
|
13
|
+
require ROOT + 'lib/dm-is-remixable'
|
6
14
|
|
7
15
|
def load_driver(name, default_uri)
|
8
16
|
return false if ENV['ADAPTER'] != name.to_s
|
9
17
|
|
10
|
-
lib = "do_#{name}"
|
11
|
-
|
12
18
|
begin
|
13
|
-
gem lib, '~>0.9.7'
|
14
|
-
require lib
|
15
19
|
DataMapper.setup(name, ENV["#{name.to_s.upcase}_SPEC_URI"] || default_uri)
|
16
20
|
DataMapper::Repository.adapters[:default] = DataMapper::Repository.adapters[name]
|
17
21
|
true
|
18
|
-
rescue
|
19
|
-
warn "Could not load #{
|
22
|
+
rescue LoadError => e
|
23
|
+
warn "Could not load do_#{name}: #{e}"
|
20
24
|
false
|
21
25
|
end
|
22
26
|
end
|
data/tasks/install.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
def sudo_gem(cmd)
|
2
|
+
sh "#{SUDO} #{RUBY} -S gem #{cmd}", :verbose => false
|
3
|
+
end
|
4
|
+
|
5
|
+
desc "Install #{GEM_NAME} #{GEM_VERSION}"
|
6
|
+
task :install => [ :package ] do
|
7
|
+
sudo_gem "install --local pkg/#{GEM_NAME}-#{GEM_VERSION} --no-update-sources"
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Uninstall #{GEM_NAME} #{GEM_VERSION}"
|
11
|
+
task :uninstall => [ :clobber ] do
|
12
|
+
sudo_gem "uninstall #{GEM_NAME} -v#{GEM_VERSION} -Ix"
|
13
|
+
end
|
data/tasks/spec.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
begin
|
2
|
+
gem 'rspec', '~>1.1.11'
|
3
|
+
require 'spec'
|
4
|
+
require 'spec/rake/spectask'
|
5
|
+
|
6
|
+
task :default => [ :spec ]
|
7
|
+
|
8
|
+
desc 'Run specifications'
|
9
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
10
|
+
t.spec_opts << '--options' << 'spec/spec.opts' if File.exists?('spec/spec.opts')
|
11
|
+
t.spec_files = Pathname.glob((ROOT + 'spec/**/*_spec.rb').to_s)
|
12
|
+
|
13
|
+
begin
|
14
|
+
gem 'rcov', '~>0.8'
|
15
|
+
t.rcov = JRUBY ? false : (ENV.has_key?('NO_RCOV') ? ENV['NO_RCOV'] != 'true' : true)
|
16
|
+
t.rcov_opts << '--exclude' << 'spec'
|
17
|
+
t.rcov_opts << '--text-summary'
|
18
|
+
t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
|
19
|
+
rescue LoadError
|
20
|
+
# rcov not installed
|
21
|
+
end
|
22
|
+
end
|
23
|
+
rescue LoadError
|
24
|
+
# rspec not installed
|
25
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-is-remixable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cory O'Daniel
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-01-04 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ~>
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.9.
|
23
|
+
version: 0.9.9
|
24
24
|
version:
|
25
25
|
description: dm-is-remixable allow you to create reusable data functionality
|
26
26
|
email:
|
@@ -33,6 +33,7 @@ extra_rdoc_files:
|
|
33
33
|
- README.txt
|
34
34
|
- LICENSE
|
35
35
|
- TODO
|
36
|
+
- History.txt
|
36
37
|
files:
|
37
38
|
- History.txt
|
38
39
|
- LICENSE
|
@@ -58,6 +59,8 @@ files:
|
|
58
59
|
- spec/integration/remixable_spec.rb
|
59
60
|
- spec/spec.opts
|
60
61
|
- spec/spec_helper.rb
|
62
|
+
- tasks/install.rb
|
63
|
+
- tasks/spec.rb
|
61
64
|
has_rdoc: true
|
62
65
|
homepage: http://github.com/sam/dm-more/tree/master/dm-is-remixable
|
63
66
|
post_install_message:
|