composite_primary_keys 0.8.6 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. data/History.txt +9 -0
  2. data/Manifest.txt +37 -0
  3. data/README.txt +34 -9
  4. data/README_DB2.txt +33 -0
  5. data/Rakefile +8 -119
  6. data/init.rb +2 -0
  7. data/lib/adapter_helper/base.rb +63 -0
  8. data/lib/adapter_helper/mysql.rb +13 -0
  9. data/lib/adapter_helper/oracle.rb +13 -0
  10. data/lib/adapter_helper/postgresql.rb +13 -0
  11. data/lib/adapter_helper/sqlite3.rb +13 -0
  12. data/lib/composite_primary_keys.rb +2 -2
  13. data/lib/composite_primary_keys/associations.rb +53 -28
  14. data/lib/composite_primary_keys/base.rb +4 -1
  15. data/lib/composite_primary_keys/connection_adapters/ibm_db_adapter.rb +21 -0
  16. data/lib/composite_primary_keys/connection_adapters/postgresql_adapter.rb +1 -1
  17. data/lib/composite_primary_keys/migration.rb +13 -0
  18. data/lib/composite_primary_keys/version.rb +2 -2
  19. data/loader.rb +24 -0
  20. data/local/database_connections.rb.sample +10 -0
  21. data/local/paths.rb.sample +2 -0
  22. data/local/tasks.rb.sample +2 -0
  23. data/scripts/console.rb +25 -0
  24. data/tasks/activerecord_selection.rake +43 -0
  25. data/tasks/databases.rake +10 -0
  26. data/tasks/databases/mysql.rake +30 -0
  27. data/tasks/databases/oracle.rake +15 -0
  28. data/tasks/databases/postgresql.rake +26 -0
  29. data/tasks/databases/sqlite3.rake +28 -0
  30. data/tasks/deployment.rake +22 -0
  31. data/tasks/local_setup.rake +13 -0
  32. data/tasks/website.rake +18 -0
  33. data/test/README_tests.txt +67 -0
  34. data/test/abstract_unit.rb +2 -4
  35. data/test/connections/native_ibm_db/connection.rb +23 -0
  36. data/test/connections/native_mysql/connection.rb +8 -13
  37. data/test/connections/native_oracle/connection.rb +8 -11
  38. data/test/connections/native_postgresql/connection.rb +3 -9
  39. data/test/connections/native_sqlite/connection.rb +4 -5
  40. data/test/fixtures/comment.rb +5 -0
  41. data/test/fixtures/comments.yml +14 -0
  42. data/test/fixtures/db_definitions/db2-create-tables.sql +92 -0
  43. data/test/fixtures/db_definitions/db2-drop-tables.sql +13 -0
  44. data/test/fixtures/db_definitions/mysql.sql +24 -0
  45. data/test/fixtures/db_definitions/oracle.drop.sql +6 -0
  46. data/test/fixtures/db_definitions/oracle.sql +28 -1
  47. data/test/fixtures/db_definitions/postgresql.sql +24 -0
  48. data/test/fixtures/db_definitions/sqlite.sql +21 -0
  49. data/test/fixtures/department.rb +5 -0
  50. data/test/fixtures/departments.yml +3 -0
  51. data/test/fixtures/employee.rb +4 -0
  52. data/test/fixtures/employees.yml +9 -0
  53. data/test/fixtures/hack.rb +6 -0
  54. data/test/fixtures/hacks.yml +2 -0
  55. data/test/fixtures/product.rb +3 -2
  56. data/test/fixtures/streets.yml +11 -1
  57. data/test/fixtures/suburb.rb +2 -0
  58. data/test/fixtures/suburbs.yml +6 -1
  59. data/test/fixtures/user.rb +1 -0
  60. data/test/test_associations.rb +29 -5
  61. data/test/test_delete.rb +23 -2
  62. data/test/test_polymorphic.rb +24 -0
  63. data/tmp/test.db +0 -0
  64. data/website/index.html +2 -2
  65. data/website/version-raw.js +1 -1
  66. data/website/version.js +1 -1
  67. metadata +43 -3
@@ -19,3 +19,9 @@ drop sequence groups_seq;
19
19
  drop table memberships;
20
20
  drop table membership_statuses;
21
21
  drop sequence membership_statuses_seq;
