namelessjon-dm-gen 0.1.0 → 0.2.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/lib/dm_gen.rb CHANGED
@@ -21,3 +21,4 @@ dir = File.join(File.dirname(__FILE__), 'generators')
21
21
 
22
22
  require File.join(dir, 'one_file')
23
23
  require File.join(dir, 'is')
24
+ require File.join(dir, 'adapter')
@@ -0,0 +1,54 @@
1
+ module DMGen
2
+ class Adapter < Templater::Generator
3
+ first_argument :name, :required => true
4
+
5
+ desc <<-eos
6
+ Generates a DataMapper Adapter skeleton.
7
+
8
+ Use like
9
+ dm-gen adapter data_source
10
+
11
+ This generates the full plugin structure with skeleton code and specs, as
12
+ well as a Rakefile. All it needs is a README and some real functionality.
13
+ eos
14
+
15
+ def self.source_root
16
+ File.join(File.dirname(__FILE__), '..', 'templates', 'adapter')
17
+ end
18
+
19
+ def gem_name
20
+ "dm-#{adapter_name}"
21
+ end
22
+
23
+ def adapter_name
24
+ "#{snake_name}-adapter"
25
+ end
26
+
27
+ def adapter_file
28
+ "#{snake_name}_adapter"
29
+ end
30
+
31
+ def snake_name
32
+ name.snake_case
33
+ end
34
+
35
+ def class_name
36
+ "#{name.camel_case}Adapter"
37
+ end
38
+
39
+ def destination_root
40
+ File.join(@destination_root, gem_name)
41
+ end
42
+
43
+ # glob the template dir for all templates.
44
+ # since we want text files processed, we have to replace the default
45
+ # extension list.
46
+ glob!('', %w[rb txt Rakefile LICENSE TODO])
47
+
48
+ def manifest_files
49
+ self.all_actions.map {|t| t.destination.gsub(/#{destination_root}\//,'') }.sort
50
+ end
51
+ end
52
+
53
+ add :adapter, Adapter
54
+ end
@@ -0,0 +1,4 @@
1
+ === 0.0.1 / <%= Time.now.strftime('%Y-%m-%d') %>
2
+
3
+ * Release!
4
+
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 John Doe
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.
@@ -0,0 +1 @@
1
+ <%= manifest_files.join("\n") %>
@@ -0,0 +1,3 @@
1
+ = <%= gem_name %>
2
+
3
+ Description of the adapter. What data-store is it for, what is that good for?
@@ -0,0 +1,30 @@
1
+ require 'pathname'
2
+ require 'rubygems'
3
+ require 'hoe'
4
+
5
+ ROOT = Pathname(__FILE__).dirname.expand_path
6
+ JRUBY = RUBY_PLATFORM =~ /java/
7
+ WINDOWS = Gem.win_platform?
8
+ SUDO = (WINDOWS || JRUBY) ? '' : ('sudo' unless ENV['SUDOLESS'])
9
+
10
+ require ROOT + 'lib/<%= adapter_file %>/version'
11
+
12
+ # define some constants to help with task files
13
+ GEM_NAME = '<%= gem_name %>'
14
+ GEM_VERSION = DataMapper::<%= class_name %>::VERSION
15
+
16
+ Hoe.new(GEM_NAME, GEM_VERSION) do |p|
17
+ p.developer('John Doe', 'john [a] doe [d] com')
18
+
19
+ p.description = 'A DataMapper Adapter for ...'
20
+ p.summary = 'A DataMapper Adapter for ...'
21
+ p.url = 'http://github.com/USERNAME/<%= gem_name %>'
22
+
23
+ p.clean_globs |= %w[ log pkg coverage ]
24
+ p.spec_extras = { :has_rdoc => true, :extra_rdoc_files => %w[ README.txt LICENSE TODO History.txt ] }
25
+
26
+ p.extra_deps << [['dm-core', "~> 0.9.10"]]
27
+
28
+ end
29
+
30
+ Pathname.glob(ROOT.join('tasks/**/*.rb').to_s).each { |f| require f }
File without changes
@@ -0,0 +1,5 @@
1
+ module DataMapper
2
+ module <%= class_name %>
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
@@ -0,0 +1,121 @@
1
+ gem 'dm-core', '~>0.9.10'
2
+ require 'dm-core'
3
+
4
+ module DataMapper
5
+ module Adapters
6
+ # The documentation for this adapter was taken from
7
+ #
8
+ # lib/dm-core/adapters/in_memory_adapter.rb
9
+ #
10
+ # Which is intended as a general source of documentation for the
11
+ # implementation to be followed by all DataMapper adapters. The implementor
12
+ # is well advised to read over the adapter before implementing their own.
13
+ #
14
+ class <%= class_name %> < AbstractAdapter
15
+ ##
16
+ # Used by DataMapper to put records into a data-store: "INSERT" in SQL-speak.
17
+ # It takes an array of the resources (model instances) to be saved. Resources
18
+ # each have a key that can be used to quickly look them up later without
19
+ # searching, if the adapter supports it.
20
+ #
21
+ # @param [Array<DataMapper::Resource>] resources
22
+ # The set of resources (model instances)
23
+ #
24
+ # @return [Integer]
25
+ # The number of records that were actually saved into the data-store
26
+ #
27
+ # @api semipublic
28
+ def create(resources)
29
+ raise NotImplementedError
30
+ end
31
+
32
+ ##
33
+ # Used by DataMapper to update the attributes on existing records in a
34
+ # data-store: "UPDATE" in SQL-speak. It takes a hash of the attributes
35
+ # to update with, as well as a query object that specifies which resources
36
+ # should be updated.
37
+ #
38
+ # @param [Hash] attributes
39
+ # A set of key-value pairs of the attributes to update the resources with.
40
+ # @param [DataMapper::Query] query
41
+ # The query that should be used to find the resource(s) to update.
42
+ #
43
+ # @return [Integer]
44
+ # the number of records that were successfully updated
45
+ #
46
+ # @api semipublic
47
+ def update(attributes, query)
48
+ raise NotImplementedError
49
+ end
50
+
51
+ ##
52
+ # Look up a single record from the data-store. "SELECT ... LIMIT 1" in SQL.
53
+ # Used by Model#get to find a record by its identifier(s), and Model#first
54
+ # to find a single record by some search query.
55
+ #
56
+ # @param [DataMapper::Query] query
57
+ # The query to be used to locate the resource.
58
+ #
59
+ # @return [DataMapper::Resource]
60
+ # A Resource object representing the record that was found, or nil for no
61
+ # matching records.
62
+ #
63
+ # @api semipublic
64
+ def read_one(query)
65
+ raise NotImplementedError
66
+ end
67
+
68
+ ##
69
+ # Looks up a collection of records from the data-store: "SELECT" in SQL.
70
+ # Used by Model#all to search for a set of records; that set is in a
71
+ # DataMapper::Collection object.
72
+ #
73
+ # @param [DataMapper::Query] query
74
+ # The query to be used to seach for the resources
75
+ #
76
+ # @return [DataMapper::Collection]
77
+ # A collection of all the resources found by the query.
78
+ #
79
+ # @api semipublic
80
+ def read_many(query)
81
+ raise NotImplementedError
82
+ end
83
+
84
+ ##
85
+ # Destroys all the records matching the given query. "DELETE" in SQL.
86
+ #
87
+ # @param [DataMapper::Query] query
88
+ # The query used to locate the resources to be deleted.
89
+ #
90
+ # @return [Integer]
91
+ # The number of records that were deleted.
92
+ #
93
+ # @api semipublic
94
+ def delete(query)
95
+ raise NotImplementedError
96
+ end
97
+
98
+ private
99
+
100
+ ##
101
+ # Make a new instance of the adapter. The @model_records ivar is the 'data-store'
102
+ # for this adapter. It is not shared amongst multiple incarnations of this
103
+ # adapter, eg DataMapper.setup(:default, :adapter => :in_memory);
104
+ # DataMapper.setup(:alternate, :adapter => :in_memory) do not share the
105
+ # data-store between them.
106
+ #
107
+ # @param [String, Symbol] name
108
+ # The name of the DataMapper::Repository using this adapter.
109
+ # @param [String, Hash] uri_or_options
110
+ # The connection uri string, or a hash of options to set up
111
+ # the adapter
112
+ #
113
+ # @api semipublic
114
+ def initialize(name, uri_or_options)
115
+ super
116
+ @identity_maps = {}
117
+ end
118
+
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,6 @@
1
+ require 'pathname'
2
+ require Pathname(__FILE__).dirname.expand_path.parent + 'spec_helper'
3
+
4
+ describe 'DataMapper::Adapters::<%= class_name %>' do
5
+
6
+ end
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,10 @@
1
+ require 'pathname'
2
+ require 'rubygems'
3
+
4
+ gem 'rspec', '~>1.1.11'
5
+ require 'spec'
6
+
7
+ require Pathname(__FILE__).dirname.expand_path.parent + 'lib/<%= adapter_file %>'
8
+
9
+ DataMapper.setup(:default, "<%= name %>://some/uri/here")
10
+
@@ -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
@@ -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
@@ -0,0 +1,96 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "DMGen::Adapter" do
4
+ before do
5
+ @generator = DMGen::Adapter.new('/tmp', {}, 'awesome')
6
+ end
7
+
8
+ # basic file creation.
9
+ it "creates a Rakefile" do
10
+ @generator.should create('/tmp/dm-awesome-adapter/Rakefile')
11
+ end
12
+ it "creates the lib folder layout" do
13
+ @generator.should create('/tmp/dm-awesome-adapter/lib/awesome_adapter.rb')
14
+ @generator.should create('/tmp/dm-awesome-adapter/lib/awesome_adapter/version.rb')
15
+ end
16
+ it "creates the spec folder layout" do
17
+ @generator.should create('/tmp/dm-awesome-adapter/spec/integration/awesome_adapter_spec.rb')
18
+ @generator.should create('/tmp/dm-awesome-adapter/spec/spec.opts')
19
+ @generator.should create('/tmp/dm-awesome-adapter/spec/spec_helper.rb')
20
+ end
21
+ it "creates a README" do
22
+ @generator.should create('/tmp/dm-awesome-adapter/README.txt')
23
+ end
24
+ it "creates a History file" do
25
+ @generator.should create('/tmp/dm-awesome-adapter/History.txt')
26
+ end
27
+ it "creates a LICENSE" do
28
+ @generator.should create('/tmp/dm-awesome-adapter/LICENSE')
29
+ end
30
+ it "creates a Manifest for Hoe" do
31
+ @generator.should create('/tmp/dm-awesome-adapter/Manifest.txt')
32
+ end
33
+ it "creates a TODO list" do
34
+ @generator.should create('/tmp/dm-awesome-adapter/TODO')
35
+ end
36
+ it "creates support tasks" do
37
+ @generator.should create('/tmp/dm-awesome-adapter/tasks/spec.rb')
38
+ @generator.should create('/tmp/dm-awesome-adapter/tasks/install.rb')
39
+ end
40
+
41
+ describe "Manifest.txt" do
42
+ before do
43
+ @template = @generator.template(:manifest_txt)
44
+ @result = @template.render
45
+ end
46
+
47
+ it "contains itself" do
48
+ @result.should.be.a.match(/^Manifest.txt$/)
49
+ end
50
+
51
+ end
52
+
53
+ describe "version.rb" do
54
+ before do
55
+ @template = @generator.template(:lib_adapter_file_version_rb)
56
+ @result = @template.render
57
+ end
58
+
59
+ it "generates the correct output" do
60
+ @result.should.include(<<-eos)
61
+ module DataMapper
62
+ module AwesomeAdapter
63
+ VERSION = '0.0.1'
64
+ end
65
+ end
66
+ eos
67
+ end
68
+ end
69
+
70
+ describe "spec/spec_helper.rb" do
71
+ before do
72
+ @template = @generator.template(:spec_spec_helper_rb)
73
+ @result = @template.render
74
+ end
75
+
76
+ it "contains a connection string for the new adapter" do
77
+ @result.should.include('DataMapper.setup(:default, "awesome://some/uri/here")')
78
+ end
79
+
80
+ it "requires the adapter library" do
81
+ @result.should.be.a.match(/require .*lib\/awesome_adapter/)
82
+ end
83
+
84
+ end
85
+
86
+ describe "Rakefile" do
87
+ before do
88
+ @template = @generator.template(:rakefile)
89
+ @result = @template.render
90
+ end
91
+
92
+ it "requires the version file" do
93
+ @result.should.include(%q{require ROOT + 'lib/awesome_adapter/version'})
94
+ end
95
+ end
96
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: namelessjon-dm-gen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Stott
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-20 00:00:00 -08:00
12
+ date: 2009-01-21 00:00:00 -08:00
13
13
  default_executable: dm-gen
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -55,14 +55,35 @@ files:
55
55
  - lib/templates/is/tasks
56
56
  - lib/templates/is/tasks/install.rb
57
57
  - lib/templates/is/tasks/spec.rb
58
+ - lib/templates/adapter
59
+ - lib/templates/adapter/History.txt
60
+ - lib/templates/adapter/LICENSE
61
+ - lib/templates/adapter/Manifest.txt
62
+ - lib/templates/adapter/README.txt
63
+ - lib/templates/adapter/Rakefile
64
+ - lib/templates/adapter/TODO
65
+ - lib/templates/adapter/lib
66
+ - lib/templates/adapter/lib/%adapter_file%.rb
67
+ - lib/templates/adapter/lib/%adapter_file%
68
+ - lib/templates/adapter/lib/%adapter_file%/version.rb
69
+ - lib/templates/adapter/spec
70
+ - lib/templates/adapter/spec/integration
71
+ - lib/templates/adapter/spec/integration/%adapter_file%_spec.rb
72
+ - lib/templates/adapter/spec/spec.opts
73
+ - lib/templates/adapter/spec/spec_helper.rb
74
+ - lib/templates/adapter/tasks
75
+ - lib/templates/adapter/tasks/install.rb
76
+ - lib/templates/adapter/tasks/spec.rb
58
77
  - lib/generators
59
78
  - lib/generators/one_file.rb
60
79
  - lib/generators/is.rb
80
+ - lib/generators/adapter.rb
61
81
  - lib/dm_gen.rb
62
82
  - spec/dm_gen_spec.rb
63
83
  - spec/spec_helper.rb
64
84
  - spec/one_file_spec.rb
65
85
  - spec/is_plugin_spec.rb
86
+ - spec/adapter_spec.rb
66
87
  has_rdoc: true
67
88
  homepage: http://github.com/namelessjon/dm-gen
68
89
  post_install_message: