tenacity 0.1.0 → 0.1.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/Gemfile.lock +1 -1
- data/README.rdoc +44 -20
- data/Rakefile +21 -35
- data/history.txt +14 -0
- data/lib/tenacity/class_methods.rb +1 -1
- data/lib/tenacity/orm_ext/activerecord.rb +41 -41
- data/lib/tenacity/orm_ext/couchrest/couchrest_extended_document.rb +35 -35
- data/lib/tenacity/orm_ext/couchrest/couchrest_model.rb +35 -34
- data/lib/tenacity/orm_ext/couchrest/tenacity_class_methods.rb +1 -1
- data/lib/tenacity/orm_ext/couchrest/tenacity_instance_methods.rb +1 -1
- data/lib/tenacity/orm_ext/mongo_mapper.rb +1 -1
- data/lib/tenacity/version.rb +1 -1
- data/tenacity.gemspec +2 -0
- metadata +5 -4
data/Gemfile.lock
CHANGED
data/README.rdoc
CHANGED
@@ -4,9 +4,9 @@ An ORM independent way of specifying simple relationships between models
|
|
4
4
|
backed by different databases.
|
5
5
|
|
6
6
|
It is sometimes necessary, or advantageous, to use more than one database in a
|
7
|
-
given application. However, most ORMs do not support
|
8
|
-
relationships. While supporting such relationships isn't difficult,
|
9
|
-
add quite a bit of boilerplate code to your project.
|
7
|
+
given application (polyglot persistence). However, most ORMs do not support
|
8
|
+
inter-database relationships. While supporting such relationships isn't difficult,
|
9
|
+
it can add quite a bit of boilerplate code to your project.
|
10
10
|
|
11
11
|
Tenacity aims to address this by providing an ORM independent way of specifying
|
12
12
|
simple relationships between models backed by different databases.
|
@@ -17,33 +17,61 @@ much the same way, supporting many of the same options.
|
|
17
17
|
|
18
18
|
== Example
|
19
19
|
|
20
|
-
class
|
20
|
+
class Car
|
21
21
|
include MongoMapper::Document
|
22
22
|
include Tenacity
|
23
23
|
|
24
|
-
t_has_many :
|
24
|
+
t_has_many :wheels
|
25
|
+
t_has_one :dashboard
|
25
26
|
end
|
26
27
|
|
27
|
-
class
|
28
|
+
class Wheel < ActiveRecord::Base
|
28
29
|
include Tenacity
|
29
30
|
|
30
|
-
t_belongs_to :
|
31
|
+
t_belongs_to :car
|
31
32
|
end
|
32
33
|
|
34
|
+
class Dashboard < CouchRest::ExtendedDocument
|
35
|
+
include Tenacity
|
36
|
+
use_database MY_COUCHDB_DATABASE
|
33
37
|
|
34
|
-
|
35
|
-
|
38
|
+
t_belongs_to :car
|
39
|
+
end
|
40
|
+
|
41
|
+
car = Car.create
|
36
42
|
|
37
43
|
# Set the related object
|
38
|
-
|
39
|
-
|
44
|
+
dashboard = Dashboard.create({})
|
45
|
+
car.dashboard = dashboard
|
46
|
+
car.save
|
47
|
+
|
48
|
+
# Fetch related object from the respective database
|
49
|
+
car.dashboard
|
40
50
|
|
41
|
-
# Fetch related
|
42
|
-
|
51
|
+
# Fetch related object id
|
52
|
+
car.dashboard.car_id
|
53
|
+
|
54
|
+
# Set related objects
|
55
|
+
wheel_1 = Wheel.create
|
56
|
+
wheel_2 = Wheel.create
|
57
|
+
wheel_3 = Wheel.create
|
58
|
+
wheels = [wheel_1, wheel_2, wheel_3]
|
59
|
+
car.wheels = wheels
|
60
|
+
car.save
|
61
|
+
|
62
|
+
wheel_1.car_id # car.id
|
63
|
+
|
64
|
+
# Fetch array of related objects from the respective database
|
65
|
+
car.wheels # [wheel_1, wheel_2, wheel_3]
|
66
|
+
|
67
|
+
# Fetch ids of related objects from the database
|
68
|
+
car.wheel_ids # [wheel_1.id, wheel_2.id, wheel_3.id]
|
43
69
|
|
44
70
|
# Add a related object to the collection
|
45
|
-
|
46
|
-
|
71
|
+
new_wheel = Wheel.create
|
72
|
+
car.wheels << new_wheel
|
73
|
+
car.save
|
74
|
+
car.wheels # [wheel_1, wheel_2, wheel_3, wheel_4]
|
47
75
|
|
48
76
|
|
49
77
|
== Additional Usage Details
|
@@ -82,13 +110,9 @@ See EXTEND.rdoc for information on extendeding Tenacity to work with other ORMs.
|
|
82
110
|
|
83
111
|
bundler install
|
84
112
|
|
85
|
-
* Create the test databases
|
86
|
-
|
87
|
-
rake db:create
|
88
|
-
|
89
113
|
* Setup the test databases
|
90
114
|
|
91
|
-
rake
|
115
|
+
rake test:prepare
|
92
116
|
|
93
117
|
* Run the tests
|
94
118
|
|
data/Rakefile
CHANGED
@@ -45,49 +45,35 @@ task :clobber => [:clobber_rcov, :clobber_rdoc]
|
|
45
45
|
|
46
46
|
begin
|
47
47
|
require 'test/helpers/active_record_test_helper'
|
48
|
-
namespace :
|
49
|
-
desc "
|
50
|
-
task :
|
51
|
-
system "mysqladmin -u root create tenacity_test"
|
52
|
-
end
|
53
|
-
|
54
|
-
desc "Drop the test databases"
|
55
|
-
task :drop do
|
48
|
+
namespace :test do
|
49
|
+
desc "Setup the test databases"
|
50
|
+
task :prepare do
|
56
51
|
system "mysqladmin -u root drop -f tenacity_test"
|
57
|
-
|
58
|
-
|
59
|
-
desc "Reset the test databases"
|
60
|
-
task :reset => [:drop, :create] do
|
61
|
-
Rake::Task['db:test:prepare'].invoke
|
62
|
-
end
|
63
|
-
|
64
|
-
namespace :test do
|
65
|
-
desc "Setup the test databases"
|
66
|
-
task :prepare do
|
67
|
-
ActiveRecord::Schema.define :version => 0 do
|
52
|
+
system "mysqladmin -u root create tenacity_test"
|
68
53
|
|
69
|
-
|
70
|
-
end
|
54
|
+
ActiveRecord::Schema.define :version => 0 do
|
71
55
|
|
72
|
-
|
73
|
-
|
74
|
-
end
|
56
|
+
create_table :active_record_cars, :force => true do |t|
|
57
|
+
end
|
75
58
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
end
|
59
|
+
create_table :active_record_climate_control_units, :force => true do |t|
|
60
|
+
t.string :mongo_mapper_dashboard_id
|
61
|
+
end
|
80
62
|
|
81
|
-
|
82
|
-
|
83
|
-
|
63
|
+
create_table :active_record_cars_mongo_mapper_wheels, :force => true do |t|
|
64
|
+
t.integer :active_record_car_id
|
65
|
+
t.string :mongo_mapper_wheel_id
|
66
|
+
end
|
84
67
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
end
|
68
|
+
create_table :active_record_nuts, :force => true do |t|
|
69
|
+
t.string :mongo_mapper_wheel_id
|
70
|
+
end
|
89
71
|
|
72
|
+
create_table :active_record_nuts_mongo_mapper_wheels, :force => true do |t|
|
73
|
+
t.integer :active_record_nut_id
|
74
|
+
t.string :mongo_mapper_wheel_id
|
90
75
|
end
|
76
|
+
|
91
77
|
end
|
92
78
|
end
|
93
79
|
end
|
data/history.txt
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
== 0.1.1
|
2
|
+
|
3
|
+
* Bug fixes
|
4
|
+
|
5
|
+
* Fixed issue that was causing a load error if mongo mapper was not installed
|
6
|
+
|
7
|
+
== 0.1.0
|
8
|
+
|
9
|
+
* Major enhancements
|
10
|
+
|
11
|
+
* Initial release
|
12
|
+
* Support for has_one, belongs_to, and has_many associations
|
13
|
+
* Support for ActiveRecord, CouchRest, and MongoMapper
|
14
|
+
|
@@ -1,47 +1,47 @@
|
|
1
|
-
# Tenacity relationships on ActiveRecord objects require that certain columns
|
2
|
-
# exist on the associated table, and that join tables exist for one-to-many
|
3
|
-
# relationships. Take the following class for example:
|
4
|
-
#
|
5
|
-
# class Car < ActiveRecord::Base
|
6
|
-
# include Tenacity
|
7
|
-
#
|
8
|
-
# t_has_many :wheels
|
9
|
-
# t_has_one :dashboard
|
10
|
-
# t_belongs_to :driver
|
11
|
-
# end
|
12
|
-
#
|
13
|
-
#
|
14
|
-
# == t_belongs_to
|
15
|
-
#
|
16
|
-
# The +t_belongs_to+ association requires that a property exist in the table
|
17
|
-
# to hold the id of the assoicated object.
|
18
|
-
#
|
19
|
-
# create_table :cars do |t|
|
20
|
-
# t.string :driver_id
|
21
|
-
# end
|
22
|
-
#
|
23
|
-
#
|
24
|
-
# == t_has_one
|
25
|
-
#
|
26
|
-
# The +t_has_one+ association requires no special column in the table, since
|
27
|
-
# the associated object holds the foreign key.
|
28
|
-
#
|
29
|
-
#
|
30
|
-
# == t_has_many
|
31
|
-
#
|
32
|
-
# The +t_has_many+ association requires that a join table exist to store the
|
33
|
-
# associations. The name of the join table follows ActiveRecord conventions.
|
34
|
-
# The name of the join table in this example would be cars_wheels, since cars
|
35
|
-
# comes before wheels when shorted alphabetically.
|
36
|
-
#
|
37
|
-
# create_table :cars_wheels do |t|
|
38
|
-
# t.integer :car_id
|
39
|
-
# t.string :wheel_id
|
40
|
-
# end
|
41
|
-
#
|
42
1
|
begin
|
43
2
|
require 'active_record'
|
44
3
|
|
4
|
+
# Tenacity relationships on ActiveRecord objects require that certain columns
|
5
|
+
# exist on the associated table, and that join tables exist for one-to-many
|
6
|
+
# relationships. Take the following class for example:
|
7
|
+
#
|
8
|
+
# class Car < ActiveRecord::Base
|
9
|
+
# include Tenacity
|
10
|
+
#
|
11
|
+
# t_has_many :wheels
|
12
|
+
# t_has_one :dashboard
|
13
|
+
# t_belongs_to :driver
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
#
|
17
|
+
# == t_belongs_to
|
18
|
+
#
|
19
|
+
# The +t_belongs_to+ association requires that a property exist in the table
|
20
|
+
# to hold the id of the assoicated object.
|
21
|
+
#
|
22
|
+
# create_table :cars do |t|
|
23
|
+
# t.string :driver_id
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
#
|
27
|
+
# == t_has_one
|
28
|
+
#
|
29
|
+
# The +t_has_one+ association requires no special column in the table, since
|
30
|
+
# the associated object holds the foreign key.
|
31
|
+
#
|
32
|
+
#
|
33
|
+
# == t_has_many
|
34
|
+
#
|
35
|
+
# The +t_has_many+ association requires that a join table exist to store the
|
36
|
+
# associations. The name of the join table follows ActiveRecord conventions.
|
37
|
+
# The name of the join table in this example would be cars_wheels, since cars
|
38
|
+
# comes before wheels when shorted alphabetically.
|
39
|
+
#
|
40
|
+
# create_table :cars_wheels do |t|
|
41
|
+
# t.integer :car_id
|
42
|
+
# t.string :wheel_id
|
43
|
+
# end
|
44
|
+
#
|
45
45
|
module ActiveRecord
|
46
46
|
class Base #:nodoc:
|
47
47
|
|
@@ -1,41 +1,41 @@
|
|
1
|
-
# Tenacity relationships on CouchRest objects require no special keys
|
2
|
-
# defined on the object. Tenacity will define the keys that it needs
|
3
|
-
# to support the relationships. Take the following class for example:
|
4
|
-
#
|
5
|
-
# class Car < CouchRest::ExtendedDocument
|
6
|
-
# include Tenacity
|
7
|
-
#
|
8
|
-
# t_has_many :wheels
|
9
|
-
# t_has_one :dashboard
|
10
|
-
# t_belongs_to :driver
|
11
|
-
# end
|
12
|
-
#
|
13
|
-
# == t_belongs_to
|
14
|
-
#
|
15
|
-
# The +t_belongs_to+ association will define a property named after the association.
|
16
|
-
# The example above will create a property named <tt>:driver_id</tt>
|
17
|
-
#
|
18
|
-
#
|
19
|
-
# == t_has_one
|
20
|
-
#
|
21
|
-
# The +t_has_one+ association will not define any new properties on the object, since
|
22
|
-
# the associated object holds the foreign key. If the CouchRest::ExtendedDocument class
|
23
|
-
# is the target of a t_has_one association from another class, then a property
|
24
|
-
# named after the association will be created on the CouchRest::ExtendedDocument object to
|
25
|
-
# hold the foreign key to the other object.
|
26
|
-
#
|
27
|
-
#
|
28
|
-
# == t_has_many
|
29
|
-
#
|
30
|
-
# The +t_has_many+ association will define a property named after the association.
|
31
|
-
# The example above will create a property named <tt>:wheels_ids</tt>
|
32
|
-
#
|
33
|
-
|
34
1
|
begin
|
35
2
|
require 'couchrest'
|
36
3
|
|
37
|
-
module CouchRest
|
38
|
-
|
4
|
+
module CouchRest #:nodoc:
|
5
|
+
|
6
|
+
# Tenacity relationships on CouchRest objects require no special keys
|
7
|
+
# defined on the object. Tenacity will define the keys that it needs
|
8
|
+
# to support the relationships. Take the following class for example:
|
9
|
+
#
|
10
|
+
# class Car < CouchRest::ExtendedDocument
|
11
|
+
# include Tenacity
|
12
|
+
#
|
13
|
+
# t_has_many :wheels
|
14
|
+
# t_has_one :dashboard
|
15
|
+
# t_belongs_to :driver
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# == t_belongs_to
|
19
|
+
#
|
20
|
+
# The +t_belongs_to+ association will define a property named after the association.
|
21
|
+
# The example above will create a property named <tt>:driver_id</tt>
|
22
|
+
#
|
23
|
+
#
|
24
|
+
# == t_has_one
|
25
|
+
#
|
26
|
+
# The +t_has_one+ association will not define any new properties on the object, since
|
27
|
+
# the associated object holds the foreign key. If the CouchRest::ExtendedDocument class
|
28
|
+
# is the target of a t_has_one association from another class, then a property
|
29
|
+
# named after the association will be created on the CouchRest::ExtendedDocument object to
|
30
|
+
# hold the foreign key to the other object.
|
31
|
+
#
|
32
|
+
#
|
33
|
+
# == t_has_many
|
34
|
+
#
|
35
|
+
# The +t_has_many+ association will define a property named after the association.
|
36
|
+
# The example above will create a property named <tt>:wheels_ids</tt>
|
37
|
+
#
|
38
|
+
class ExtendedDocument
|
39
39
|
include CouchRest::TenacityInstanceMethods
|
40
40
|
extend CouchRest::TenacityClassMethods
|
41
41
|
end
|
@@ -1,40 +1,41 @@
|
|
1
|
-
# Tenacity relationships on CouchRest objects require no special keys
|
2
|
-
# defined on the object. Tenacity will define the keys that it needs
|
3
|
-
# to support the relationships. Take the following class for example:
|
4
|
-
#
|
5
|
-
# class Car < CouchRest::Model::Base
|
6
|
-
# include Tenacity
|
7
|
-
#
|
8
|
-
# t_has_many :wheels
|
9
|
-
# t_has_one :dashboard
|
10
|
-
# t_belongs_to :driver
|
11
|
-
# end
|
12
|
-
#
|
13
|
-
# == t_belongs_to
|
14
|
-
#
|
15
|
-
# The +t_belongs_to+ association will define a property named after the association.
|
16
|
-
# The example above will create a property named <tt>:driver_id</tt>
|
17
|
-
#
|
18
|
-
#
|
19
|
-
# == t_has_one
|
20
|
-
#
|
21
|
-
# The +t_has_one+ association will not define any new properties on the object, since
|
22
|
-
# the associated object holds the foreign key. If the CouchRest::Model class
|
23
|
-
# is the target of a t_has_one association from another class, then a property
|
24
|
-
# named after the association will be created on the CouchRest::Model object to
|
25
|
-
# hold the foreign key to the other object.
|
26
|
-
#
|
27
|
-
#
|
28
|
-
# == t_has_many
|
29
|
-
#
|
30
|
-
# The +t_has_many+ association will define a property named after the association.
|
31
|
-
# The example above will create a property named <tt>:wheels_ids</tt>
|
32
|
-
#
|
33
1
|
begin
|
34
2
|
require 'couchrest'
|
35
3
|
|
36
|
-
module CouchRest
|
37
|
-
module Model
|
4
|
+
module CouchRest #:nodoc:
|
5
|
+
module Model #:nodoc:
|
6
|
+
|
7
|
+
# Tenacity relationships on CouchRest objects require no special keys
|
8
|
+
# defined on the object. Tenacity will define the keys that it needs
|
9
|
+
# to support the relationships. Take the following class for example:
|
10
|
+
#
|
11
|
+
# class Car < CouchRest::Model::Base
|
12
|
+
# include Tenacity
|
13
|
+
#
|
14
|
+
# t_has_many :wheels
|
15
|
+
# t_has_one :dashboard
|
16
|
+
# t_belongs_to :driver
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# == t_belongs_to
|
20
|
+
#
|
21
|
+
# The +t_belongs_to+ association will define a property named after the association.
|
22
|
+
# The example above will create a property named <tt>:driver_id</tt>
|
23
|
+
#
|
24
|
+
#
|
25
|
+
# == t_has_one
|
26
|
+
#
|
27
|
+
# The +t_has_one+ association will not define any new properties on the object, since
|
28
|
+
# the associated object holds the foreign key. If the CouchRest::Model class
|
29
|
+
# is the target of a t_has_one association from another class, then a property
|
30
|
+
# named after the association will be created on the CouchRest::Model object to
|
31
|
+
# hold the foreign key to the other object.
|
32
|
+
#
|
33
|
+
#
|
34
|
+
# == t_has_many
|
35
|
+
#
|
36
|
+
# The +t_has_many+ association will define a property named after the association.
|
37
|
+
# The example above will create a property named <tt>:wheels_ids</tt>
|
38
|
+
#
|
38
39
|
class Base
|
39
40
|
include CouchRest::TenacityInstanceMethods
|
40
41
|
extend CouchRest::TenacityClassMethods
|
data/lib/tenacity/version.rb
CHANGED
data/tenacity.gemspec
CHANGED
@@ -12,6 +12,8 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.summary = %Q{A ORM independent way of specifying simple relationships between models backed by different databases.}
|
13
13
|
s.description = %Q{Tenacity provides an ORM independent way of specifying simple relationships between models backed by different databases.}
|
14
14
|
|
15
|
+
s.rubyforge_project = "tenacity"
|
16
|
+
|
15
17
|
s.required_rubygems_version = ">= 1.3.6"
|
16
18
|
|
17
19
|
s.add_runtime_dependency "activesupport", ">= 2.3"
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- John Wood
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-29 00:00:00 -06:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -185,6 +185,7 @@ files:
|
|
185
185
|
- LICENSE.txt
|
186
186
|
- README.rdoc
|
187
187
|
- Rakefile
|
188
|
+
- history.txt
|
188
189
|
- lib/tenacity.rb
|
189
190
|
- lib/tenacity/associations/belongs_to.rb
|
190
191
|
- lib/tenacity/associations/has_many.rb
|
@@ -244,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
244
245
|
version: 1.3.6
|
245
246
|
requirements: []
|
246
247
|
|
247
|
-
rubyforge_project:
|
248
|
+
rubyforge_project: tenacity
|
248
249
|
rubygems_version: 1.3.6
|
249
250
|
signing_key:
|
250
251
|
specification_version: 3
|