22
+ drop table departments;
23
+ drop table employees;
24
+ drop sequence employees_seq;
25
+ drop table comments;
26
+ drop sequence comments_seq;
27
+ drop table hacks;
@@ -108,4 +108,31 @@ create table membership_statuses (
108
108
 
109
109
  create sequence membership_statuses_seq
110
110
  start with 1000;
111
-
111
+
112
+ CREATE TABLE departments (
113
+ department_id number(11) NOT NULL,
114
+ location_id number(11) NOT NULL,
115
+ constraint departments_pk primary key(department_id, location_id)
116
+ );
117
+
118
+ CREATE TABLE employees (
119
+ id number(11) NOT NULL primary key,
120
+ department_id number(11) DEFAULT NULL,
121
+ location_id number(11) DEFAULT NULL
122
+ );
123
+
124
+ create sequence employees_seq
125
+ start with 1000;
126
+
127
+ CREATE TABLE comments (
128
+ id number(11) NOT NULL PRIMARY KEY,
129
+ person_id varchar(100) DEFAULT NULL,
130
+ person_type varchar(100) DEFAULT NULL
131
+ );
132
+
133
+ create sequence comments_seq
134
+ start with 1000;
135
+
136
+ CREATE TABLE hacks (
137
+ name varchar(50) NOT NULL PRIMARY KEY
138
+ );
@@ -98,3 +98,27 @@ CREATE TABLE membership_statuses (
98
98
  PRIMARY KEY (id)
99
99
  );
100
100
 
101
+ CREATE TABLE departments (
102
+ department_id int NOT NULL,
103
+ location_id int NOT NULL,
104
+ PRIMARY KEY (department_id, location_id)
105
+ );
106
+
107
+ CREATE TABLE employees (
108
+ id int NOT NULL,
109
+ department_id int DEFAULT NULL,
110
+ location_id int DEFAULT NULL,
111
+ PRIMARY KEY (id)
112
+ );
113
+
114
+ CREATE TABLE comments (
115
+ id int NOT NULL,
116
+ person_id varchar(100) DEFAULT NULL,
117
+ person_type varchar(100) DEFAULT NULL,
118
+ PRIMARY KEY (id)
119
+ );
120
+
121
+ CREATE TABLE hacks (
122
+ name varchar(50) NOT NULL,
123
+ PRIMARY KEY (name)
124
+ );
@@ -82,3 +82,24 @@ CREATE TABLE membership_statuses (
82
82
  status varchar(50) NOT NULL
83
83
  );
84
84
 
85
+ CREATE TABLE departments (
86
+ department_id INTEGER NOT NULL,
87
+ location_id INTEGER NOT NULL,
88
+ PRIMARY KEY (department_id, location_id)
89
+ );
90
+
91
+ CREATE TABLE employees (
92
+ id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
93
+ department_id INTEGER NULL,
94
+ location_id INTEGER NULL
95
+ );
96
+
97
+ CREATE TABLE comments (
98
+ id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
99
+ person_id varchar(100) NULL,
100
+ person_type varchar(100) NULL
101
+ );
102
+
103
+ CREATE TABLE hacks (
104
+ name varchar(50) NOT NULL PRIMARY KEY
105
+ );
@@ -0,0 +1,5 @@
1
+ class Department < ActiveRecord::Base
2
+ # set_primary_keys *keys - turns on composite key functionality
3
+ set_primary_keys :department_id, :location_id
4
+ has_many :employees, :foreign_key => [:department_id, :location_id]
5
+ end
@@ -0,0 +1,3 @@
1
+ department1-cpk:
2
+ department_id: 1
3
+ location_id: 1
@@ -0,0 +1,4 @@
1
+ class Employee < ActiveRecord::Base
2
+ belongs_to :department, :foreign_key => [:department_id, :location_id]
3
+ has_many :comments, :as => :person
4
+ end
@@ -0,0 +1,9 @@
1
+ employee1:
2
+ id: 1
3
+ department_id: 1
4
+ location_id: 1
5
+ employee2:
6
+ id: 2
7
+ department_id: 1
8
+ location_id: 1
9
+
@@ -0,0 +1,6 @@
1
+ class Hack < ActiveRecord::Base
2
+ set_primary_keys :name
3
+ has_many :comments, :as => :person
4
+
5
+ has_one :first_comment, :as => :person, :class_name => "Comment"
6
+ end
@@ -0,0 +1,2 @@
1
+ andrew:
2
+ name: andrew
@@ -1,6 +1,7 @@
1
1
  class Product < ActiveRecord::Base
2
- set_primary_key :id # redundant
2
+ set_primary_keys :id # redundant
3
3
  has_many :product_tariffs, :foreign_key => :product_id
4
4
  has_one :product_tariff, :foreign_key => :product_id
5
- has_many :tariffs, :through => :product_tariffs, :foreign_key => :product_id
5
+
6
+ has_many :tariffs, :through => :product_tariffs, :foreign_key => [:tariff_id, :tariff_start_date]
6
7
  end
@@ -2,4 +2,14 @@ first:
2
2
  id: 1
3
3
  city_id: 1
4
4
  suburb_id: 1
5
- name: First Street
5
+ name: First Street
6
+ second1:
7
+ id: 2
8
+ city_id: 2
9
+ suburb_id: 1
10
+ name: First Street
11
+ second2:
12
+ id: 3
13
+ city_id: 2
14
+ suburb_id: 1
15
+ name: Second Street
@@ -1,4 +1,6 @@
1
1
  class Suburb < ActiveRecord::Base
2
2
  set_primary_keys :city_id, :suburb_id
3
3
  has_many :streets, :foreign_key => [:city_id, :suburb_id]
4
+ has_many :first_streets, :foreign_key => [:city_id, :suburb_id],
5
+ :class_name => 'Street', :conditions => "streets.name = 'First Street'"
4
6
  end
@@ -1,4 +1,9 @@
1
1
  first:
2
2
  city_id: 1
3
3
  suburb_id: 1
4
- name: First Suburb
4
+ name: First Suburb
5
+ second:
6
+ city_id: 2
7
+ suburb_id: 1
8
+ name: Second Suburb
9
+
@@ -1,5 +1,6 @@
1
1
  class User < ActiveRecord::Base
2
2
  has_many :readings
3
3
  has_many :articles, :through => :readings
4
+ has_many :comments, :as => :person
4
5
  end
5
6
 
@@ -78,13 +78,18 @@ class TestAssociations < Test::Unit::TestCase
78
78
  assert_not_nil @product_tariffs.first.instance_variable_get('@product'), '@product not set'
79
79
  end
80
80
 
81
- def XXX_test_find_includes_extended
82
- # TODO - what's the correct syntax?
83
- assert @products = Product.find(:all, :include => {:product_tariffs => :tariffs})
84
- assert_equal 3, @products.inject(0) {|sum, tariff| sum + tariff.instance_variable_get('@product_tariffs').length},
81
+ def test_find_includes_comp_belongs_to_tariff
82
+ assert @product_tariffs = ProductTariff.find(:all, :include => :tariff)
83
+ assert_equal 3, @product_tariffs.length
84
+ assert_not_nil @product_tariffs.first.instance_variable_get('@tariff'), '@tariff not set'
85
+ end
86
+
87
+ def test_find_includes_extended
88
+ assert @products = Product.find(:all, :include => {:product_tariffs => :tariff})
89
+ assert_equal 3, @products.inject(0) {|sum, product| sum + product.instance_variable_get('@product_tariffs').length},
85
90
  "Incorrect number of product_tariffs returned"
86
91
 
87
- assert @tariffs = Tariff.find(:all, :include => {:product_tariffs => :products})
92
+ assert @tariffs = Tariff.find(:all, :include => {:product_tariffs => :product})
88
93
  assert_equal 3, @tariffs.inject(0) {|sum, tariff| sum + tariff.instance_variable_get('@product_tariffs').length},
89
94
  "Incorrect number of product_tariffs returned"
90
95
  end
@@ -97,4 +102,23 @@ class TestAssociations < Test::Unit::TestCase
97
102
  assert_equal('(foo=1 AND bar=2)', where_clause)
98
103
  end
99
104
 
105
+ def test_has_many_through
106
+ @products = Product.find(:all, :include => :tariffs)
107
+ assert_equal 3, @products.inject(0) {|sum, product| sum + product.instance_variable_get('@tariffs').length},
108
+ "Incorrect number of tariffs returned"
109
+ end
110
+
111
+ def test_associations_with_conditions
112
+ @suburb = Suburb.find([2, 1])
113
+ assert_equal 2, @suburb.streets.size
114
+
115
+ @suburb = Suburb.find([2, 1])
116
+ assert_equal 1, @suburb.first_streets.size
117
+
118
+ @suburb = Suburb.find([2, 1], :include => :streets)
119
+ assert_equal 2, @suburb.streets.size
120
+
121
+ @suburb = Suburb.find([2, 1], :include => :first_streets)
122
+ assert_equal 1, @suburb.first_streets.size
123
+ end
100
124
  end
data/test/test_delete.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'abstract_unit'
2
2
  require 'fixtures/reference_type'
3
3
  require 'fixtures/reference_code'
4
+ require 'fixtures/department'
5
+ require 'fixtures/employee'
4
6
 
5
7
  class TestDelete < Test::Unit::TestCase
6
8
 
@@ -16,7 +18,7 @@ class TestDelete < Test::Unit::TestCase
16
18
  }
