datamapper4rails 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/History.txt +6 -0
  2. data/Manifest.txt +37 -0
  3. data/README.txt +151 -0
  4. data/Rakefile +48 -0
  5. data/datamapper_rails_templates.rb +114 -0
  6. data/generators/datamapper_install/datamapper_install_generator.rb +12 -0
  7. data/generators/datamapper_install/templates/datamapper.rake +88 -0
  8. data/generators/datamapper_model/datamapper_model_generator.rb +18 -0
  9. data/generators/datamapper_model/templates/migration.rb +18 -0
  10. data/generators/datamapper_model/templates/model.rb +14 -0
  11. data/generators/datamapper_rspec_model/datamapper_rspec_model_generator.rb +18 -0
  12. data/generators/datamapper_rspec_model/templates/model_spec.rb +44 -0
  13. data/generators/datamapper_rspec_scaffold/datamapper_rspec_scaffold_generator.rb +20 -0
  14. data/generators/datamapper_rspec_scaffold/templates/controller_spec.rb +171 -0
  15. data/generators/datamapper_rspec_scaffold/templates/edit_erb_spec.rb +25 -0
  16. data/generators/datamapper_scaffold/datamapper_scaffold_generator.rb +31 -0
  17. data/generators/datamapper_scaffold/templates/controller.rb +90 -0
  18. data/generators/datamapper_scaffold/templates/functional_test.rb +49 -0
  19. data/generators/datamapper_scaffold/templates/view_edit.html.erb +18 -0
  20. data/generators/datamapper_scaffold/templates/view_index.html.erb +24 -0
  21. data/generators/datamapper_scaffold/templates/view_new.html.erb +17 -0
  22. data/generators/datamapper_scaffold/templates/view_show.html.erb +10 -0
  23. data/lib/datamapper4rails.rb +14 -0
  24. data/lib/datamapper4rails/adapters/base_adapter.rb +198 -0
  25. data/lib/datamapper4rails/adapters/restful_adapter.rb +320 -0
  26. data/lib/datamapper4rails/datamapper_store.rb +28 -0
  27. data/lib/datamapper4rails/identity_maps.rb +25 -0
  28. data/lib/datamapper4rails/integration_test.rb +45 -0
  29. data/lib/datamapper4rails/overlay.rb +69 -0
  30. data/lib/datamapper4rails/preload_models.rb +26 -0
  31. data/lib/datamapper4rails/restful_transactions.rb +43 -0
  32. data/lib/datamapper4rails/rspec.rb +8 -0
  33. data/lib/datamapper4rails/rspec_default_values.rb +23 -0
  34. data/lib/datamapper4rails/version.rb +3 -0
  35. data/spec/datamapper_store_spec.rb +23 -0
  36. data/spec/spec.opts +1 -0
  37. data/spec/spec_helper.rb +34 -0
  38. metadata +124 -0
