auto_ar 0.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/Manifest +5 -0
- data/Rakefile +11 -0
- data/auto_ar.gemspec +33 -0
- data/lib/auto_ar.rb +84 -0
- data/test/auto_ar_test.rb +71 -0
- data/test/test_helper.rb +2 -0
- data.tar.gz.sig +4 -0
- metadata +85 -0
- metadata.gz.sig +0 -0
data/Manifest
ADDED
data/Rakefile
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'rake'
|
|
3
|
+
require 'echoe'
|
|
4
|
+
|
|
5
|
+
Echoe.new('auto_ar', '0.0.1') do |p|
|
|
6
|
+
p.description = "A gem that makes ActiveRecord subclasses on the fly"
|
|
7
|
+
p.url = "http://github.com/tmaeda/auto_ar"
|
|
8
|
+
p.author = "Tomoki MAEDA"
|
|
9
|
+
p.email = "tmaeda _at_ ruby-sapporo.org"
|
|
10
|
+
end
|
|
11
|
+
|
data/auto_ar.gemspec
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
Gem::Specification.new do |s|
|
|
4
|
+
s.name = %q{auto_ar}
|
|
5
|
+
s.version = "0.0.1"
|
|
6
|
+
|
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
|
8
|
+
s.authors = ["Tomoki MAEDA"]
|
|
9
|
+
s.cert_chain = ["/home/tmaeda/.gemcert/gem-public_cert.pem"]
|
|
10
|
+
s.date = %q{2010-06-20}
|
|
11
|
+
s.description = %q{A gem that makes ActiveRecord subclasses on the fly}
|
|
12
|
+
s.email = %q{tmaeda _at_ ruby-sapporo.org}
|
|
13
|
+
s.extra_rdoc_files = ["lib/auto_ar.rb"]
|
|
14
|
+
s.files = ["Manifest", "Rakefile", "lib/auto_ar.rb", "test/auto_ar_test.rb", "test/test_helper.rb", "auto_ar.gemspec"]
|
|
15
|
+
s.homepage = %q{http://github.com/tmaeda/auto_ar}
|
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Auto_ar"]
|
|
17
|
+
s.require_paths = ["lib"]
|
|
18
|
+
s.rubyforge_project = %q{auto_ar}
|
|
19
|
+
s.rubygems_version = %q{1.3.5}
|
|
20
|
+
s.signing_key = %q{/home/tmaeda/.gemcert/gem-private_key.pem}
|
|
21
|
+
s.summary = %q{A gem that makes ActiveRecord subclasses on the fly}
|
|
22
|
+
s.test_files = ["test/auto_ar_test.rb", "test/test_helper.rb"]
|
|
23
|
+
|
|
24
|
+
if s.respond_to? :specification_version then
|
|
25
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
|
26
|
+
s.specification_version = 3
|
|
27
|
+
|
|
28
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
|
29
|
+
else
|
|
30
|
+
end
|
|
31
|
+
else
|
|
32
|
+
end
|
|
33
|
+
end
|
data/lib/auto_ar.rb
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
require 'active_support'
|
|
2
|
+
require 'active_record'
|
|
3
|
+
|
|
4
|
+
if defined?(ActiveRecord::Base)
|
|
5
|
+
module AutoAR
|
|
6
|
+
def self.included(base)
|
|
7
|
+
base.class_eval do
|
|
8
|
+
unless defined? const_missing_without_auto_ar
|
|
9
|
+
alias_method_chain :const_missing, :auto_ar
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
def const_missing_with_auto_ar(const_name)
|
|
14
|
+
begin
|
|
15
|
+
const_missing_without_auto_ar(const_name)
|
|
16
|
+
rescue NameError => e
|
|
17
|
+
begin
|
|
18
|
+
conn = ActiveRecord::Base.connection
|
|
19
|
+
if conn.tables.include?(const_name.to_s.tableize)
|
|
20
|
+
Object.const_set(const_name, Class.new(ActiveRecord::Base))
|
|
21
|
+
else
|
|
22
|
+
raise NameError
|
|
23
|
+
end
|
|
24
|
+
rescue ActiveRecord::ConnectionNotEstablished, ActiveRecord::StatementInvalid
|
|
25
|
+
raise NameError
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
module AutoARRefrection
|
|
32
|
+
def self.included(base)
|
|
33
|
+
base.class_eval do
|
|
34
|
+
unless defined? method_missing_without_auto_ar
|
|
35
|
+
alias_method_chain :method_missing, :auto_ar
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def method_missing_with_auto_ar(method_sym, *args)
|
|
41
|
+
begin
|
|
42
|
+
method_missing_without_auto_ar(method_sym, *args)
|
|
43
|
+
rescue NoMethodError => e
|
|
44
|
+
method_name = method_sym.to_s
|
|
45
|
+
if method_name == method_name.singularize
|
|
46
|
+
f_key = method_name.singularize.foreign_key
|
|
47
|
+
if self.respond_to?(f_key)
|
|
48
|
+
target_klass = Object.const_get(method_name.classify)
|
|
49
|
+
# target_klass.class_eval("has_many :#{self.class.to_s.pluralize.underscore.intern}")
|
|
50
|
+
# self.class.class_eval("belongs_to :#{method_sym}")
|
|
51
|
+
foo(target_klass, self.class)
|
|
52
|
+
else
|
|
53
|
+
raise NoMethodError
|
|
54
|
+
end
|
|
55
|
+
elsif method_name == method_name.pluralize
|
|
56
|
+
table_name = method_name.tableize
|
|
57
|
+
f_key = self.class.to_s.foreign_key
|
|
58
|
+
conn = self.connection
|
|
59
|
+
if conn.tables.include?(table_name) &&
|
|
60
|
+
conn.columns(table_name).map(&:name).include?(f_key)
|
|
61
|
+
target_klass = Object.const_get(method_name.classify)
|
|
62
|
+
target_klass.class_eval("belongs_to :#{self.class.to_s.singularize.underscore.intern}")
|
|
63
|
+
self.class.class_eval("has_many :#{method_sym}")
|
|
64
|
+
else
|
|
65
|
+
raise NoMethodError
|
|
66
|
+
end
|
|
67
|
+
else
|
|
68
|
+
raise NoMethodError
|
|
69
|
+
end
|
|
70
|
+
self.send(method_sym, *args)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def foo(parent_class, child_class)
|
|
75
|
+
parent_class.class_eval("has_many :#{child_class.to_s.pluralize.underscore}")
|
|
76
|
+
child_class.class_eval("belongs_to :#{parent_class.to_s.singularize.underscore}")
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
Module.instance_eval{ include AutoAR }
|
|
80
|
+
ActiveRecord::Base.instance_eval{ include AutoARRefrection }
|
|
81
|
+
else
|
|
82
|
+
raise "Error: ActiveRecord required."
|
|
83
|
+
end
|
|
84
|
+
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
|
2
|
+
|
|
3
|
+
class AutArTest < Test::Unit::TestCase
|
|
4
|
+
DBFILE = "test/auto_ar_test.sqlite3"
|
|
5
|
+
def setup
|
|
6
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3",
|
|
7
|
+
:database => DBFILE)
|
|
8
|
+
migrate = Class.new(ActiveRecord::Migration) do
|
|
9
|
+
def self.up
|
|
10
|
+
create_table(:blogs) do |t|
|
|
11
|
+
t.string :title
|
|
12
|
+
t.text :body
|
|
13
|
+
end
|
|
14
|
+
create_table(:comments) do |t|
|
|
15
|
+
t.references :blog
|
|
16
|
+
t.string :name
|
|
17
|
+
t.string :body
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
migrate.up
|
|
22
|
+
conn = ActiveRecord::Base.connection
|
|
23
|
+
conn.execute("insert into blogs (id, title, body) values (1, 'first post', 'hello. how are you?')")
|
|
24
|
+
conn.execute("insert into comments (id, blog_id, name, body) values (1, 1, 'tmaeda', 'fine')")
|
|
25
|
+
conn.execute("insert into comments (id, blog_id, name, body) values (2, 1, 'tmaeda2', 'fine')")
|
|
26
|
+
|
|
27
|
+
conn.execute("insert into blogs (id, title, body) values (2, 'second post', 'good night')")
|
|
28
|
+
conn.execute("insert into comments (id, blog_id, name, body) values (3, 2, 'tmaeda', 'sweet dreams')")
|
|
29
|
+
conn.execute("insert into comments (id, blog_id, name, body) values (4, 2, 'tmaeda2', 'good night')")
|
|
30
|
+
conn.execute("insert into comments (id, blog_id, name, body) values (5, 2, 'tmaeda2', 'see you!')")
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
def teardown
|
|
34
|
+
File.unlink(DBFILE)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_find_parent
|
|
38
|
+
blogs = Blog.find(:all)
|
|
39
|
+
assert_equal 2, blogs.size
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_find_children
|
|
43
|
+
comments = Comments.find(:all)
|
|
44
|
+
assert_equal 5, comments.size
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_relation_parent_to_children
|
|
48
|
+
blog = Blog.find(1)
|
|
49
|
+
comments = blog.comments
|
|
50
|
+
assert_equal 2, comments.size
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_relation_children_to_parent
|
|
54
|
+
comment = Comment.find(3)
|
|
55
|
+
blog = comment.blog
|
|
56
|
+
assert_equal 2, blog.id
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def test_relation_parent_to_children_to_parent
|
|
60
|
+
blog = Blog.find(1)
|
|
61
|
+
blog = blog.comments[0].blog
|
|
62
|
+
assert_equal 1, blog.id
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_relation_children_to_parent_to_children
|
|
66
|
+
comment = Comment.find(4)
|
|
67
|
+
comments = comment.blog.comments
|
|
68
|
+
assert_equal 3, comments.size
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
data/test/test_helper.rb
ADDED
data.tar.gz.sig
ADDED
metadata
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: auto_ar
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Tomoki MAEDA
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain:
|
|
11
|
+
- |
|
|
12
|
+
-----BEGIN CERTIFICATE-----
|
|
13
|
+
MIIDPDCCAiSgAwIBAgIBADANBgkqhkiG9w0BAQUFADBEMQ8wDQYDVQQDDAZ0bWFl
|
|
14
|
+
ZGExHDAaBgoJkiaJk/IsZAEZFgxydWJ5LXNhcHBvcm8xEzARBgoJkiaJk/IsZAEZ
|
|
15
|
+
FgNvcmcwHhcNMTAwNjE5MTMzMTMyWhcNMTEwNjE5MTMzMTMyWjBEMQ8wDQYDVQQD
|
|
16
|
+
DAZ0bWFlZGExHDAaBgoJkiaJk/IsZAEZFgxydWJ5LXNhcHBvcm8xEzARBgoJkiaJ
|
|
17
|
+
k/IsZAEZFgNvcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtZi3o
|
|
18
|
+
ytoyCDxSKlFo96XL6sMOMIJ4YBtq2yp9mUODRgr8GFm88l7VQFeZt/hBC1xnq6ru
|
|
19
|
+
bG5KhUD/WS7IhDDOiDo8I1feMxEJFfvkiJCK/uGruHwZ7893WEFoG1iU5bKVl0v3
|
|
20
|
+
VCxUwxUMV8Wz1Htjol6497Q4NoRgPpVZekT9r8rzfa7hTpNCSaVEykCxz46x85xE
|
|
21
|
+
LeA8J6e9I0HKDdKd1Q/eAT20YnCQpi8JvkXsYdfkd/1oO5aCOimnBO7yYIbbIUxh
|
|
22
|
+
i4g4N6R+ZcpqmHTUagzAHOtgZarqSfiVtuvR93t68zFcyi3wDWXtz0zZlkYjgeHS
|
|
23
|
+
CNjBM5mrpHvDzKXBAgMBAAGjOTA3MAkGA1UdEwQCMAAwHQYDVR0OBBYEFOo6rb6s
|
|
24
|
+
Ny9pw9x+kxVGjPxGNFXaMAsGA1UdDwQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEA
|
|
25
|
+
ZuJYaHfIEvlMBhZYxU5zEn91T4qjXgVK+OmgcnTZgJ3QrrEE8o3WCTGpE4sv0Pyl
|
|
26
|
+
Md/6mkBGIRSB9yqs4bqISiaxFzoRQsEkF1TvchdIIM16bOnGyYIUQ4Gz+mUGe0rC
|
|
27
|
+
tv2jnB2+rxZ+wpCuzQo/F50rLhdDJT0a+hJhWUdpfFkNarOAvtMq1wL/0Tx+s2jS
|
|
28
|
+
QrvtICSUB0krXMKPsKuKKBbOoGrKfERr29H/cLAio3tsl44F9jvZxDggvMK/8fNY
|
|
29
|
+
v+PF/vWBUDUXcWrIoc3OnidxLXVV3DeYASrXlH4Tvyt10fNKyQzKflVBtTRNwiqK
|
|
30
|
+
0kAGmV8I6si3R9QOfuLD4g==
|
|
31
|
+
-----END CERTIFICATE-----
|
|
32
|
+
|
|
33
|
+
date: 2010-06-20 00:00:00 +09:00
|
|
34
|
+
default_executable:
|
|
35
|
+
dependencies: []
|
|
36
|
+
|
|
37
|
+
description: A gem that makes ActiveRecord subclasses on the fly
|
|
38
|
+
email: tmaeda _at_ ruby-sapporo.org
|
|
39
|
+
executables: []
|
|
40
|
+
|
|
41
|
+
extensions: []
|
|
42
|
+
|
|
43
|
+
extra_rdoc_files:
|
|
44
|
+
- lib/auto_ar.rb
|
|
45
|
+
files:
|
|
46
|
+
- Manifest
|
|
47
|
+
- Rakefile
|
|
48
|
+
- lib/auto_ar.rb
|
|
49
|
+
- test/auto_ar_test.rb
|
|
50
|
+
- test/test_helper.rb
|
|
51
|
+
- auto_ar.gemspec
|
|
52
|
+
has_rdoc: true
|
|
53
|
+
homepage: http://github.com/tmaeda/auto_ar
|
|
54
|
+
licenses: []
|
|
55
|
+
|
|
56
|
+
post_install_message:
|
|
57
|
+
rdoc_options:
|
|
58
|
+
- --line-numbers
|
|
59
|
+
- --inline-source
|
|
60
|
+
- --title
|
|
61
|
+
- Auto_ar
|
|
62
|
+
require_paths:
|
|
63
|
+
- lib
|
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: "0"
|
|
69
|
+
version:
|
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - ">="
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: "1.2"
|
|
75
|
+
version:
|
|
76
|
+
requirements: []
|
|
77
|
+
|
|
78
|
+
rubyforge_project: auto_ar
|
|
79
|
+
rubygems_version: 1.3.5
|
|
80
|
+
signing_key:
|
|
81
|
+
specification_version: 3
|
|
82
|
+
summary: A gem that makes ActiveRecord subclasses on the fly
|
|
83
|
+
test_files:
|
|
84
|
+
- test/auto_ar_test.rb
|
|
85
|
+
- test/test_helper.rb
|
metadata.gz.sig
ADDED
|
Binary file
|