17
19
 
18
20
  def setup
19
- create_fixtures :reference_types, :reference_codes
21
+ create_fixtures :reference_types, :reference_codes, :departments, :employees
20
22
  self.class.classes = CLASSES
21
23
  end
22
24
 
@@ -63,4 +65,23 @@ class TestDelete < Test::Unit::TestCase
63
65
  @klass.delete_all
64
66
  end
65
67
  end
66
- end
68
+
69
+ def test_clear_association
70
+ department = Department.find(1,1)
71
+ assert_equal 2, department.employees.size, "Employee count for department should be 2 before clear"
72
+ department.employees.clear
73
+ assert_equal 0, department.employees.size, "After clear size should 0"
74
+ department.reload
75
+ assert_equal 0, department.employees.size, "After clear count in database should have been 0"
76
+ end
77
+
78
+ def test_delete_association
79
+ department = Department.find(1,1)
80
+ assert_equal 2, department.employees.size , "Employee count for department should be 2 before delete"
81
+ first_employee = department.employees[0]
82
+ department.employees.delete(first_employee)
83
+ assert_equal 1, department.employees.size, "After delete employees count should be 1."
84
+ department.reload
85
+ assert_equal 1, department.employees.size, "After delete employees count should be 1 after reload from DB."
86
+ end
87
+ end
@@ -0,0 +1,24 @@
1
+ require 'abstract_unit'
2
+ require 'fixtures/comment'
3
+ require 'fixtures/user'
4
+ require 'fixtures/employee'
5
+ require 'fixtures/hack'
6
+
7
+ class TestPolymorphic < Test::Unit::TestCase
8
+
9
+ def setup
10
+ create_fixtures :users, :employees, :comments, :hacks
11
+ end
12
+
13
+
14
+ def test_polymorphic_has_many
15
+ comments = Hack.find('andrew').comments
16
+ assert comments[0].person_id = 'andrew'
17
+ end
18
+
19
+ def test_polymorphic_has_one
20
+ first_comment = Hack.find('andrew').first_comment
21
+ assert first_comment.person_id = 'andrew'
22
+ end
23
+
24
+ end
data/tmp/test.db ADDED
Binary file
data/website/index.html CHANGED
@@ -33,7 +33,7 @@
33
33
  <h1>Composite Primary Keys</h1>
