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,28 @@
1
+ require 'dm-core'
2
+ require 'rack_datamapper/session/datamapper'
3
+ require 'active_support'
4
+
5
+ module ActionController
6
+ module Session
7
+ class DatamapperStore < AbstractStore
8
+
9
+ def initialize(app, options = {})
10
+ super
11
+ id_generator = Proc.new do
12
+ ::ActiveSupport::SecureRandom.hex(16)
13
+ end
14
+ @store = ::DataMapper::Session::Abstract::Store.new(app, options, id_generator)
15
+ @options = options
16
+ end
17
+
18
+ private
19
+ def get_session(env, sid)
20
+ @store.get_session(env, sid)
21
+ end
22
+
23
+ def set_session(env, sid, session_data)
24
+ @store.set_session(env, sid, session_data, @options)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ module Datamapper4rails
2
+ module IdentityMaps
3
+
4
+ warn "deprecated use the one from rack-datamapper instead"
5
+
6
+ module Base
7
+ def self.included(base)
8
+ base.prepend_around_filter(IdentityMapFilter)
9
+ end
10
+ end
11
+
12
+ class IdentityMapFilter
13
+
14
+ def self.filter(controller)
15
+ DataMapper.repository(:default) do |*block_args|
16
+ if block_given?
17
+ yield (*block_args)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ ::ActionController::Base.send(:include, Datamapper4rails::IdentityMaps::Base)
@@ -0,0 +1,45 @@
1
+ module Datamapper4Rails
2
+ class IntegrationTest
3
+
4
+ attr_accessor :generator_args
5
+
6
+ attr_accessor :rails_template
7
+
8
+ attr_accessor :directory
9
+
10
+ def initialize
11
+ @ruby = RUBY_PLATFORM =~ /java/ ? 'jruby' : 'ruby'
12
+ @directory = 'tmp'
13
+ @generator_args = []
14
+ @rails_template = 'datamapper_rails_templates.rb'
15
+ yield self if block_given?
16
+ execute
17
+ end
18
+
19
+ def generate(*args)
20
+ @generator_args << args.join(" ")
21
+ end
22
+
23
+ def execute
24
+ FileUtils.rm_rf(@directory)
25
+ run("-S rails -fm #{rails_template} #{directory}")
26
+ FileUtils.cd(@directory) do
27
+ @generator_args.each do |arg|
28
+ run("script/generate #{arg}")
29
+ end
30
+ run("-S rake spec")
31
+ #run("-S rake test:units")
32
+ end
33
+
34
+ end
35
+
36
+ def run(command)
37
+ unless system("#{@ruby} #{command}")
38
+ puts
39
+ puts "error in: #{@ruby} #{command}"
40
+ exit 1
41
+ end
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,69 @@
1
+ require 'rails_generator/base'
2
+
3
+ # this extension allows to reuse generators from other gems by defining
4
+ # a search path (list of overlay directories) for template files. these
5
+ # overlay directories have preference to the rails template search algorithm.
6
+ # the overlay directories can be also given via command line options.
7
+
8
+ Rails::Generator::NamedBase.class_eval do
9
+
10
+ def overlay_array
11
+ a = []
12
+ def a.lookup(clazz)
13
+ @clazz = clazz
14
+ end
15
+ a.lookup(self.class)
16
+ def a.add_generator(generator_name)
17
+ unless frozen?
18
+ path = File.join(@clazz.lookup(generator_name).path, 'templates')
19
+ push(path) unless member? path
20
+ end
21
+ end
22
+ a
23
+ end
24
+
25
+ def overlay_dirs
26
+ options[:overlay_dirs] ||= overlay_array
27
+ end
28
+
29
+ def add_options!(opt)
30
+ # TODO this seems not to work anymore !!
31
+ super
32
+ opt.on("--overlay-dir DIR",
33
+ "overlay") do |v|
34
+ overlay_dirs << v
35
+ end
36
+ end
37
+
38
+ def source_path(relative_source)
39
+ # Check whether we're referring to another generator's file.
40
+ name, path = relative_source.split(':', 2)
41
+
42
+ # first check if the template can be found with in any of the overlay directories
43
+ if dirs = options[:overlay_dirs]
44
+ generator_name = self.class.name.underscore.sub(/_generator/, '')
45
+ unless dirs.frozen?
46
+ dirs.insert(0, File.join(self.class.lookup(generator_name).path, 'templates'))
47
+ dirs.freeze
48
+ end
49
+ file = path.nil? ? name : path
50
+ dirs.each do |dir|
51
+ if (f = File.join(dir, file)) and File.exists?(f)
52
+ logger.overlay f
53
+ return f
54
+ end
55
+ end
56
+ end
57
+
58
+ # If not, return the full path to our source file.
59
+ if path.nil?
60
+ File.join(source_root, name)
61
+
62
+ # Otherwise, ask our referral for the file.
63
+ else
64
+ # FIXME: this is broken, though almost always true. Others'
65
+ # source_root are not necessarily the templates dir.
66
+ File.join(self.class.lookup(name).path, 'templates', path)
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,26 @@
1
+ # load all models before each request so relations in datamapper find their classes
2
+ MODELS = []
3
+ Dir[RAILS_ROOT + "/app/models/**/*.rb"].each do |model|
4
+ model.sub!(/.*models\//, '').sub!(/.rb/, '')
5
+ m = ::Extlib::Inflection.classify(model.to_s)
6
+ MODELS << m
7
+ Object.const_get(m)
8
+ end
9
+
10
+ module ModelLoader
11
+ module Base
12
+ def self.included(base)
13
+ base.prepend_before_filter(ModelLoaderFilter)
14
+ end
15
+ end
16
+
17
+ class ModelLoaderFilter
18
+ def self.filter(controller)
19
+ MODELS.each do |model|
20
+ Object.const_get(model)
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ ::ActionController::Base.send(:include, ModelLoader::Base)
@@ -0,0 +1,43 @@
1
+ module Datamapper4rails
2
+ module RestfulTransactions
3
+
4
+ class Rollback < StandardError
5
+ end
6
+
7
+ module Base
8
+ def self.included(base)
9
+ base.prepend_around_filter(TransactionFilter)
10
+ end
11
+ end
12
+
13
+ class TransactionFilter
14
+
15
+ def self.filter(controller)
16
+ case controller.request.method
17
+ when :post, :put, :delete then
18
+ begin
19
+ # TODO remove the :default repository and make it more general
20
+ DataMapper::Transaction.new(DataMapper.repository(:default)) do |*block_args|
21
+ if block_given?
22
+ yield (*block_args)
23
+ # added rollback for all actions which just render
24
+ # a page (with validation errors) and do not redirect to
25
+ # another page
26
+ unless controller.response.redirected_to
27
+ raise Datamapper4rails::RestfulTransactions::Rollback
28
+ end
29
+ end
30
+ end
31
+ rescue Datamapper4rails::RestfulTransactions::Rollback
32
+ # ignore,
33
+ # this is just needed to trigger the rollback on the transaction
34
+ end
35
+ else
36
+ yield if block_given?
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ ::ActionController::Base.send(:include, Datamapper4rails::RestfulTransactions::Base)
@@ -0,0 +1,8 @@
1
+ module DataMapper
2
+ module Resource
3
+
4
+ def has_attribute?(name)
5
+ properties[name] != nil
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,23 @@
1
+ require 'rails_generator/generated_attribute'
2
+ require 'active_record'
3
+
4
+ module Rails
5
+ module Generator
6
+ class GeneratedAttribute
7
+ def default_value
8
+ @default_value ||= case type
9
+ when :int, :integer then "1"
10
+ when :float then "1.5"
11
+ when :decimal, :big_decimal then "9.99"
12
+ when :date_time, :datetime,
13
+ :timestamp, :time then "Time.now"
14
+ when :date then "Date.today"
15
+ when :string, :text then "\"value for #{@name}\""
16
+ when :boolean then "false"
17
+ else
18
+ ""
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ class Datamapper4rails
2
+ VERSION = '0.3.0'.freeze
3
+ end
@@ -0,0 +1,23 @@
1
+ $LOAD_PATH << File.dirname(__FILE__)
2
+ require 'spec_helper'
3
+ require 'datamapper4rails/datamapper_store'
4
+
5
+ describe ActionController::Session::DatamapperStore do
6
+
7
+ def mock_session(stubs={})
8
+ @mock_session ||= mock(Session, stubs)
9
+ end
10
+
11
+ before :each do
12
+ @store = ActionController::Session::DatamapperStore.new(nil, :session_class => Session)
13
+ end
14
+
15
+ it 'should create a new session' do
16
+ Session.should_receive(:create).and_return(mock_session)
17
+ mock_session.should_receive(:data).and_return({})
18
+ result = @store.send(:get_session, {}, nil)
19
+ result[0].should_not be_nil
20
+ result[1].should == {}
21
+ end
22
+
23
+ end
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,34 @@
1
+ require 'rubygems'
2
+ require 'dm-core'
3
+ $LOAD_PATH << Pathname(__FILE__).dirname.parent.expand_path + 'lib'
4
+
5
+ # just define a empty abstract store
6
+ module ActionController
7
+ module Session
8
+ class AbstractStore
9
+ def initialize(app, options = {})
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ class Session
16
+
17
+ include ::DataMapper::Resource
18
+
19
+ property :session_id, String, :key => true
20
+
21
+ property :updated_at, DateTime
22
+
23
+ property :data, Text, :nullable => false, :default => ::Base64.encode64(Marshal.dump({}))
24
+
25
+ def data=(data)
26
+ attribute_set(:data, ::Base64.encode64(Marshal.dump(data)))
27
+ end
28
+
29
+ def data
30
+ Marshal.load(::Base64.decode64(attribute_get(:data)))
31
+ end
32
+ end
33
+
34
+ DataMapper.setup(:default, {:adapter => 'in_memory'})
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: datamapper4rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - mkristian
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-08 00:00:00 +05:30
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rack-datamapper
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: "0.2"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: rails_datamapper
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: hoe
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 1.8.3
44
+ version:
45
+ description: 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.
46
+ email:
47
+ - m.kristian@web.de
48
+ executables: []
49
+
50
+ extensions: []
51
+
52
+ extra_rdoc_files:
53
+ - History.txt
54
+ - Manifest.txt
55
+ - README.txt
56
+ files:
57
+ - History.txt
58
+ - Manifest.txt
59
+ - README.txt
60
+ - Rakefile
61
+ - datamapper_rails_templates.rb
62
+ - generators/datamapper_install/datamapper_install_generator.rb
63
+ - generators/datamapper_install/templates/datamapper.rake
64
+ - generators/datamapper_model/datamapper_model_generator.rb
65
+ - generators/datamapper_model/templates/migration.rb
66
+ - generators/datamapper_model/templates/model.rb
67
+ - generators/datamapper_rspec_model/datamapper_rspec_model_generator.rb
68
+ - generators/datamapper_rspec_model/templates/model_spec.rb
69
+ - generators/datamapper_rspec_scaffold/datamapper_rspec_scaffold_generator.rb
70
+ - generators/datamapper_rspec_scaffold/templates/controller_spec.rb
71
+ - generators/datamapper_rspec_scaffold/templates/edit_erb_spec.rb
72
+ - generators/datamapper_scaffold/datamapper_scaffold_generator.rb
73
+ - generators/datamapper_scaffold/templates/controller.rb
74
+ - generators/datamapper_scaffold/templates/functional_test.rb
75
+ - generators/datamapper_scaffold/templates/view_edit.html.erb
76
+ - generators/datamapper_scaffold/templates/view_index.html.erb
77
+ - generators/datamapper_scaffold/templates/view_new.html.erb
78
+ - generators/datamapper_scaffold/templates/view_show.html.erb
79
+ - lib/datamapper4rails.rb
80
+ - lib/datamapper4rails/adapters/base_adapter.rb
81
+ - lib/datamapper4rails/adapters/restful_adapter.rb
82
+ - lib/datamapper4rails/datamapper_store.rb
83
+ - lib/datamapper4rails/integration_test.rb
84
+ - lib/datamapper4rails/identity_maps.rb
85
+ - lib/datamapper4rails/overlay.rb
86
+ - lib/datamapper4rails/preload_models.rb
87
+ - lib/datamapper4rails/restful_transactions.rb
88
+ - lib/datamapper4rails/rspec_default_values.rb
89
+ - lib/datamapper4rails/rspec.rb
90
+ - lib/datamapper4rails/version.rb
91
+ - spec/datamapper_store_spec.rb
92
+ - spec/spec.opts
93
+ - spec/spec_helper.rb
94
+ has_rdoc: true
95
+ homepage: http://datamapper4rail.rubyforge.org
96
+ licenses: []
97
+
98
+ post_install_message:
99
+ rdoc_options:
100
+ - --main
101
+ - README.txt
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: "0"
109
+ version:
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: "0"
115
+ version:
116
+ requirements: []
117
+
118
+ rubyforge_project: datamapper4rail
119
+ rubygems_version: 1.3.4
120
+ signing_key:
121
+ specification_version: 3
122
+ summary: collection of datamapper related extensions
123
+ test_files: []
124
+