@@ -0,0 +1,6 @@
1
+ === 1.0.0 / 2009-03-18
2
+
3
+ * 1 major enhancement
4
+
5
+ * Birthday!
6
+
@@ -0,0 +1,37 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ datamapper_rails_templates.rb
6
+ generators/datamapper_install/datamapper_install_generator.rb
7
+ generators/datamapper_install/templates/datamapper.rake
8
+ generators/datamapper_model/datamapper_model_generator.rb
9
+ generators/datamapper_model/templates/migration.rb
10
+ generators/datamapper_model/templates/model.rb
11
+ generators/datamapper_rspec_model/datamapper_rspec_model_generator.rb
12
+ generators/datamapper_rspec_model/templates/model_spec.rb
13
+ generators/datamapper_rspec_scaffold/datamapper_rspec_scaffold_generator.rb
14
+ generators/datamapper_rspec_scaffold/templates/controller_spec.rb
15
+ generators/datamapper_rspec_scaffold/templates/edit_erb_spec.rb
16
+ generators/datamapper_scaffold/datamapper_scaffold_generator.rb
17
+ generators/datamapper_scaffold/templates/controller.rb
18
+ generators/datamapper_scaffold/templates/functional_test.rb
19
+ generators/datamapper_scaffold/templates/view_edit.html.erb
20
+ generators/datamapper_scaffold/templates/view_index.html.erb
21
+ generators/datamapper_scaffold/templates/view_new.html.erb
22
+ generators/datamapper_scaffold/templates/view_show.html.erb
23
+ lib/datamapper4rails.rb
24
+ lib/datamapper4rails/adapters/base_adapter.rb
25
+ lib/datamapper4rails/adapters/restful_adapter.rb
26
+ lib/datamapper4rails/datamapper_store.rb
27
+ lib/datamapper4rails/integration_test.rb
28
+ lib/datamapper4rails/identity_maps.rb
29
+ lib/datamapper4rails/overlay.rb
30
+ lib/datamapper4rails/preload_models.rb
31
+ lib/datamapper4rails/restful_transactions.rb
32
+ lib/datamapper4rails/rspec_default_values.rb
33
+ lib/datamapper4rails/rspec.rb
34
+ lib/datamapper4rails/version.rb
35
+ spec/datamapper_store_spec.rb
36
+ spec/spec.opts
37
+ spec/spec_helper.rb
@@ -0,0 +1,151 @@
1
+ = datamapper4rails
2
+
3
+ * http://datamapper4rail.rubyforge.org
4
+ * http://github.org/mkristian/datamapper4rails
5
+
6
+ == DESCRIPTION:
7
+
8
+ collection of datamapper related extensions. mostly needed to run within rails. the restful transactions is around filter for rails actions if needed to control such transaction on per action base otherwise use the rack extension from rack-datamapper. datamapper store is a session store for rails which uses datamapper as persistent layer and is just a wrapper around the datamapper session store from rack-datamapper. the generators produces datamapper models for your rails application.
9
+
10
+ == FEATURES/PROBLEMS:
11
+
12
+ * the generators introduce an "overlay" of templates. with that a generator can reuse the generator code and just replace one or more templates. i.e. datamapper_model just replaces the model.rb template to produce model using datamapper.
13
+
14
+ == SYNOPSIS:
15
+
16
+ === restful transaction
17
+
18
+ wraps all modifying requests (POST, PUT, DELETE) into a transaction. any error/exception as well render of a page will rollback the transaction. typically if a POST, PUT or DELETE succeeds then a redirect gets send back to browser.
19
+
20
+ credits of the main idea goes to http://www.redhillonrails.org
21
+
22
+ is implemented as around filter in rails and gets prepend to the filters of the action_controller of rails
23
+
24
+ require 'datamapper4rails/restful_transations'
25
+
26
+ === restful transactions, transactions or identity_maps from rack-datamapper
27
+
28
+ inside rails add something like this to your config
29
+
30
+ config.middleware.use 'DataMapper::IdentityMaps'
31
+ config.middleware.use 'DataMapper::RestfulTransactions'
32
+
33
+ or add the repository name to it if you want something else then :default
34
+
35
+ config.middleware.use 'DataMapper::IdentityMaps', :ldap
36
+ config.middleware.use 'DataMapper::RestfulTransactions', :users
37
+
38
+
39
+ === datamapper session store
40
+
41
+ add in your config/initializers/session.rb
42
+
43
+ ActionController::Base.session_store = :datamapper_store
44
+
45
+ in case you need a memory cache for your sessions on top of it add the following. but be aware that there is no cleanup of the memory session.
46
+
47
+ ActionController::Base.session = { :cache => true }
48
+
49
+ === generators for datamapper models
50
+
51
+ IMPORTANT: datamapper_scaffold generate valid application code but the test do NOT run due to missing fixtures with datamapper. the rspec version works well though.
52
+
53
+ * datamapper-install: rake task for datamapper with automigrate, autoupgrade and migrate
54
+ * datamapper_model
55
+ * datamapper_rspec_model
56
+ * datamapper_scaffold
57
+ * datamapper_rspec_scaffold
58
+
59
+ the last four generators follow the parameters of the underlying generator:
60
+ generator_name model_name [[attribute_name:attribute_type] ...]
61
+
62
+ to use the overlay write the generator like this
63
+
64
+ class MyModelGenerator < ModelGenerator
65
+ def manifest
66
+ overlay_dirs.add_generator("model")
67
+ super
68
+ end
69
+ end
70
+
71
+ and put whatever templates you want to overwrite in your templates directory, i.e. all your models need to have nice to_s methods.
72
+
73
+ === patch for the rspec-rails gem
74
+
75
+ add a file like spec/support/datamapper with
76
+
77
+ require 'datamapper4rails/rspec'
78
+
79
+ this allows rspec to stub_model with datamapper
80
+
81
+ === restful adapter
82
+
83
+ DEPRECATED
84
+ this comes partly from dm-ldap-adapter and partly from dm-more/adapter/rest_adapter. the restful adapter allows to Create, Retrieve, Update and Delete resources via a restful service.
85
+
86
+ == rails template
87
+
88
+ there is a rails template 'datamapper_rails_templates.rb' in root of the gem - do not know where and how to pack it. the latest I keep on 'github.org/jeremy/rails-templates'
89
+
90
+ === to test the template there is helper class
91
+
92
+ task :integration_tests => [:install] do
93
+ require 'datamapper4rails/integration_test'
94
+ Datamapper4Rails::IntegrationTest.new do |t|
95
+ t.rails_template = 'my_template.rb'
96
+ t.directory = 'tmp' # defaults to tmp and is also the generated application name
97
+ t.generate "datamapper_model role name:string"
98
+ t.generate "datamapper_scaffold domain name:string"
99
+ t.generate "datamapper_rspec_model user name:string"
100
+ t.generate "datamapper_rspec_scaffold group name:string"
101
+ end
102
+ end
103
+
104
+ == more examples
105
+
106
+ just run 'rake integration' and have a look at the sample rails application in 'tmp'
107
+
108
+ == jruby
109
+
110
+ at the time of writing there is a bug/restriction in rails which prevents unpacked gems with java extension or version number postfixed with '-java' to work.
111
+
112
+ if you are familiar with maven (maven.apache.org) you can use the maven plugin from github.org/mkristian/rails-maven-plugin to freeze rails gems and patch it in place
113
+
114
+ mvn de.saumya.mojo:rails-maven-plugin:rails-freeze-gems
115
+
116
+ the 'rake integration_tests' does not work due to the fact that generating rails with a template falls back to native ruby for certain tasks which will fail due to missing (java) gems.
117
+
118
+ same is true for using the rails template. in case you want to use a rails template directly with jruby consider the rails-maven-plugin which can setup a mavenized rails application with the help of rails templates.
119
+
120
+ == REQUIREMENTS:
121
+
122
+ * rails_datamapper, rack-datamapper
123
+
124
+ == INSTALL:
125
+
126
+ * sudo gem install datamapper4rails
127
+
128
+ == LICENSE:
129
+
130
+ (The MIT License)
131
+
132
+ Copyright (c) 2009 Kristian Meier
133
+
134
+ Permission is hereby granted, free of charge, to any person obtaining
135
+ a copy of this software and associated documentation files (the
136
+ 'Software'), to deal in the Software without restriction, including
137
+ without limitation the rights to use, copy, modify, merge, publish,
138
+ distribute, sublicense, and/or sell copies of the Software, and to
139
+ permit persons to whom the Software is furnished to do so, subject to
140
+ the following conditions:
141
+
142
+ The above copyright notice and this permission notice shall be
143
+ included in all copies or substantial portions of the Software.
144
+
145
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
146
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
147
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
148
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
149
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
150
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
151
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,48 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+
6
+ require 'spec'
7
+ require 'spec/rake/spectask'
8
+ require 'pathname'
9
+
10
+ require './lib/datamapper4rails/version.rb'
11
+
12
+ Hoe.new('datamapper4rails', Datamapper4rails::VERSION) do |p|
13
+ p.rubyforge_name = 'datamapper4rail'
14
+ p.developer('mkristian', 'm.kristian@web.de')
15
+ p.extra_deps = [['rack-datamapper', '~>0.2'], 'rails_datamapper']
16
+ p.remote_rdoc_dir = '' # Release to root
17
+ end
18
+
19
+ desc 'Install the package as a gem.'
20
+ task :install => [:clean, :package] do
21
+ gem = Dir['pkg/*.gem'].first
22
+ sh "gem install --local #{gem} --no-ri --no-rdoc"
23
+ end
24
+
25
+ desc 'Run specifications'
26
+ Spec::Rake::SpecTask.new(:spec) do |t|
27
+ if File.exists?('spec/spec.opts')
28
+ t.spec_opts << '--options' << 'spec/spec.opts'
29
+ end
30
+ t.spec_files = Pathname.glob('./spec/**/*_spec.rb')
31
+ end
32
+
33
+ desc 'generate rails using all generators and run the specs'
34
+ task :integration_tests => [:spec, :install] do
35
+ require 'datamapper4rails/integration_test'
36
+ Datamapper4Rails::IntegrationTest.new do |t|
37
+ t.generate "datamapper_model role name:string"
38
+ t.generate "datamapper_scaffold domain name:string"
39
+ t.generate "datamapper_rspec_model user name:string"
40
+ t.generate "datamapper_rspec_scaffold group name:string"
41
+ end
42
+ end
43
+
44
+ require 'yard'
45
+
46
+ YARD::Rake::YardocTask.new
47
+
48
+ # vim: syntax=Ruby
@@ -0,0 +1,114 @@
1
+ # inspired by http://www.rowtheboat.com/archives/32
2
+ ###################################################
3
+
4
+ # get all datamapper related gems
5
+ gem "addressable", :lib => "addressable/uri"
6
+
7
+ # assume sqlite3 to be database
8
+ gem "do_sqlite3"
9
+
10
+ # assume you want to have validations and timestamps in your models
11
+ gem 'dm-validations'
12
+ gem 'dm-timestamps'
13
+ gem 'dm-migrations'
14
+ gem 'dm-serializer' # to allow xml interface to work
15
+
16
+ # assume you prefer rspec over unit tests
17
+ gem "rspec", :lib => false
18
+ gem "rspec-rails", :lib => false
19
+
20
+ # this pulls in rails_datamapper and rack_datamapper
21
+ gem "datamapper4rails"
22
+
23
+ # install all gems
24
+ rake "gems:install"
25
+
26
+ # install specs rake tasks
27
+ generate("rspec", "-f")
28
+
29
+ # install datamapper rake tasks
30
+ generate("datamapper_install")
31
+
32
+ # fix config files to work with datamapper instead of active_record
33
+ environment ""
34
+ environment "config.frameworks -= [ :active_record ]"
35
+ environment "# deactive active_record"
36
+ gsub_file 'spec/spec_helper.rb', /^\s*config[.]/, ' #\0'
37
+ gsub_file 'test/test_helper.rb', /^[^#]*fixtures/, ' #\0'
38
+
39
+ file 'spec/support/datamapper.rb', <<-CODE
40
+ require 'datamapper4rails/rspec'
41
+ CODE
42
+
43
+ # add middleware
44
+ def middleware(name)
45
+ log "middleware", name
46
+ environment "config.middleware.use '#{name}'"
47
+ end
48
+
49
+ environment ""
50
+ middleware "DataMapper::RestfulTransactions"
51
+ middleware "DataMapper::IdentityMaps"
52
+ middleware "Rack::Deflater"
53
+ environment "# add middleware"
54
+
55
+
56
+ # init a session store
57
+ initializer 'datamapper_store.rb', <<-CODE
58
+ # init a session store which uses a memory cache and a persistent store
59
+ # cleanup can be a problem. jruby uses soft-references for the cache so
60
+ # memory cleanup with jruby is not a problem.
61
+ require 'ixtlan/session'
62
+ ActionController::Base.session_store = :datamapper_store
63
+ ActionController::Base.session = {
64
+ :cache => true,
65
+ }
66
+ CODE
67
+
68
+ # gzip fix for jruby
69
+ initializer 'monkey_patches.rb', <<-CODE
70
+ if RUBY_PLATFORM =~ /java/
71
+ require 'zlib'
72
+ class Zlib::GzipWriter
73
+ def <<(arg)
74
+ write(arg)
75
+ end
76
+ end
77
+ end
78
+ CODE
79
+
80
+ file 'prepare_jruby.sh', <<-CODE
81
+ #!/bin/bash
82
+
83
+ echo
84
+ echo "shall freeze rails and fix a bug which prevents rails to use certain"
85
+ echo "java gems like the dataobjects drivers !!"
86
+ echo
87
+
88
+ mvn --version
89
+ if [ $? -ne 0 ] ; then
90
+
91
+ echo "please install maven >= 2.0.9 from maven.apache.org"
92
+ exit -1
93
+ fi
94
+
95
+ mvn de.saumya.mojo:rails-maven-plugin:rails-freeze-gems de.saumya.mojo:rails-maven-plugin:gems-install
96
+
97
+ echo
98
+ echo "you can run rails with (no need to install jruby !!)"
99
+ echo
100
+ echo "\tmvn de.saumya.mojo:rails-maven-plugin:server"
101
+ echo
102
+ echo "more info on"
103
+ echo "\thttp://github.org/mkristian/rails-maven-plugin"
104
+ echo
105
+ CODE
106
+
107
+ rake 'db:sessions:create'
108
+
109
+ logger.info
110
+ logger.info
111
+ logger.info "info mavenized rails application"
112
+ logger.info "\thttp://github.org/mkristian/rails-maven-plugin"
113
+ logger.info
114
+ logger.info
@@ -0,0 +1,12 @@
1
+ require 'rails_generator/base'
2
+
3
+ class DatamapperInstallGenerator < Rails::Generator::Base
4
+
5
+ def manifest
6
+ record do |m|
7
+ m.directory 'lib/tasks'
8
+ m.template 'datamapper.rake', 'lib/tasks/datamapper.rake'
9
+ end
10
+ end
11
+
12
+ end
@@ -0,0 +1,88 @@
1
+ # this file is from dm-more/rails_datamapper
2
+ # add adjusted to use the rack_datamapper session store
3
+
4
+ # Monkey patch to allow overriding defined rake tasks (instead of
5
+ # adding to them, which is the default behaviour when specifying tasks
6
+ # >1 times).
7
+
8
+ Rake::TaskManager.class_eval do
9
+ def remove_task(task_name)
10
+ @tasks.delete(task_name.to_s)
11
+ end
12
+ end
13
+
14
+ def remove_task(task_name)
15
+ returning Rake.application do |app|
16
+ app.remove_task(app[task_name].name)
17
+ end
18
+ end
19
+
20
+ # Until AR/DM co-existence becomes practically possible, presume
21
+ # mutual exclusivity between the two. Thus we wipe all pre-existing
22
+ # db tasks which we assume to be ActiveRecord-based and thus won't
23
+ # work).
24
+
25
+ Rake.application.tasks.select do |t|
26
+ t.class == Rake::Task && t.name.starts_with?("db")
27
+ end.each { |t| remove_task(t.name) }
28
+
29
+ namespace :db do
30
+
31
+ desc 'Perform automigration'
32
+ task :automigrate => :environment do
33
+ FileList["app/models/**/*.rb"].each do |model|
34
+ load model
35
+ end
36
+ ::DataMapper.auto_migrate!
37
+ end
38
+
39
+ desc 'Perform non destructive automigration'
40
+ task :autoupgrade => :environment do
41
+ FileList["app/models/**/*.rb"].each do |model|
42
+ load model
43
+ end
44
+ ::DataMapper.auto_upgrade!
45
+ end
46
+
47
+ # this is needed for rspec and test tasks
48
+ namespace :test do
49
+ RAILS_ENV = 'test'
50
+ task :prepare => :automigrate
51
+ end
52
+
53
+ namespace :migrate do
54
+ task :load => :environment do
55
+ require 'dm-migrations/migration_runner'
56
+ FileList['db/migrate/*.rb'].each do |migration|
57
+ load migration
58
+ end
59
+ end
60
+
61
+ desc 'Migrate up using migrations'
62
+ task :up, :version, :needs => :load do |t, args|
63
+ version = args[:version]
64
+ migrate_up!(version)
65
+ end
66
+
67
+ desc 'Migrate down using migrations'
68
+ task :down, :version, :needs => :load do |t, args|
69
+ version = args[:version]
70
+ migrate_down!(version)
71
+ end
72
+ end
73
+
74
+ desc 'Migrate the database to the latest version'
75
+ task :migrate => 'db:migrate:up'
76
+
77
+ namespace :sessions do
78
+ desc "Creates the sessions table for rack DataMapperStore (works only with the default session class)"
79
+ task :create => :environment do
80
+ ::DataMapper::Session::Abstract::Session.auto_migrate!
81
+ end
82
+
83
+ desc "Clear the sessions table for rack DataMapperStore (works only with the default session class)"
84
+ task :clear => :environment do
85
+ ::DataMapper::Session::Abstract::Session.all.destroy!
86
+ end
87
+ end
88
+ end