34
34
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/compositekeys"; return false'>
35
35
  Get Version
36
- <a href="http://rubyforge.org/projects/compositekeys" class="numbers">0.8.6</a>
36
+ <a href="http://rubyforge.org/projects/compositekeys" class="numbers">0.9.0</a>
37
37
  </div>
38
38
  <h1>&#x2192; Ruby on Rails</h1>
39
39
 
@@ -291,7 +291,7 @@ other stories and things.</p>
291
291
 
292
292
  <p>Comments are welcome. Send an email to <a href="mailto:drnicwilliams@gmail.com">Dr Nic Williams</a>.</p>
293
293
  <p class="coda">
294
- <a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 1st June 2007<br>
294
+ <a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 16th August 2007<br>
295
295
  Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
296
296
  </p>
297
297
  </div>
@@ -1,3 +1,3 @@
1
1
  // Announcement JS file
2
- var version = "0.8.6";
2
+ var version = "0.9.0";
3
3
  MagicAnnouncement.show('compositekeys', version);
data/website/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  // Version JS file
2
- var version = "0.8.6";
2
+ var version = "0.9.0";
3
3
 
4
4
  document.write(" - " + version);
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4.1
2
+ rubygems_version: 0.9.4.3
3
3
  specification_version: 1
4
4
  name: composite_primary_keys
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.8.6
7
- date: 2007-06-12 00:00:00 +02:00
6
+ version: 0.9.0
7
+ date: 2007-09-28 00:00:00 +10:00
8
8
  summary: Composite key support for ActiveRecords
9
9
  require_paths:
10
10
  - lib
@@ -32,35 +32,70 @@ files:
32
32
  - History.txt
33
33
  - Manifest.txt
34
34
  - README.txt
35
+ - README_DB2.txt
35
36
  - Rakefile
37
+ - init.rb
36
38
  - install.rb
