datamapper4rails 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +6 -0
- data/Manifest.txt +37 -0
- data/README.txt +151 -0
- data/Rakefile +48 -0
- data/datamapper_rails_templates.rb +114 -0
- data/generators/datamapper_install/datamapper_install_generator.rb +12 -0
- data/generators/datamapper_install/templates/datamapper.rake +88 -0
- data/generators/datamapper_model/datamapper_model_generator.rb +18 -0
- data/generators/datamapper_model/templates/migration.rb +18 -0
- data/generators/datamapper_model/templates/model.rb +14 -0
- data/generators/datamapper_rspec_model/datamapper_rspec_model_generator.rb +18 -0
- data/generators/datamapper_rspec_model/templates/model_spec.rb +44 -0
- data/generators/datamapper_rspec_scaffold/datamapper_rspec_scaffold_generator.rb +20 -0
- data/generators/datamapper_rspec_scaffold/templates/controller_spec.rb +171 -0
- data/generators/datamapper_rspec_scaffold/templates/edit_erb_spec.rb +25 -0
- data/generators/datamapper_scaffold/datamapper_scaffold_generator.rb +31 -0
- data/generators/datamapper_scaffold/templates/controller.rb +90 -0
- data/generators/datamapper_scaffold/templates/functional_test.rb +49 -0
- data/generators/datamapper_scaffold/templates/view_edit.html.erb +18 -0
- data/generators/datamapper_scaffold/templates/view_index.html.erb +24 -0
- data/generators/datamapper_scaffold/templates/view_new.html.erb +17 -0
- data/generators/datamapper_scaffold/templates/view_show.html.erb +10 -0
- data/lib/datamapper4rails.rb +14 -0
- data/lib/datamapper4rails/adapters/base_adapter.rb +198 -0
- data/lib/datamapper4rails/adapters/restful_adapter.rb +320 -0
- data/lib/datamapper4rails/datamapper_store.rb +28 -0
- data/lib/datamapper4rails/identity_maps.rb +25 -0
- data/lib/datamapper4rails/integration_test.rb +45 -0
- data/lib/datamapper4rails/overlay.rb +69 -0
- data/lib/datamapper4rails/preload_models.rb +26 -0
- data/lib/datamapper4rails/restful_transactions.rb +43 -0
- data/lib/datamapper4rails/rspec.rb +8 -0
- data/lib/datamapper4rails/rspec_default_values.rb +23 -0
- data/lib/datamapper4rails/version.rb +3 -0
- data/spec/datamapper_store_spec.rb +23 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +34 -0
- 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,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,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
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/spec/spec_helper.rb
ADDED
@@ -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
|
+
|