activerecord-tableless 0.1.0 → 1.0.1
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/.gitignore +4 -0
- data/CHANGELOG +6 -3
- data/Gemfile +4 -0
- data/README +32 -4
- data/Rakefile +6 -5
- data/activerecord-tableless.gemspec +25 -0
- data/init.rb +2 -2
- data/lib/activerecord-tableless.rb +151 -0
- metadata +95 -47
- data/lib/tableless.rb +0 -74
data/.gitignore
ADDED
data/CHANGELOG
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
0.1.1 - Jul 21th 2009
|
2
|
+
* Method for bulk adding of columns
|
3
|
+
* Code cleaning
|
4
|
+
* Rename of the project
|
3
5
|
|
4
|
-
|
6
|
+
0.1.0 - May 1st 2008
|
7
|
+
* Initial code, rough around the edges.
|
data/Gemfile
ADDED
data/README
CHANGED
@@ -1,6 +1,34 @@
|
|
1
|
-
ActiveRecord Tableless
|
2
|
-
|
1
|
+
ActiveRecord Tableless
|
2
|
+
----------------------
|
3
3
|
|
4
|
-
A single implementation of the ActiveRecord Tableless
|
5
|
-
|
4
|
+
A single implementation of the ActiveRecord Tableless pattern for any Rails
|
5
|
+
project or other Ruby project that uses ActiveRecord.
|
6
|
+
|
7
|
+
Define a model like this:
|
8
|
+
|
9
|
+
class ContactMessage < ActiveRecord::Base
|
10
|
+
has_no_table
|
11
|
+
column :name, :string
|
12
|
+
column :email, :string
|
13
|
+
validates_presence_of :name, :email
|
14
|
+
end
|
15
|
+
|
16
|
+
You can now use the model in a view like this:
|
17
|
+
|
18
|
+
<%= form_for :message, @message do |f| %>
|
19
|
+
Your name: <%= f.text_field :name %>
|
20
|
+
Your email: <%= f.text_field :email %>
|
21
|
+
<% end %>
|
22
|
+
|
23
|
+
And in the controller:
|
24
|
+
|
25
|
+
def message
|
26
|
+
@message = ContactMessage.new
|
27
|
+
if request.post?
|
28
|
+
@message.attributes = params[:message]
|
29
|
+
if @message.valid?
|
30
|
+
# Process the message...
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
6
34
|
|
data/Rakefile
CHANGED
@@ -1,14 +1,15 @@
|
|
1
|
-
require '
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rdoc/task'
|
2
3
|
|
3
4
|
task :default do
|
4
5
|
puts
|
5
|
-
puts IO.read(
|
6
|
+
puts IO.read(File.join(File.dirname(__FILE__), 'README'))
|
6
7
|
puts
|
7
8
|
end
|
8
9
|
|
9
10
|
Rake::RDocTask.new do |rd|
|
10
11
|
rd.main = 'README'
|
11
|
-
rd.rdoc_files.include(
|
12
|
+
rd.rdoc_files.include('README', 'lib/*.rb', 'lib/**/*.rb')
|
12
13
|
rd.rdoc_dir = 'rdoc'
|
13
|
-
rd.title = 'ActiveRecord Tableless
|
14
|
-
end
|
14
|
+
rd.title = 'ActiveRecord Tableless'
|
15
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |gem|
|
4
|
+
gem.authors = ["Jarl Friis", "Kenneth Kalmer", "Michal Zima"]
|
5
|
+
gem.email = ["jarl@softace.dk"]
|
6
|
+
gem.name = 'activerecord-tableless'
|
7
|
+
gem.summary = %q{A library for implementing tableless ActiveRecord models}
|
8
|
+
gem.description = %q{ActiveRecord Tableless Models provides a simple mixin for creating models that are not bound to the database. This approach is mostly useful for capitalizing on the features ActiveRecord::Validation}
|
9
|
+
gem.homepage = "https://github.com/softace/activerecord-tableless"
|
10
|
+
gem.files = `git ls-files`.split($\)
|
11
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
12
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
13
|
+
gem.version = "1.0.1"
|
14
|
+
gem.has_rdoc = true
|
15
|
+
gem.extra_rdoc_files = %w( README CHANGELOG )
|
16
|
+
gem.rdoc_options.concat ['--main', 'README']
|
17
|
+
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
gem.platform = Gem::Platform::RUBY
|
20
|
+
|
21
|
+
gem.add_dependency("activerecord", ">=3.2")
|
22
|
+
|
23
|
+
gem.add_development_dependency('bundler')
|
24
|
+
gem.add_development_dependency('rake')
|
25
|
+
end
|
data/init.rb
CHANGED
@@ -0,0 +1,151 @@
|
|
1
|
+
# See #ActiveRecord::Tableless
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
|
5
|
+
# = ActiveRecord::Tableless
|
6
|
+
#
|
7
|
+
# Allow classes to behave like ActiveRecord models, but without an associated
|
8
|
+
# database table. A great way to capitalize on validations. Based on the
|
9
|
+
# original post at http://www.railsweenie.com/forums/2/topics/724 (which seems
|
10
|
+
# to have disappeared from the face of the earth).
|
11
|
+
#
|
12
|
+
# = Example usage
|
13
|
+
#
|
14
|
+
# class ContactMessage < ActiveRecord::Base
|
15
|
+
#
|
16
|
+
# has_no_table
|
17
|
+
#
|
18
|
+
# column :name, :string
|
19
|
+
# column :email, :string
|
20
|
+
# column :message, :string
|
21
|
+
#
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# msg = ContactMessage.new( params[:msg] )
|
25
|
+
# if msg.valid?
|
26
|
+
# ContactMessageSender.deliver_message( msg )
|
27
|
+
# redirect_to :action => :sent
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
module Tableless
|
31
|
+
|
32
|
+
def self.included( base ) #:nodoc:
|
33
|
+
base.send :extend, ActsMethods
|
34
|
+
end
|
35
|
+
|
36
|
+
module ActsMethods #:nodoc:
|
37
|
+
|
38
|
+
# A model that needs to be tableless will call this method to indicate
|
39
|
+
# it.
|
40
|
+
def has_no_table
|
41
|
+
# keep our options handy
|
42
|
+
class_attribute :tableless_options
|
43
|
+
self.tableless_options = {:columns => []}
|
44
|
+
|
45
|
+
# extend
|
46
|
+
extend ActiveRecord::Tableless::SingletonMethods
|
47
|
+
extend ActiveRecord::Tableless::ClassMethods
|
48
|
+
|
49
|
+
# include
|
50
|
+
include ActiveRecord::Tableless::InstanceMethods
|
51
|
+
|
52
|
+
# setup columns
|
53
|
+
end
|
54
|
+
|
55
|
+
def tableless?
|
56
|
+
false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
module SingletonMethods
|
61
|
+
|
62
|
+
# Return the list of columns registered for the model. Used internally by
|
63
|
+
# ActiveRecord
|
64
|
+
def columns
|
65
|
+
tableless_options[:columns]
|
66
|
+
end
|
67
|
+
|
68
|
+
# Register a new column.
|
69
|
+
def column(name, sql_type = nil, default = nil, null = true)
|
70
|
+
tableless_options[:columns] << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Register a set of colums with the same SQL type
|
74
|
+
def add_columns(sql_type, *args)
|
75
|
+
args.each do |col|
|
76
|
+
column col, sql_type
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
%w(find create destroy).each do |m|
|
81
|
+
eval %{
|
82
|
+
def #{m}(*args)
|
83
|
+
logger.warn "Can't #{m} a Tableless object"
|
84
|
+
false
|
85
|
+
end
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
def tableless?
|
90
|
+
true
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
module ClassMethods
|
95
|
+
|
96
|
+
def from_query_string(query_string)
|
97
|
+
unless query_string.blank?
|
98
|
+
params = query_string.split('&').collect do |chunk|
|
99
|
+
next if chunk.empty?
|
100
|
+
key, value = chunk.split('=', 2)
|
101
|
+
next if key.empty?
|
102
|
+
value = value.nil? ? nil : CGI.unescape(value)
|
103
|
+
[ CGI.unescape(key), value ]
|
104
|
+
end.compact.to_h
|
105
|
+
|
106
|
+
new(params)
|
107
|
+
else
|
108
|
+
new
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
module InstanceMethods
|
115
|
+
|
116
|
+
def to_query_string(prefix = nil)
|
117
|
+
attributes.to_a.collect{|(name,value)| escaped_var_name(name, prefix) + "=" + escape_for_url(value) if value }.compact.join("&")
|
118
|
+
end
|
119
|
+
|
120
|
+
%w(save destroy).each do |m|
|
121
|
+
eval %{
|
122
|
+
def #{m}(*args)
|
123
|
+
logger.warn "Can't #{m} a Tableless object"
|
124
|
+
false
|
125
|
+
end
|
126
|
+
}
|
127
|
+
end
|
128
|
+
|
129
|
+
private
|
130
|
+
|
131
|
+
def escaped_var_name(name, prefix = nil)
|
132
|
+
prefix ? "#{URI.escape(prefix)}[#{URI.escape(name)}]" : URI.escape(name)
|
133
|
+
end
|
134
|
+
|
135
|
+
def escape_for_url(value)
|
136
|
+
case value
|
137
|
+
when true then "1"
|
138
|
+
when false then "0"
|
139
|
+
when nil then ""
|
140
|
+
else URI.escape(value.to_s)
|
141
|
+
end
|
142
|
+
rescue
|
143
|
+
""
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
ActiveRecord::Base.send( :include, ActiveRecord::Tableless )
|
metadata
CHANGED
@@ -1,67 +1,115 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-tableless
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
|
-
authors:
|
7
|
+
authors:
|
8
|
+
- Jarl Friis
|
7
9
|
- Kenneth Kalmer
|
10
|
+
- Michal Zima
|
8
11
|
autorequire:
|
9
12
|
bindir: bin
|
10
13
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
14
|
+
date: 2012-09-07 00:00:00.000000000 Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
16
17
|
name: activerecord
|
17
|
-
|
18
|
-
|
19
|
-
requirements:
|
20
|
-
- -
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version:
|
23
|
-
|
24
|
-
|
25
|
-
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ! '>='
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '3.2'
|
24
|
+
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ! '>='
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: '3.2'
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: bundler
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
36
|
+
requirements:
|
37
|
+
- - ! '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rake
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
description: ActiveRecord Tableless Models provides a simple mixin for creating models
|
65
|
+
that are not bound to the database. This approach is mostly useful for capitalizing
|
66
|
+
on the features ActiveRecord::Validation
|
67
|
+
email:
|
68
|
+
- jarl@softace.dk
|
26
69
|
executables: []
|
27
|
-
|
28
70
|
extensions: []
|
29
|
-
|
30
|
-
extra_rdoc_files:
|
71
|
+
extra_rdoc_files:
|
31
72
|
- README
|
32
73
|
- CHANGELOG
|
33
|
-
files:
|
34
|
-
-
|
35
|
-
- lib/tableless.rb
|
36
|
-
- Rakefile
|
37
|
-
- README
|
74
|
+
files:
|
75
|
+
- .gitignore
|
38
76
|
- CHANGELOG
|
39
|
-
|
40
|
-
|
77
|
+
- Gemfile
|
78
|
+
- README
|
79
|
+
- Rakefile
|
80
|
+
- activerecord-tableless.gemspec
|
81
|
+
- init.rb
|
82
|
+
- lib/activerecord-tableless.rb
|
83
|
+
homepage: https://github.com/softace/activerecord-tableless
|
84
|
+
licenses: []
|
41
85
|
post_install_message:
|
42
|
-
rdoc_options:
|
86
|
+
rdoc_options:
|
43
87
|
- --main
|
44
88
|
- README
|
45
|
-
require_paths:
|
89
|
+
require_paths:
|
46
90
|
- lib
|
47
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
hash: 193372649810044937
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ! '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
hash: 193372649810044937
|
59
109
|
requirements: []
|
60
|
-
|
61
|
-
|
62
|
-
rubygems_version: 1.0.1
|
110
|
+
rubyforge_project:
|
111
|
+
rubygems_version: 1.8.24
|
63
112
|
signing_key:
|
64
|
-
specification_version:
|
113
|
+
specification_version: 3
|
65
114
|
summary: A library for implementing tableless ActiveRecord models
|
66
115
|
test_files: []
|
67
|
-
|
data/lib/tableless.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
# See #ActiveRecord::Tableless
|
2
|
-
|
3
|
-
module ActiveRecord
|
4
|
-
|
5
|
-
# = ActiveRecord::Tableless
|
6
|
-
#
|
7
|
-
# Allow classes to behave like ActiveRecord models, but without an associated
|
8
|
-
# database table. A great way to capitalize on validations. Based on the
|
9
|
-
# original post at http://www.railsweenie.com/forums/2/topics/724 (which seems
|
10
|
-
# to have disappeared from the face of the earth).
|
11
|
-
#
|
12
|
-
# = Example usage
|
13
|
-
#
|
14
|
-
# class ContactMessage < ActiveRecord::Base
|
15
|
-
#
|
16
|
-
# has_no_table
|
17
|
-
#
|
18
|
-
# column :name, :string
|
19
|
-
# column :email, :string
|
20
|
-
# column :message, :string
|
21
|
-
#
|
22
|
-
# end
|
23
|
-
#
|
24
|
-
# msg = ContactMessage.new( params[:msg] )
|
25
|
-
# if msg.valid?
|
26
|
-
# ContactMessageSender.deliver_message( msg )
|
27
|
-
# redirect_to :action => :sent
|
28
|
-
# end
|
29
|
-
#
|
30
|
-
module Tableless
|
31
|
-
|
32
|
-
def self.included( base ) #:nodoc:
|
33
|
-
base.send( :extend, ClassMethods )
|
34
|
-
end
|
35
|
-
|
36
|
-
module ClassMethods #:nodoc:
|
37
|
-
|
38
|
-
# A model that needs to be tableless will call this method to indicate
|
39
|
-
# it.
|
40
|
-
def has_no_table
|
41
|
-
# keep our options handy
|
42
|
-
write_inheritable_attribute(
|
43
|
-
:tableless_options,
|
44
|
-
:columns => []
|
45
|
-
)
|
46
|
-
class_inheritable_reader :tableless_options
|
47
|
-
|
48
|
-
# extend
|
49
|
-
extend ActiveRecord::Tableless::SingletonMethods
|
50
|
-
|
51
|
-
# setup columns
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
module SingletonMethods
|
57
|
-
|
58
|
-
# Return the list of columns registered for the model. Used internally by
|
59
|
-
# ActiveRecord
|
60
|
-
def columns
|
61
|
-
tableless_options[:columns]
|
62
|
-
end
|
63
|
-
|
64
|
-
# Register a new column.
|
65
|
-
def column(name, sql_type = nil, default = nil, null = true)
|
66
|
-
tableless_options[:columns] << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
ActiveRecord::Base.send( :include, ActiveRecord::Tableless )
|