composite_primary_keys 0.7.5 → 0.8.0
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.txt +75 -0
- data/Rakefile +83 -101
- data/lib/composite_primary_keys.rb +8 -0
- data/lib/composite_primary_keys/associations.rb +66 -18
- data/lib/composite_primary_keys/base.rb +169 -159
- data/lib/composite_primary_keys/calculations.rb +63 -0
- data/lib/composite_primary_keys/connection_adapters/postgresql_adapter.rb +11 -0
- data/lib/composite_primary_keys/version.rb +2 -2
- data/scripts/txt2html +4 -2
- data/scripts/txt2js +3 -2
- data/test/abstract_unit.rb +9 -2
- data/test/connections/native_mysql/connection.rb +5 -2
- data/test/connections/native_postgresql/connection.rb +15 -0
- data/test/connections/native_sqlite/connection.rb +10 -0
- data/test/fixtures/db_definitions/mysql.sql +20 -0
- data/test/fixtures/db_definitions/postgresql.sql +100 -0
- data/test/fixtures/db_definitions/sqlite.sql +84 -0
- data/test/fixtures/group.rb +3 -0
- data/test/fixtures/groups.yml +3 -0
- data/test/fixtures/membership.rb +7 -0
- data/test/fixtures/membership_status.rb +3 -0
- data/test/fixtures/membership_statuses.yml +8 -0
- data/test/fixtures/memberships.yml +6 -0
- data/test/{associations_test.rb → test_associations.rb} +22 -12
- data/test/{attributes_test.rb → test_attributes.rb} +4 -5
- data/test/{clone_test.rb → test_clone.rb} +2 -3
- data/test/{create_test.rb → test_create.rb} +2 -3
- data/test/{delete_test.rb → test_delete.rb} +2 -3
- data/test/{dummy_test.rb → test_dummy.rb} +4 -5
- data/test/{find_test.rb → test_find.rb} +3 -4
- data/test/{ids_test.rb → test_ids.rb} +4 -4
- data/test/{miscellaneous_test.rb → test_miscellaneous.rb} +2 -3
- data/test/{pagination_test.rb → test_pagination.rb} +4 -3
- data/test/{santiago_test.rb → test_santiago.rb} +5 -3
- data/test/test_tutorial_examle.rb +29 -0
- data/test/{update_test.rb → test_update.rb} +2 -3
- data/website/index.html +267 -201
- data/website/index.txt +74 -70
- data/website/stylesheets/screen.css +33 -3
- data/website/version-raw.js +1 -1
- data/website/version.js +1 -1
- metadata +80 -66
- data/scripts/http-access2-2.0.6.gem +0 -0
- data/scripts/rubyforge +0 -217
- data/scripts/rubyforge-orig +0 -217
- data/test/fixtures/db_definitions/mysql.drop.sql +0 -10
Binary file
|
data/scripts/rubyforge
DELETED
@@ -1,217 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# RENAME THIS to rubyorge, and change username/password below to your rubyforge details.
|
4
|
-
# Set rubyforge file to Ignore on Subversion.
|
5
|
-
# libs
|
6
|
-
#
|
7
|
-
$VERBOSE = nil
|
8
|
-
require "getoptlong"
|
9
|
-
require "enumerator"
|
10
|
-
require "http-access2"
|
11
|
-
#
|
12
|
-
# config
|
13
|
-
#
|
14
|
-
config = {
|
15
|
-
"username" => "nicwilliams", # this must be your username
|
16
|
-
"password" => "UHUst0ck", # this must be your password
|
17
|
-
|
18
|
-
"group_id" => 1953, # see source of http://rubyforge.org/frs/admin/qrs.php?package=&group_id=1953
|
19
|
-
|
20
|
-
"package_ids" => { # configure shortcuts for your packages here
|
21
|
-
"compositekeys" => 2327,
|
22
|
-
},
|
23
|
-
|
24
|
-
"uri" => "http://rubyforge.org",
|
25
|
-
"cookie_jar" => File::join(File::expand_path("~"), ".rubyforge.cookie_jar"),
|
26
|
-
}
|
27
|
-
|
28
|
-
opts =
|
29
|
-
GetoptLong::new(
|
30
|
-
[ "--username" , "-u" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
31
|
-
[ "--password" , "-p" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
32
|
-
[ "--cookie_jar" , "-c" , GetoptLong::REQUIRED_ARGUMENT ]
|
33
|
-
).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
|
34
|
-
|
35
|
-
username = opts['username'] || config['username']
|
36
|
-
password = opts['password'] || config['password']
|
37
|
-
cookie_jar = opts["cookie_jar"] || config['cookie_jar']
|
38
|
-
#
|
39
|
-
# setup
|
40
|
-
#
|
41
|
-
mode = ARGV.shift
|
42
|
-
abort "#{ $0 } [login|create_package (package_name)|add_package (package_id release_name release.ext)]" unless mode
|
43
|
-
|
44
|
-
page, form, method = nil
|
45
|
-
extheader = {}
|
46
|
-
|
47
|
-
case mode
|
48
|
-
|
49
|
-
when %r/login/
|
50
|
-
page = "/account/login.php"
|
51
|
-
method = "post_content"
|
52
|
-
|
53
|
-
form = {
|
54
|
-
"return_to" => "",
|
55
|
-
"form_loginname" => username,
|
56
|
-
"form_pw" => password,
|
57
|
-
"login" => "Login"
|
58
|
-
}
|
59
|
-
|
60
|
-
when %r/create_package/
|
61
|
-
page = "/frs/admin/index.php"
|
62
|
-
method = "post_content"
|
63
|
-
|
64
|
-
opts =
|
65
|
-
GetoptLong::new(
|
66
|
-
[ "--group_id" , "-g" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
67
|
-
[ "--is_private" , "-P" , GetoptLong::REQUIRED_ARGUMENT ]
|
68
|
-
).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
|
69
|
-
|
70
|
-
package_name = ARGV.shift
|
71
|
-
abort "#{ $0 } package_name" unless package_name
|
72
|
-
|
73
|
-
group_id = opts["group_id"] || config["group_id"]
|
74
|
-
is_public = opts["is_private"] ? 0 : 1
|
75
|
-
|
76
|
-
form = {
|
77
|
-
"group_id" => group_id,
|
78
|
-
"package_name" => package_name,
|
79
|
-
"func" => "add_package",
|
80
|
-
"is_public" => is_public,
|
81
|
-
"submit" => "Create This Package",
|
82
|
-
}
|
83
|
-
|
84
|
-
when %r/add_release/
|
85
|
-
page = "/frs/admin/qrs.php"
|
86
|
-
method = "post_content"
|
87
|
-
|
88
|
-
opts =
|
89
|
-
GetoptLong::new(
|
90
|
-
[ "--group_id" , "-g" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
91
|
-
[ "--release_date" , "-r" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
92
|
-
[ "--type_id" , "-t" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
93
|
-
[ "--processor_id" , "-P" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
94
|
-
[ "--release_nots" , "-n" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
95
|
-
[ "--release_changes" , "-a" , GetoptLong::REQUIRED_ARGUMENT ]
|
96
|
-
).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
|
97
|
-
|
98
|
-
package_id, release_name, userfile, ignored = ARGV
|
99
|
-
abort "#{ $0 } package_name" unless
|
100
|
-
package_id and release_name and userfile
|
101
|
-
|
102
|
-
package_id = config["package_ids"][package_id] unless
|
103
|
-
package_id =~ %r/^\d+$/
|
104
|
-
|
105
|
-
group_id = opts["group_id"] || config["group_id"]
|
106
|
-
release_date = opts["release_date"] || Time::now.strftime('%Y-%m-%d %H:%M')
|
107
|
-
|
108
|
-
type_id = opts['type_id'] || userfile[%r|\.[^\./]+$|]
|
109
|
-
type_id = {
|
110
|
-
".deb" => 1000,
|
111
|
-
".rpm" => 2000,
|
112
|
-
".zip" => 3000,
|
113
|
-
".bz2" => 3100,
|
114
|
-
".gz" => 3110,
|
115
|
-
".src.zip" => 5000,
|
116
|
-
".src.bz2" => 5010,
|
117
|
-
".src.gz" => 5020,
|
118
|
-
".src.rpm" => 5100,
|
119
|
-
".src" => 5900,
|
120
|
-
".jpg" => 8000,
|
121
|
-
".txt" => 8100,
|
122
|
-
".text" => 8100,
|
123
|
-
".htm" => 8200,
|
124
|
-
".html" => 8200,
|
125
|
-
".pdf" => 8300,
|
126
|
-
".oth" => 9999,
|
127
|
-
".ebuild" => 1300,
|
128
|
-
".exe" => 1100,
|
129
|
-
".dmg" => 1200,
|
130
|
-
".tar.gz" => 5000,
|
131
|
-
".tgz" => 5000,
|
132
|
-
".gem" => 1400,
|
133
|
-
".pgp" => 8150,
|
134
|
-
".sig" => 8150,
|
135
|
-
}[type_id]
|
136
|
-
|
137
|
-
processor_id = opts['processor_id'] || 'Any'
|
138
|
-
processor_id = {
|
139
|
-
"i386" => 1000,
|
140
|
-
"IA64" => 6000,
|
141
|
-
"Alpha" => 7000,
|
142
|
-
"Any" => 8000,
|
143
|
-
"PPC" => 2000,
|
144
|
-
"MIPS" => 3000,
|
145
|
-
"Sparc" => 4000,
|
146
|
-
"UltraSparc" => 5000,
|
147
|
-
"Other" => 9999,
|
148
|
-
}[processor_id]
|
149
|
-
|
150
|
-
release_notes = opts['release_notes'] || nil
|
151
|
-
release_notes = open(release_notes) if release_notes
|
152
|
-
|
153
|
-
release_changes = opts['release_changes'] || nil
|
154
|
-
release_changes = open(release_changes) if release_changes
|
155
|
-
|
156
|
-
userfile = open(userfile)
|
157
|
-
|
158
|
-
preformatted = '1'
|
159
|
-
|
160
|
-
form = {
|
161
|
-
"group_id" => group_id,
|
162
|
-
"package_id" => package_id,
|
163
|
-
"release_name" => release_name,
|
164
|
-
"release_date" => release_date,
|
165
|
-
"type_id" => type_id,
|
166
|
-
"processor_id" => processor_id,
|
167
|
-
"preformatted" => preformatted,
|
168
|
-
"userfile" => userfile,
|
169
|
-
"submit" => "Release File"
|
170
|
-
}
|
171
|
-
|
172
|
-
boundary = Array::new(8){ "%2.2d" % rand(42) }.join('__')
|
173
|
-
extheader['content-type'] = "multipart/form-data; boundary=___#{ boundary }___"
|
174
|
-
|
175
|
-
else
|
176
|
-
abort "#{ $0 } login create_package add_release"
|
177
|
-
|
178
|
-
end
|
179
|
-
#
|
180
|
-
# http transaction
|
181
|
-
#
|
182
|
-
client = HTTPAccess2::Client::new ENV['HTTP_PROXY']
|
183
|
-
client.debug_dev = STDERR if ENV['DEBUG']
|
184
|
-
|
185
|
-
client.set_cookie_store cookie_jar
|
186
|
-
|
187
|
-
# fixes http-access2 bug
|
188
|
-
client.redirect_uri_callback = lambda do |res|
|
189
|
-
page = res.header['location'].first
|
190
|
-
page = page =~ %r/http/ ? page : "#{ config['uri'] }/#{ page }"
|
191
|
-
page
|
192
|
-
end
|
193
|
-
|
194
|
-
response = client.send "#{ method }", "#{ config['uri'] }/#{ page }", form, extheader
|
195
|
-
|
196
|
-
client.save_cookie_store
|
197
|
-
|
198
|
-
# fixes http-access2 bug
|
199
|
-
BEGIN {
|
200
|
-
require "http-access2"
|
201
|
-
module WebAgent::CookieUtils
|
202
|
-
def domain_match(host, domain)
|
203
|
-
case domain
|
204
|
-
when /\d+\.\d+\.\d+\.\d+/
|
205
|
-
return (host == domain)
|
206
|
-
when '.'
|
207
|
-
return true
|
208
|
-
when /^\./
|
209
|
-
#return tail_match?(domain, host)
|
210
|
-
return tail_match?(host, domain)
|
211
|
-
else
|
212
|
-
return (host == domain)
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
}
|
data/scripts/rubyforge-orig
DELETED
@@ -1,217 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# RENAME THIS to rubyorge, and change username/password below to your rubyforge details.
|
4
|
-
# Set rubyforge file to Ignore on Subversion.
|
5
|
-
# libs
|
6
|
-
#
|
7
|
-
$VERBOSE = nil
|
8
|
-
require "getoptlong"
|
9
|
-
require "enumerator"
|
10
|
-
require "http-access2"
|
11
|
-
#
|
12
|
-
# config
|
13
|
-
#
|
14
|
-
config = {
|
15
|
-
"username" => "username", # this must be your username
|
16
|
-
"password" => "password", # this must be your password
|
17
|
-
|
18
|
-
"group_id" => 1953, # see source of http://rubyforge.org/frs/admin/qrs.php?package=&group_id=1953
|
19
|
-
|
20
|
-
"package_ids" => { # configure shortcuts for your packages here
|
21
|
-
"compositekeys" => 2327,
|
22
|
-
},
|
23
|
-
|
24
|
-
"uri" => "http://rubyforge.org",
|
25
|
-
"cookie_jar" => File::join(File::expand_path("~"), ".rubyforge.cookie_jar"),
|
26
|
-
}
|
27
|
-
|
28
|
-
opts =
|
29
|
-
GetoptLong::new(
|
30
|
-
[ "--username" , "-u" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
31
|
-
[ "--password" , "-p" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
32
|
-
[ "--cookie_jar" , "-c" , GetoptLong::REQUIRED_ARGUMENT ]
|
33
|
-
).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
|
34
|
-
|
35
|
-
username = opts['username'] || config['username']
|
36
|
-
password = opts['password'] || config['password']
|
37
|
-
cookie_jar = opts["cookie_jar"] || config['cookie_jar']
|
38
|
-
#
|
39
|
-
# setup
|
40
|
-
#
|
41
|
-
mode = ARGV.shift
|
42
|
-
abort "#{ $0 } [login|create_package (package_name)|add_package (package_id release_name release.ext)]" unless mode
|
43
|
-
|
44
|
-
page, form, method = nil
|
45
|
-
extheader = {}
|
46
|
-
|
47
|
-
case mode
|
48
|
-
|
49
|
-
when %r/login/
|
50
|
-
page = "/account/login.php"
|
51
|
-
method = "post_content"
|
52
|
-
|
53
|
-
form = {
|
54
|
-
"return_to" => "",
|
55
|
-
"form_loginname" => username,
|
56
|
-
"form_pw" => password,
|
57
|
-
"login" => "Login"
|
58
|
-
}
|
59
|
-
|
60
|
-
when %r/create_package/
|
61
|
-
page = "/frs/admin/index.php"
|
62
|
-
method = "post_content"
|
63
|
-
|
64
|
-
opts =
|
65
|
-
GetoptLong::new(
|
66
|
-
[ "--group_id" , "-g" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
67
|
-
[ "--is_private" , "-P" , GetoptLong::REQUIRED_ARGUMENT ]
|
68
|
-
).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
|
69
|
-
|
70
|
-
package_name = ARGV.shift
|
71
|
-
abort "#{ $0 } package_name" unless package_name
|
72
|
-
|
73
|
-
group_id = opts["group_id"] || config["group_id"]
|
74
|
-
is_public = opts["is_private"] ? 0 : 1
|
75
|
-
|
76
|
-
form = {
|
77
|
-
"group_id" => group_id,
|
78
|
-
"package_name" => package_name,
|
79
|
-
"func" => "add_package",
|
80
|
-
"is_public" => is_public,
|
81
|
-
"submit" => "Create This Package",
|
82
|
-
}
|
83
|
-
|
84
|
-
when %r/add_release/
|
85
|
-
page = "/frs/admin/qrs.php"
|
86
|
-
method = "post_content"
|
87
|
-
|
88
|
-
opts =
|
89
|
-
GetoptLong::new(
|
90
|
-
[ "--group_id" , "-g" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
91
|
-
[ "--release_date" , "-r" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
92
|
-
[ "--type_id" , "-t" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
93
|
-
[ "--processor_id" , "-P" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
94
|
-
[ "--release_nots" , "-n" , GetoptLong::REQUIRED_ARGUMENT ] ,
|
95
|
-
[ "--release_changes" , "-a" , GetoptLong::REQUIRED_ARGUMENT ]
|
96
|
-
).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
|
97
|
-
|
98
|
-
package_id, release_name, userfile, ignored = ARGV
|
99
|
-
abort "#{ $0 } package_name" unless
|
100
|
-
package_id and release_name and userfile
|
101
|
-
|
102
|
-
package_id = config["package_ids"][package_id] unless
|
103
|
-
package_id =~ %r/^\d+$/
|
104
|
-
|
105
|
-
group_id = opts["group_id"] || config["group_id"]
|
106
|
-
release_date = opts["release_date"] || Time::now.strftime('%Y-%m-%d %H:%M')
|
107
|
-
|
108
|
-
type_id = opts['type_id'] || userfile[%r|\.[^\./]+$|]
|
109
|
-
type_id = {
|
110
|
-
".deb" => 1000,
|
111
|
-
".rpm" => 2000,
|
112
|
-
".zip" => 3000,
|
113
|
-
".bz2" => 3100,
|
114
|
-
".gz" => 3110,
|
115
|
-
".src.zip" => 5000,
|
116
|
-
".src.bz2" => 5010,
|
117
|
-
".src.gz" => 5020,
|
118
|
-
".src.rpm" => 5100,
|
119
|
-
".src" => 5900,
|
120
|
-
".jpg" => 8000,
|
121
|
-
".txt" => 8100,
|
122
|
-
".text" => 8100,
|
123
|
-
".htm" => 8200,
|
124
|
-
".html" => 8200,
|
125
|
-
".pdf" => 8300,
|
126
|
-
".oth" => 9999,
|
127
|
-
".ebuild" => 1300,
|
128
|
-
".exe" => 1100,
|
129
|
-
".dmg" => 1200,
|
130
|
-
".tar.gz" => 5000,
|
131
|
-
".tgz" => 5000,
|
132
|
-
".gem" => 1400,
|
133
|
-
".pgp" => 8150,
|
134
|
-
".sig" => 8150,
|
135
|
-
}[type_id]
|
136
|
-
|
137
|
-
processor_id = opts['processor_id'] || 'Any'
|
138
|
-
processor_id = {
|
139
|
-
"i386" => 1000,
|
140
|
-
"IA64" => 6000,
|
141
|
-
"Alpha" => 7000,
|
142
|
-
"Any" => 8000,
|
143
|
-
"PPC" => 2000,
|
144
|
-
"MIPS" => 3000,
|
145
|
-
"Sparc" => 4000,
|
146
|
-
"UltraSparc" => 5000,
|
147
|
-
"Other" => 9999,
|
148
|
-
}[processor_id]
|
149
|
-
|
150
|
-
release_notes = opts['release_notes'] || nil
|
151
|
-
release_notes = open(release_notes) if release_notes
|
152
|
-
|
153
|
-
release_changes = opts['release_changes'] || nil
|
154
|
-
release_changes = open(release_changes) if release_changes
|
155
|
-
|
156
|
-
userfile = open(userfile)
|
157
|
-
|
158
|
-
preformatted = '1'
|
159
|
-
|
160
|
-
form = {
|
161
|
-
"group_id" => group_id,
|
162
|
-
"package_id" => package_id,
|
163
|
-
"release_name" => release_name,
|
164
|
-
"release_date" => release_date,
|
165
|
-
"type_id" => type_id,
|
166
|
-
"processor_id" => processor_id,
|
167
|
-
"preformatted" => preformatted,
|
168
|
-
"userfile" => userfile,
|
169
|
-
"submit" => "Release File"
|
170
|
-
}
|
171
|
-
|
172
|
-
boundary = Array::new(8){ "%2.2d" % rand(42) }.join('__')
|
173
|
-
extheader['content-type'] = "multipart/form-data; boundary=___#{ boundary }___"
|
174
|
-
|
175
|
-
else
|
176
|
-
abort "#{ $0 } login create_package add_release"
|
177
|
-
|
178
|
-
end
|
179
|
-
#
|
180
|
-
# http transaction
|
181
|
-
#
|
182
|
-
client = HTTPAccess2::Client::new ENV['HTTP_PROXY']
|
183
|
-
client.debug_dev = STDERR if ENV['DEBUG']
|
184
|
-
|
185
|
-
client.set_cookie_store cookie_jar
|
186
|
-
|
187
|
-
# fixes http-access2 bug
|
188
|
-
client.redirect_uri_callback = lambda do |res|
|
189
|
-
page = res.header['location'].first
|
190
|
-
page = page =~ %r/http/ ? page : "#{ config['uri'] }/#{ page }"
|
191
|
-
page
|
192
|
-
end
|
193
|
-
|
194
|
-
response = client.send "#{ method }", "#{ config['uri'] }/#{ page }", form, extheader
|
195
|
-
|
196
|
-
client.save_cookie_store
|
197
|
-
|
198
|
-
# fixes http-access2 bug
|
199
|
-
BEGIN {
|
200
|
-
require "http-access2"
|
201
|
-
module WebAgent::CookieUtils
|
202
|
-
def domain_match(host, domain)
|
203
|
-
case domain
|
204
|
-
when /\d+\.\d+\.\d+\.\d+/
|
205
|
-
return (host == domain)
|
206
|
-
when '.'
|
207
|
-
return true
|
208
|
-
when /^\./
|
209
|
-
#return tail_match?(domain, host)
|
210
|
-
return tail_match?(host, domain)
|
211
|
-
else
|
212
|
-
return (host == domain)
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
}
|