39
+ - lib/adapter_helper/base.rb
40
+ - lib/adapter_helper/mysql.rb
41
+ - lib/adapter_helper/oracle.rb
42
+ - lib/adapter_helper/postgresql.rb
43
+ - lib/adapter_helper/sqlite3.rb
37
44
  - lib/composite_primary_keys.rb
38
45
  - lib/composite_primary_keys/associations.rb
39
46
  - lib/composite_primary_keys/base.rb
40
47
  - lib/composite_primary_keys/calculations.rb
41
48
  - lib/composite_primary_keys/composite_arrays.rb
49
+ - lib/composite_primary_keys/connection_adapters/ibm_db_adapter.rb
42
50
  - lib/composite_primary_keys/connection_adapters/oracle_adapter.rb
43
51
  - lib/composite_primary_keys/connection_adapters/postgresql_adapter.rb
44
52
  - lib/composite_primary_keys/fixtures.rb
53
+ - lib/composite_primary_keys/migration.rb
45
54
  - lib/composite_primary_keys/reflection.rb
46
55
  - lib/composite_primary_keys/version.rb
56
+ - loader.rb
57
+ - local/database_connections.rb.sample
58
+ - local/paths.rb.sample
59
+ - local/tasks.rb.sample
60
+ - scripts/console.rb
47
61
  - scripts/txt2html
48
62
  - scripts/txt2js
63
+ - tasks/activerecord_selection.rake
64
+ - tasks/databases.rake
65
+ - tasks/databases/mysql.rake
66
+ - tasks/databases/oracle.rake
67
+ - tasks/databases/postgresql.rake
68
+ - tasks/databases/sqlite3.rake
69
+ - tasks/deployment.rake
70
+ - tasks/local_setup.rake
71
+ - tasks/website.rake
72
+ - test/README_tests.txt
49
73
  - test/abstract_unit.rb
50
74
  - test/composite_arrays_test.rb
75
+ - test/connections/native_ibm_db/connection.rb
51
76
  - test/connections/native_mysql/connection.rb
52
77
  - test/connections/native_oracle/connection.rb
53
78
  - test/connections/native_postgresql/connection.rb
54
79
  - test/connections/native_sqlite/connection.rb
55
80
  - test/fixtures/article.rb
56
81
  - test/fixtures/articles.yml
82
+ - test/fixtures/comment.rb
83
+ - test/fixtures/comments.yml
84
+ - test/fixtures/db_definitions/db2-create-tables.sql
85
+ - test/fixtures/db_definitions/db2-drop-tables.sql
57
86
  - test/fixtures/db_definitions/mysql.sql
58
87
  - test/fixtures/db_definitions/oracle.drop.sql
59
88
  - test/fixtures/db_definitions/oracle.sql
60
89
  - test/fixtures/db_definitions/postgresql.sql
61
90
  - test/fixtures/db_definitions/sqlite.sql
91
+ - test/fixtures/department.rb
92
+ - test/fixtures/departments.yml
93
+ - test/fixtures/employee.rb
94
+ - test/fixtures/employees.yml
62
95
  - test/fixtures/group.rb
63
96
  - test/fixtures/groups.yml
97
+ - test/fixtures/hack.rb
98
+ - test/fixtures/hacks.yml
64
99
  - test/fixtures/membership.rb
65
100
  - test/fixtures/membership_status.rb
66
101
  - test/fixtures/membership_statuses.yml
@@ -94,9 +129,11 @@ files:
94
129
  - test/test_ids.rb
95
130
  - test/test_miscellaneous.rb
96
131
  - test/test_pagination.rb
132
+ - test/test_polymorphic.rb
97
133
  - test/test_santiago.rb
98
134
  - test/test_tutorial_examle.rb
99
135
  - test/test_update.rb
136
+ - tmp/test.db
100
137
  - website/index.html
101
138
  - website/index.txt
102
139
  - website/javascripts/rounded_corners_lite.inc.js
@@ -118,6 +155,7 @@ test_files:
118
155
  - test/test_ids.rb
119
156
  - test/test_miscellaneous.rb
120
157
  - test/test_pagination.rb
158
+ - test/test_polymorphic.rb
121
159
  - test/test_santiago.rb
122
160
  - test/test_tutorial_examle.rb
123
161
  - test/test_update.rb
@@ -128,6 +166,8 @@ extra_rdoc_files:
128
166
  - History.txt
129
167
  - Manifest.txt
130
168
  - README.txt
169
+ - README_DB2.txt
170
+ - test/README_tests.txt
131
171
  - website/index.txt
132
172
  - website/version-raw.txt
133
173
  - website/version.txt