arel 0.1.0 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitmodules +3 -0
- data/README.markdown +26 -26
- data/Rakefile +34 -46
- data/Thorfile +122 -0
- data/arel.gemspec +205 -201
- data/lib/arel.rb +11 -7
- data/lib/arel/algebra.rb +7 -2
- data/lib/arel/algebra/{primitives/attribute.rb → attribute.rb} +7 -7
- data/lib/arel/algebra/core_extensions.rb +4 -0
- data/lib/arel/algebra/{extensions → core_extensions}/class.rb +2 -2
- data/lib/arel/algebra/{extensions → core_extensions}/hash.rb +1 -1
- data/lib/arel/algebra/{extensions → core_extensions}/object.rb +1 -1
- data/lib/arel/algebra/{extensions → core_extensions}/symbol.rb +1 -1
- data/lib/arel/algebra/{primitives/expression.rb → expression.rb} +0 -0
- data/lib/arel/algebra/{primitives/ordering.rb → ordering.rb} +1 -1
- data/lib/arel/algebra/predicates.rb +32 -30
- data/lib/arel/algebra/relations/relation.rb +1 -1
- data/lib/arel/algebra/{primitives/value.rb → value.rb} +0 -0
- data/lib/arel/engines/memory/predicates.rb +26 -24
- data/lib/arel/engines/sql.rb +1 -1
- data/lib/arel/engines/sql/core_extensions.rb +4 -0
- data/lib/arel/engines/sql/{extensions → core_extensions}/array.rb +1 -1
- data/lib/arel/engines/sql/{extensions → core_extensions}/nil_class.rb +1 -1
- data/lib/arel/engines/sql/{extensions → core_extensions}/object.rb +1 -1
- data/lib/arel/engines/sql/{extensions → core_extensions}/range.rb +1 -1
- data/lib/arel/engines/sql/formatters.rb +6 -3
- data/lib/arel/engines/sql/predicates.rb +37 -35
- data/lib/arel/engines/sql/primitives.rb +10 -2
- data/lib/arel/engines/sql/relations/operations/join.rb +2 -2
- data/lib/arel/engines/sql/relations/relation.rb +33 -9
- data/lib/arel/engines/sql/relations/writes.rb +41 -10
- data/lib/arel/session.rb +9 -6
- data/spec/arel/algebra/unit/predicates/binary_spec.rb +23 -21
- data/spec/arel/algebra/unit/predicates/equality_spec.rb +20 -18
- data/spec/arel/algebra/unit/predicates/in_spec.rb +7 -5
- data/spec/arel/algebra/unit/primitives/attribute_spec.rb +10 -12
- data/spec/arel/algebra/unit/primitives/expression_spec.rb +1 -1
- data/spec/arel/algebra/unit/primitives/value_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/alias_spec.rb +2 -2
- data/spec/arel/algebra/unit/relations/delete_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/group_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/insert_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/join_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/order_spec.rb +2 -2
- data/spec/arel/algebra/unit/relations/project_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/relation_spec.rb +5 -5
- data/spec/arel/algebra/unit/relations/skip_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/table_spec.rb +2 -2
- data/spec/arel/algebra/unit/relations/take_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/update_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/where_spec.rb +1 -1
- data/spec/arel/algebra/unit/session/session_spec.rb +1 -1
- data/spec/arel/engines/memory/integration/joins/cross_engine_spec.rb +3 -4
- data/spec/arel/engines/memory/unit/relations/array_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/insert_spec.rb +8 -8
- data/spec/arel/engines/memory/unit/relations/join_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/order_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/project_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/skip_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/take_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/where_spec.rb +1 -1
- data/spec/arel/engines/sql/integration/joins/with_adjacency_spec.rb +1 -1
- data/spec/arel/engines/sql/integration/joins/with_aggregations_spec.rb +1 -1
- data/spec/arel/engines/sql/integration/joins/with_compounds_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/engine_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/predicates/binary_spec.rb +73 -70
- data/spec/arel/engines/sql/unit/predicates/equality_spec.rb +45 -28
- data/spec/arel/engines/sql/unit/predicates/in_spec.rb +57 -55
- data/spec/arel/engines/sql/unit/predicates/predicates_spec.rb +48 -46
- data/spec/arel/engines/sql/unit/primitives/attribute_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/primitives/expression_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/primitives/literal_spec.rb +13 -1
- data/spec/arel/engines/sql/unit/primitives/value_spec.rb +3 -3
- data/spec/arel/engines/sql/unit/relations/alias_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/delete_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/group_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/insert_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/join_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/order_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/project_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/skip_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/table_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/take_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/update_spec.rb +13 -7
- data/spec/arel/engines/sql/unit/relations/where_spec.rb +1 -1
- data/spec/connections/mysql_connection.rb +3 -3
- data/spec/connections/postgresql_connection.rb +2 -2
- data/spec/connections/sqlite3_connection.rb +3 -2
- data/spec/doubles/hash.rb +4 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +8 -0
- metadata +39 -25
- data/VERSION +0 -1
- data/lib/arel/algebra/extensions.rb +0 -4
- data/lib/arel/algebra/primitives.rb +0 -5
- data/lib/arel/engines/sql/extensions.rb +0 -4
data/.gitmodules
ADDED
data/README.markdown
CHANGED
@@ -15,20 +15,20 @@ The long term goal, following both LINQ and DataMapper, is to have Arel adapt to
|
|
15
15
|
Generating a query with ARel is simple. For example, in order to produce
|
16
16
|
|
17
17
|
SELECT * FROM users
|
18
|
-
|
18
|
+
|
19
19
|
you construct a table relation and convert it to sql:
|
20
20
|
|
21
21
|
users = Table(:users)
|
22
22
|
users.to_sql
|
23
|
-
|
23
|
+
|
24
24
|
In fact, you will probably never call `#to_sql`. Rather, you'll work with data from the table directly. You can iterate through all rows in the `users` table like this:
|
25
25
|
|
26
26
|
users.each { |user| ... }
|
27
|
-
|
27
|
+
|
28
28
|
In other words, Arel relations implement Ruby's Enumerable interface. Let's have a look at a concrete example:
|
29
29
|
|
30
30
|
users.first # => { users[:id] => 1, users[:name] => 'bob' }
|
31
|
-
|
31
|
+
|
32
32
|
As you can see, Arel converts the rows from the database into a hash, the values of which are sublimated to the appropriate Ruby primitive (integers, strings, and so forth).
|
33
33
|
|
34
34
|
### More Sophisticated <strike>Queries</strike> Relations ###
|
@@ -43,7 +43,7 @@ First is the 'restriction' operator, `where`:
|
|
43
43
|
What would, in SQL, be part of the `SELECT` clause is called in Arel a `projection`:
|
44
44
|
|
45
45
|
users.project(users[:id]) # => SELECT users.id FROM users
|
46
|
-
|
46
|
+
|
47
47
|
Joins resemble SQL strongly:
|
48
48
|
|
49
49
|
users.join(photos).on(users[:id].eq(photos[:user_id]))
|
@@ -53,7 +53,7 @@ What are called `LIMIT` and `OFFSET` in SQL are called `take` and `skip` in Arel
|
|
53
53
|
|
54
54
|
users.take(5) # => SELECT * FROM users LIMIT 5
|
55
55
|
users.skip(4) # => SELECT * FROM users OFFSET 4
|
56
|
-
|
56
|
+
|
57
57
|
`GROUP BY` is called `group`:
|
58
58
|
|
59
59
|
users.group(users[:name]) # => SELECT * FROM users GROUP BY name
|
@@ -68,7 +68,7 @@ The best property of the Relational Algebra is its "composability", or closure u
|
|
68
68
|
All operators are chainable in this way, and they are chainable any number of times, in any order.
|
69
69
|
|
70
70
|
users.where(users[:name].eq('bob')).where(users[:age].lt(25))
|
71
|
-
|
71
|
+
|
72
72
|
Of course, many of the operators take multiple arguments, so the last example can be written more tersely:
|
73
73
|
|
74
74
|
users.where(users[:name].eq('bob'), users[:age].lt(25))
|
@@ -76,7 +76,7 @@ Of course, many of the operators take multiple arguments, so the last example ca
|
|
76
76
|
The `OR` operator is not yet supported. It will work like this:
|
77
77
|
|
78
78
|
users.where(users[:name].eq('bob').or(users[:age].lt(25)))
|
79
|
-
|
79
|
+
|
80
80
|
The `AND` operator will behave similarly.
|
81
81
|
|
82
82
|
Finally, most operations take a block form. For example:
|
@@ -96,7 +96,7 @@ The examples above are fairly simple and other libraries match or come close to
|
|
96
96
|
Where Arel really shines in its ability to handle complex joins and aggregations. As a first example, let's consider an "adjacency list", a tree represented in a table. Suppose we have a table `comments`, representing a threaded discussion:
|
97
97
|
|
98
98
|
comments = Table(:comments)
|
99
|
-
|
99
|
+
|
100
100
|
And this table has the following attributes:
|
101
101
|
|
102
102
|
comments.attributes # => [comments[:id], comments[:body], comments[:parent_id]]
|
@@ -107,23 +107,23 @@ The `parent_id` column is a foreign key from the `comments` table to itself. Now
|
|
107
107
|
comments_with_replies = \
|
108
108
|
comments.join(replies).on(replies[:parent_id].eq(comments[:id]))
|
109
109
|
# => SELECT * FROM comments INNER JOIN comments AS comments_2 WHERE comments_2.parent_id = comments.id
|
110
|
-
|
110
|
+
|
111
111
|
The call to `#alias` is actually optional: Arel will always produce a unique name for every table joined in the relation, and it will always do so deterministically to exploit query caching. Explicit aliasing is more common, however. When you want to extract specific slices of data, aliased tables are a necessity. For example to get just certain columns from the row, treat a row like a hash:
|
112
112
|
|
113
113
|
comments_with_replies.first[replies[:body]]
|
114
|
-
|
114
|
+
|
115
115
|
This will return the first comment's reply's body.
|
116
116
|
|
117
117
|
If you don't need to extract the data later (for example, you're simply doing a join to find comments that have replies, you don't care what the content of the replies are), the block form may be preferable:
|
118
118
|
|
119
119
|
comments.join(comments) { |comments, replies| replies[:parent_id].eq(comments[:id]) }
|
120
120
|
# => SELECT * FROM comments INNER JOIN comments AS comments_2 WHERE comments_2.parent_id = comments.id
|
121
|
-
|
121
|
+
|
122
122
|
Note that you do NOT want to do something like:
|
123
123
|
|
124
124
|
comments.join(comments, comments[:parent_id].eq(comments[:id]))
|
125
125
|
# => SELECT * FROM comments INNER JOIN comments AS comments_2 WHERE comments.parent_id = comments.id
|
126
|
-
|
126
|
+
|
127
127
|
This does NOT have the same meaning as the previous query, since the comments[:parent_id] reference is effectively ambiguous.
|
128
128
|
|
129
129
|
#### Complex Aggregations ####
|
@@ -135,24 +135,24 @@ The easiest way to introduce this is in SQL. Your task is to get all users and t
|
|
135
135
|
SELECT count(*)
|
136
136
|
FROM photos
|
137
137
|
GROUP BY user_id
|
138
|
-
|
138
|
+
|
139
139
|
Now, we'd like to join this with the user table. Naively, you might try to do this:
|
140
140
|
|
141
141
|
SELECT users.*, count(photos.id)
|
142
142
|
FROM users
|
143
143
|
LEFT OUTER JOIN photos
|
144
|
-
ON users.id = photos.
|
144
|
+
ON users.id = photos.user_id
|
145
145
|
GROUP BY photos.user_id
|
146
|
-
|
146
|
+
|
147
147
|
Of course, this has a slightly different meaning than our intended query. This is actually a fairly advanced topic in SQL so let's see why this doesn't work *step by step*. Suppose we have these records in our `users` table:
|
148
148
|
|
149
149
|
mysql> select * from users;
|
150
150
|
+------+--------+
|
151
151
|
| id | name |
|
152
152
|
+------+--------+
|
153
|
-
| 1 | hai |
|
154
|
-
| 2 | bai |
|
155
|
-
| 3 | dumpty |
|
153
|
+
| 1 | hai |
|
154
|
+
| 2 | bai |
|
155
|
+
| 3 | dumpty |
|
156
156
|
+------+--------+
|
157
157
|
|
158
158
|
And these in the photos table:
|
@@ -161,19 +161,19 @@ And these in the photos table:
|
|
161
161
|
+------+---------+-----------+
|
162
162
|
| id | user_id | camera_id |
|
163
163
|
+------+---------+-----------+
|
164
|
-
| 1 | 1 | 1 |
|
165
|
-
| 2 | 1 | 1 |
|
166
|
-
| 3 | 1 | 1 |
|
164
|
+
| 1 | 1 | 1 |
|
165
|
+
| 2 | 1 | 1 |
|
166
|
+
| 3 | 1 | 1 |
|
167
167
|
+------+---------+-----------+
|
168
|
-
|
168
|
+
|
169
169
|
If we perform the above, incorrect query, we get the following:
|
170
170
|
|
171
171
|
mysql> select users.*, count(photos.id) from users left outer join photos on users.id = photos.user_id limit 3 group by user_id;
|
172
172
|
+------+------+------------------+
|
173
173
|
| id | name | count(photos.id) |
|
174
174
|
+------+------+------------------+
|
175
|
-
| 2 | bai | 0 |
|
176
|
-
| 1 | hai | 3 |
|
175
|
+
| 2 | bai | 0 |
|
176
|
+
| 1 | hai | 3 |
|
177
177
|
+------+------+------------------+
|
178
178
|
|
179
179
|
As you can see, we're completely missing data for user with id 3. `dumpty` has no photos, neither does `bai`. But strangely `bai` appeared and `dumpty` didn't! The reason is that the `GROUP BY` clause is aggregating on both tables, not just the `photos` table. All users without photos have a `photos.id` of `null` (thanks to the left outer join). These are rolled up together and an arbitrary user wins. In this case, `bai` not `dumpty`.
|
@@ -181,4 +181,4 @@ As you can see, we're completely missing data for user with id 3. `dumpty` has n
|
|
181
181
|
SELECT users.*, photos_aggregation.cnt
|
182
182
|
FROM users
|
183
183
|
LEFT OUTER JOIN (SELECT user_id, count(*) as cnt FROM photos GROUP BY user_id) AS photos_aggregation
|
184
|
-
ON photos_aggregation.user_id = users.id
|
184
|
+
ON photos_aggregation.user_id = users.id
|
data/Rakefile
CHANGED
@@ -1,58 +1,46 @@
|
|
1
1
|
require "rubygems"
|
2
|
-
require "spec/rake/spectask"
|
3
|
-
|
4
|
-
$LOAD_PATH.unshift "lib"
|
5
|
-
require "arel"
|
6
2
|
|
7
3
|
begin
|
8
|
-
require
|
9
|
-
|
10
|
-
Jeweler::Tasks.new do |s|
|
11
|
-
s.name = "arel"
|
12
|
-
s.authors = ["Bryan Helmkamp", "Nick Kallen"]
|
13
|
-
s.email = "bryan" + "@" + "brynary.com"
|
14
|
-
s.homepage = "http://github.com/brynary/arel"
|
15
|
-
s.summary = "Arel is a relational algebra engine for Ruby"
|
16
|
-
# s.description = "TODO"
|
17
|
-
s.rubyforge_project = "arel"
|
18
|
-
s.extra_rdoc_files = %w(README.markdown)
|
19
|
-
end
|
20
|
-
|
21
|
-
Jeweler::RubyforgeTasks.new
|
4
|
+
require "spec/rake/spectask"
|
22
5
|
rescue LoadError
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
desc "Run specs using RCov (uses mysql database adapter)"
|
27
|
-
Spec::Rake::SpecTask.new(:coverage) do |t|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
6
|
+
desc "Run specs"
|
7
|
+
task(:spec) { $stderr.puts '`gem install rspec` to run specs' }
|
8
|
+
else
|
9
|
+
desc "Run specs using RCov (uses mysql database adapter)"
|
10
|
+
Spec::Rake::SpecTask.new(:coverage) do |t|
|
11
|
+
t.spec_files =
|
12
|
+
["spec/connections/mysql_connection.rb"] +
|
13
|
+
FileList['spec/**/*_spec.rb']
|
14
|
+
|
15
|
+
t.rcov = true
|
16
|
+
t.rcov_opts << '--exclude' << "spec,gems"
|
17
|
+
t.rcov_opts << '--text-summary'
|
18
|
+
t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
|
19
|
+
t.rcov_opts << '--only-uncovered'
|
20
|
+
end
|
38
21
|
|
39
|
-
namespace :spec do
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
22
|
+
namespace :spec do
|
23
|
+
for adapter in %w[mysql sqlite3 postgresql]
|
24
|
+
desc "Run specs with the #{adapter} database adapter"
|
25
|
+
Spec::Rake::SpecTask.new(adapter) do |t|
|
26
|
+
t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
|
27
|
+
t.libs << "#{File.dirname(__FILE__)}/vendor/rails/activerecord/lib"
|
28
|
+
t.libs << "#{File.dirname(__FILE__)}/spec"
|
29
|
+
t.warning = true
|
30
|
+
t.spec_files =
|
31
|
+
["spec/connections/#{adapter}_connection.rb"] +
|
32
|
+
["spec/schemas/#{adapter}_schema.rb"] +
|
33
|
+
FileList['spec/**/*_spec.rb']
|
34
|
+
end
|
47
35
|
end
|
48
36
|
end
|
49
|
-
end
|
50
37
|
|
51
|
-
desc "Run specs with mysql and sqlite3 database adapters (default)"
|
52
|
-
task :spec => ["check_dependencies", "spec:sqlite3", "spec:mysql", "spec:postgresql"]
|
38
|
+
desc "Run specs with mysql and sqlite3 database adapters (default)"
|
39
|
+
task :spec => ["check_dependencies", "spec:sqlite3", "spec:mysql", "spec:postgresql"]
|
53
40
|
|
54
|
-
desc "Default task is to run specs"
|
55
|
-
task :default => :spec
|
41
|
+
desc "Default task is to run specs"
|
42
|
+
task :default => :spec
|
43
|
+
end
|
56
44
|
|
57
45
|
desc 'Removes trailing whitespace'
|
58
46
|
task :whitespace do
|
data/Thorfile
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
module GemHelpers
|
2
|
+
|
3
|
+
def generate_gemspec
|
4
|
+
$LOAD_PATH << "#{File.dirname(__FILE__)}/vendor/rails/activerecord/lib"
|
5
|
+
$LOAD_PATH << "#{File.dirname(__FILE__)}/vendor/rails/activesupport/lib"
|
6
|
+
|
7
|
+
$LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), "lib")))
|
8
|
+
require "arel"
|
9
|
+
|
10
|
+
Gem::Specification.new do |s|
|
11
|
+
s.name = "arel"
|
12
|
+
s.version = Arel::VERSION
|
13
|
+
s.authors = ["Bryan Helmkamp", "Nick Kallen"]
|
14
|
+
s.email = "bryan@brynary.com"
|
15
|
+
s.homepage = "http://github.com/brynary/arel"
|
16
|
+
s.summary = "Arel is a relational algebra engine for Ruby"
|
17
|
+
s.description = <<-EOS.strip
|
18
|
+
Arel is a Relational Algebra for Ruby. It 1) simplifies the generation complex
|
19
|
+
of SQL queries and it 2) adapts to various RDBMS systems. It is intended to be
|
20
|
+
a framework framework; that is, you can build your own ORM with it, focusing on
|
21
|
+
innovative object and collection modeling as opposed to database compatibility
|
22
|
+
and query generation.
|
23
|
+
EOS
|
24
|
+
s.rubyforge_project = "arel"
|
25
|
+
|
26
|
+
require "git"
|
27
|
+
repo = Git.open(".")
|
28
|
+
|
29
|
+
s.files = normalize_files(repo.ls_files.keys - repo.lib.ignored_files)
|
30
|
+
s.test_files = normalize_files(Dir['spec/**/*.rb'] - repo.lib.ignored_files)
|
31
|
+
|
32
|
+
s.has_rdoc = true
|
33
|
+
s.extra_rdoc_files = %w[README.markdown]
|
34
|
+
|
35
|
+
# Arel required ActiveRecord, but we're not declaring it to avoid a
|
36
|
+
# circular dependency chain. The solution is for ActiveRecord to release
|
37
|
+
# the connection adapters which Arel uses in a separate gem
|
38
|
+
# s.add_dependency "activerecord", ">= 3.0.pre"
|
39
|
+
s.add_dependency "activesupport", ">= 3.0.pre"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def normalize_files(array)
|
44
|
+
# only keep files, no directories, and sort
|
45
|
+
array.select do |path|
|
46
|
+
File.file?(path)
|
47
|
+
end.sort
|
48
|
+
end
|
49
|
+
|
50
|
+
# Adds extra space when outputting an array. This helps create better version
|
51
|
+
# control diffs, because otherwise it is all on the same line.
|
52
|
+
def prettyify_array(gemspec_ruby, array_name)
|
53
|
+
gemspec_ruby.gsub(/s\.#{array_name.to_s} = \[.+?\]/) do |match|
|
54
|
+
leadin, files = match[0..-2].split("[")
|
55
|
+
leadin + "[\n #{files.split(",").join(",\n ")}\n ]"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def read_gemspec
|
60
|
+
@read_gemspec ||= eval(File.read("arel.gemspec"))
|
61
|
+
end
|
62
|
+
|
63
|
+
def sh(command)
|
64
|
+
puts command
|
65
|
+
system command
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class Default < Thor
|
70
|
+
include GemHelpers
|
71
|
+
|
72
|
+
desc "gemspec", "Regenerate arel.gemspec"
|
73
|
+
def gemspec
|
74
|
+
File.open("arel.gemspec", "w") do |file|
|
75
|
+
gemspec_ruby = generate_gemspec.to_ruby
|
76
|
+
gemspec_ruby = prettyify_array(gemspec_ruby, :files)
|
77
|
+
gemspec_ruby = prettyify_array(gemspec_ruby, :test_files)
|
78
|
+
gemspec_ruby = prettyify_array(gemspec_ruby, :extra_rdoc_files)
|
79
|
+
|
80
|
+
file.write gemspec_ruby
|
81
|
+
end
|
82
|
+
|
83
|
+
puts "Wrote gemspec to arel.gemspec"
|
84
|
+
read_gemspec.validate
|
85
|
+
end
|
86
|
+
|
87
|
+
desc "build", "Build a arel gem"
|
88
|
+
def build
|
89
|
+
sh "gem build arel.gemspec"
|
90
|
+
FileUtils.mkdir_p "pkg"
|
91
|
+
FileUtils.mv read_gemspec.file_name, "pkg"
|
92
|
+
end
|
93
|
+
|
94
|
+
desc "install", "Install the latest built gem"
|
95
|
+
def install
|
96
|
+
sh "gem install --local pkg/#{read_gemspec.file_name}"
|
97
|
+
end
|
98
|
+
|
99
|
+
desc "release", "Release the current branch to GitHub and Gemcutter"
|
100
|
+
def release
|
101
|
+
gemspec
|
102
|
+
build
|
103
|
+
Release.new.tag
|
104
|
+
Release.new.gem
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
class Release < Thor
|
109
|
+
include GemHelpers
|
110
|
+
|
111
|
+
desc "tag", "Tag the gem on the origin server"
|
112
|
+
def tag
|
113
|
+
release_tag = "v#{read_gemspec.version}"
|
114
|
+
sh "git tag -a #{release_tag} -m 'Tagging #{release_tag}'"
|
115
|
+
sh "git push origin #{release_tag}"
|
116
|
+
end
|
117
|
+
|
118
|
+
desc "gem", "Push the gem to Gemcutter"
|
119
|
+
def gem
|
120
|
+
sh "gem push pkg/#{read_gemspec.file_name}"
|
121
|
+
end
|
122
|
+
end
|
data/arel.gemspec
CHANGED
@@ -1,224 +1,225 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
1
|
# -*- encoding: utf-8 -*-
|
5
2
|
|
6
3
|
Gem::Specification.new do |s|
|
7
4
|
s.name = %q{arel}
|
8
|
-
s.version = "0.1.
|
5
|
+
s.version = "0.1.2"
|
9
6
|
|
10
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
8
|
s.authors = ["Bryan Helmkamp", "Nick Kallen"]
|
12
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-10-27}
|
10
|
+
s.description = %q{Arel is a Relational Algebra for Ruby. It 1) simplifies the generation complex
|
11
|
+
of SQL queries and it 2) adapts to various RDBMS systems. It is intended to be
|
12
|
+
a framework framework; that is, you can build your own ORM with it, focusing on
|
13
|
+
innovative object and collection modeling as opposed to database compatibility
|
14
|
+
and query generation.}
|
13
15
|
s.email = %q{bryan@brynary.com}
|
14
16
|
s.extra_rdoc_files = [
|
15
17
|
"README.markdown"
|
16
18
|
]
|
17
19
|
s.files = [
|
18
20
|
".gitignore",
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
21
|
+
".gitmodules",
|
22
|
+
"README.markdown",
|
23
|
+
"Rakefile",
|
24
|
+
"Thorfile",
|
25
|
+
"arel.gemspec",
|
26
|
+
"doc/CONVENTIONS",
|
27
|
+
"doc/TODO",
|
28
|
+
"lib/arel.rb",
|
29
|
+
"lib/arel/algebra.rb",
|
30
|
+
"lib/arel/algebra/attribute.rb",
|
31
|
+
"lib/arel/algebra/core_extensions.rb",
|
32
|
+
"lib/arel/algebra/core_extensions/class.rb",
|
33
|
+
"lib/arel/algebra/core_extensions/hash.rb",
|
34
|
+
"lib/arel/algebra/core_extensions/object.rb",
|
35
|
+
"lib/arel/algebra/core_extensions/symbol.rb",
|
36
|
+
"lib/arel/algebra/expression.rb",
|
37
|
+
"lib/arel/algebra/ordering.rb",
|
38
|
+
"lib/arel/algebra/predicates.rb",
|
39
|
+
"lib/arel/algebra/relations.rb",
|
40
|
+
"lib/arel/algebra/relations/operations/alias.rb",
|
41
|
+
"lib/arel/algebra/relations/operations/group.rb",
|
42
|
+
"lib/arel/algebra/relations/operations/join.rb",
|
43
|
+
"lib/arel/algebra/relations/operations/order.rb",
|
44
|
+
"lib/arel/algebra/relations/operations/project.rb",
|
45
|
+
"lib/arel/algebra/relations/operations/skip.rb",
|
46
|
+
"lib/arel/algebra/relations/operations/take.rb",
|
47
|
+
"lib/arel/algebra/relations/operations/where.rb",
|
48
|
+
"lib/arel/algebra/relations/relation.rb",
|
49
|
+
"lib/arel/algebra/relations/row.rb",
|
50
|
+
"lib/arel/algebra/relations/utilities/compound.rb",
|
51
|
+
"lib/arel/algebra/relations/utilities/externalization.rb",
|
52
|
+
"lib/arel/algebra/relations/utilities/nil.rb",
|
53
|
+
"lib/arel/algebra/relations/writes.rb",
|
54
|
+
"lib/arel/algebra/value.rb",
|
55
|
+
"lib/arel/engines.rb",
|
56
|
+
"lib/arel/engines/memory.rb",
|
57
|
+
"lib/arel/engines/memory/engine.rb",
|
58
|
+
"lib/arel/engines/memory/predicates.rb",
|
59
|
+
"lib/arel/engines/memory/primitives.rb",
|
60
|
+
"lib/arel/engines/memory/relations.rb",
|
61
|
+
"lib/arel/engines/memory/relations/array.rb",
|
62
|
+
"lib/arel/engines/memory/relations/compound.rb",
|
63
|
+
"lib/arel/engines/memory/relations/operations.rb",
|
64
|
+
"lib/arel/engines/memory/relations/writes.rb",
|
65
|
+
"lib/arel/engines/sql.rb",
|
66
|
+
"lib/arel/engines/sql/christener.rb",
|
67
|
+
"lib/arel/engines/sql/core_extensions.rb",
|
68
|
+
"lib/arel/engines/sql/core_extensions/array.rb",
|
69
|
+
"lib/arel/engines/sql/core_extensions/nil_class.rb",
|
70
|
+
"lib/arel/engines/sql/core_extensions/object.rb",
|
71
|
+
"lib/arel/engines/sql/core_extensions/range.rb",
|
72
|
+
"lib/arel/engines/sql/engine.rb",
|
73
|
+
"lib/arel/engines/sql/formatters.rb",
|
74
|
+
"lib/arel/engines/sql/predicates.rb",
|
75
|
+
"lib/arel/engines/sql/primitives.rb",
|
76
|
+
"lib/arel/engines/sql/relations.rb",
|
77
|
+
"lib/arel/engines/sql/relations/operations/alias.rb",
|
78
|
+
"lib/arel/engines/sql/relations/operations/join.rb",
|
79
|
+
"lib/arel/engines/sql/relations/relation.rb",
|
80
|
+
"lib/arel/engines/sql/relations/table.rb",
|
81
|
+
"lib/arel/engines/sql/relations/utilities/compound.rb",
|
82
|
+
"lib/arel/engines/sql/relations/utilities/externalization.rb",
|
83
|
+
"lib/arel/engines/sql/relations/utilities/nil.rb",
|
84
|
+
"lib/arel/engines/sql/relations/utilities/recursion.rb",
|
85
|
+
"lib/arel/engines/sql/relations/writes.rb",
|
86
|
+
"lib/arel/session.rb",
|
87
|
+
"spec/arel/algebra/unit/predicates/binary_spec.rb",
|
88
|
+
"spec/arel/algebra/unit/predicates/equality_spec.rb",
|
89
|
+
"spec/arel/algebra/unit/predicates/in_spec.rb",
|
90
|
+
"spec/arel/algebra/unit/primitives/attribute_spec.rb",
|
91
|
+
"spec/arel/algebra/unit/primitives/expression_spec.rb",
|
92
|
+
"spec/arel/algebra/unit/primitives/value_spec.rb",
|
93
|
+
"spec/arel/algebra/unit/relations/alias_spec.rb",
|
94
|
+
"spec/arel/algebra/unit/relations/delete_spec.rb",
|
95
|
+
"spec/arel/algebra/unit/relations/group_spec.rb",
|
96
|
+
"spec/arel/algebra/unit/relations/insert_spec.rb",
|
97
|
+
"spec/arel/algebra/unit/relations/join_spec.rb",
|
98
|
+
"spec/arel/algebra/unit/relations/order_spec.rb",
|
99
|
+
"spec/arel/algebra/unit/relations/project_spec.rb",
|
100
|
+
"spec/arel/algebra/unit/relations/relation_spec.rb",
|
101
|
+
"spec/arel/algebra/unit/relations/skip_spec.rb",
|
102
|
+
"spec/arel/algebra/unit/relations/table_spec.rb",
|
103
|
+
"spec/arel/algebra/unit/relations/take_spec.rb",
|
104
|
+
"spec/arel/algebra/unit/relations/update_spec.rb",
|
105
|
+
"spec/arel/algebra/unit/relations/where_spec.rb",
|
106
|
+
"spec/arel/algebra/unit/session/session_spec.rb",
|
107
|
+
"spec/arel/engines/memory/integration/joins/cross_engine_spec.rb",
|
108
|
+
"spec/arel/engines/memory/unit/relations/array_spec.rb",
|
109
|
+
"spec/arel/engines/memory/unit/relations/insert_spec.rb",
|
110
|
+
"spec/arel/engines/memory/unit/relations/join_spec.rb",
|
111
|
+
"spec/arel/engines/memory/unit/relations/order_spec.rb",
|
112
|
+
"spec/arel/engines/memory/unit/relations/project_spec.rb",
|
113
|
+
"spec/arel/engines/memory/unit/relations/skip_spec.rb",
|
114
|
+
"spec/arel/engines/memory/unit/relations/take_spec.rb",
|
115
|
+
"spec/arel/engines/memory/unit/relations/where_spec.rb",
|
116
|
+
"spec/arel/engines/sql/integration/joins/with_adjacency_spec.rb",
|
117
|
+
"spec/arel/engines/sql/integration/joins/with_aggregations_spec.rb",
|
118
|
+
"spec/arel/engines/sql/integration/joins/with_compounds_spec.rb",
|
119
|
+
"spec/arel/engines/sql/unit/engine_spec.rb",
|
120
|
+
"spec/arel/engines/sql/unit/predicates/binary_spec.rb",
|
121
|
+
"spec/arel/engines/sql/unit/predicates/equality_spec.rb",
|
122
|
+
"spec/arel/engines/sql/unit/predicates/in_spec.rb",
|
123
|
+
"spec/arel/engines/sql/unit/predicates/predicates_spec.rb",
|
124
|
+
"spec/arel/engines/sql/unit/primitives/attribute_spec.rb",
|
125
|
+
"spec/arel/engines/sql/unit/primitives/expression_spec.rb",
|
126
|
+
"spec/arel/engines/sql/unit/primitives/literal_spec.rb",
|
127
|
+
"spec/arel/engines/sql/unit/primitives/value_spec.rb",
|
128
|
+
"spec/arel/engines/sql/unit/relations/alias_spec.rb",
|
129
|
+
"spec/arel/engines/sql/unit/relations/delete_spec.rb",
|
130
|
+
"spec/arel/engines/sql/unit/relations/group_spec.rb",
|
131
|
+
"spec/arel/engines/sql/unit/relations/insert_spec.rb",
|
132
|
+
"spec/arel/engines/sql/unit/relations/join_spec.rb",
|
133
|
+
"spec/arel/engines/sql/unit/relations/order_spec.rb",
|
134
|
+
"spec/arel/engines/sql/unit/relations/project_spec.rb",
|
135
|
+
"spec/arel/engines/sql/unit/relations/skip_spec.rb",
|
136
|
+
"spec/arel/engines/sql/unit/relations/table_spec.rb",
|
137
|
+
"spec/arel/engines/sql/unit/relations/take_spec.rb",
|
138
|
+
"spec/arel/engines/sql/unit/relations/update_spec.rb",
|
139
|
+
"spec/arel/engines/sql/unit/relations/where_spec.rb",
|
140
|
+
"spec/connections/mysql_connection.rb",
|
141
|
+
"spec/connections/postgresql_connection.rb",
|
142
|
+
"spec/connections/sqlite3_connection.rb",
|
143
|
+
"spec/doubles/hash.rb",
|
144
|
+
"spec/matchers/be_like.rb",
|
145
|
+
"spec/matchers/disambiguate_attributes.rb",
|
146
|
+
"spec/matchers/hash_the_same_as.rb",
|
147
|
+
"spec/schemas/mysql_schema.rb",
|
148
|
+
"spec/schemas/postgresql_schema.rb",
|
149
|
+
"spec/schemas/sqlite3_schema.rb",
|
150
|
+
"spec/spec.opts",
|
151
|
+
"spec/spec_helper.rb"
|
150
152
|
]
|
151
153
|
s.homepage = %q{http://github.com/brynary/arel}
|
152
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
153
154
|
s.require_paths = ["lib"]
|
154
155
|
s.rubyforge_project = %q{arel}
|
155
|
-
s.rubygems_version = %q{1.3.
|
156
|
+
s.rubygems_version = %q{1.3.5}
|
156
157
|
s.summary = %q{Arel is a relational algebra engine for Ruby}
|
157
158
|
s.test_files = [
|
158
159
|
"spec/arel/algebra/unit/predicates/binary_spec.rb",
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
160
|
+
"spec/arel/algebra/unit/predicates/equality_spec.rb",
|
161
|
+
"spec/arel/algebra/unit/predicates/in_spec.rb",
|
162
|
+
"spec/arel/algebra/unit/primitives/attribute_spec.rb",
|
163
|
+
"spec/arel/algebra/unit/primitives/expression_spec.rb",
|
164
|
+
"spec/arel/algebra/unit/primitives/value_spec.rb",
|
165
|
+
"spec/arel/algebra/unit/relations/alias_spec.rb",
|
166
|
+
"spec/arel/algebra/unit/relations/delete_spec.rb",
|
167
|
+
"spec/arel/algebra/unit/relations/group_spec.rb",
|
168
|
+
"spec/arel/algebra/unit/relations/insert_spec.rb",
|
169
|
+
"spec/arel/algebra/unit/relations/join_spec.rb",
|
170
|
+
"spec/arel/algebra/unit/relations/order_spec.rb",
|
171
|
+
"spec/arel/algebra/unit/relations/project_spec.rb",
|
172
|
+
"spec/arel/algebra/unit/relations/relation_spec.rb",
|
173
|
+
"spec/arel/algebra/unit/relations/skip_spec.rb",
|
174
|
+
"spec/arel/algebra/unit/relations/table_spec.rb",
|
175
|
+
"spec/arel/algebra/unit/relations/take_spec.rb",
|
176
|
+
"spec/arel/algebra/unit/relations/update_spec.rb",
|
177
|
+
"spec/arel/algebra/unit/relations/where_spec.rb",
|
178
|
+
"spec/arel/algebra/unit/session/session_spec.rb",
|
179
|
+
"spec/arel/engines/memory/integration/joins/cross_engine_spec.rb",
|
180
|
+
"spec/arel/engines/memory/unit/relations/array_spec.rb",
|
181
|
+
"spec/arel/engines/memory/unit/relations/insert_spec.rb",
|
182
|
+
"spec/arel/engines/memory/unit/relations/join_spec.rb",
|
183
|
+
"spec/arel/engines/memory/unit/relations/order_spec.rb",
|
184
|
+
"spec/arel/engines/memory/unit/relations/project_spec.rb",
|
185
|
+
"spec/arel/engines/memory/unit/relations/skip_spec.rb",
|
186
|
+
"spec/arel/engines/memory/unit/relations/take_spec.rb",
|
187
|
+
"spec/arel/engines/memory/unit/relations/where_spec.rb",
|
188
|
+
"spec/arel/engines/sql/integration/joins/with_adjacency_spec.rb",
|
189
|
+
"spec/arel/engines/sql/integration/joins/with_aggregations_spec.rb",
|
190
|
+
"spec/arel/engines/sql/integration/joins/with_compounds_spec.rb",
|
191
|
+
"spec/arel/engines/sql/unit/engine_spec.rb",
|
192
|
+
"spec/arel/engines/sql/unit/predicates/binary_spec.rb",
|
193
|
+
"spec/arel/engines/sql/unit/predicates/equality_spec.rb",
|
194
|
+
"spec/arel/engines/sql/unit/predicates/in_spec.rb",
|
195
|
+
"spec/arel/engines/sql/unit/predicates/predicates_spec.rb",
|
196
|
+
"spec/arel/engines/sql/unit/primitives/attribute_spec.rb",
|
197
|
+
"spec/arel/engines/sql/unit/primitives/expression_spec.rb",
|
198
|
+
"spec/arel/engines/sql/unit/primitives/literal_spec.rb",
|
199
|
+
"spec/arel/engines/sql/unit/primitives/value_spec.rb",
|
200
|
+
"spec/arel/engines/sql/unit/relations/alias_spec.rb",
|
201
|
+
"spec/arel/engines/sql/unit/relations/delete_spec.rb",
|
202
|
+
"spec/arel/engines/sql/unit/relations/group_spec.rb",
|
203
|
+
"spec/arel/engines/sql/unit/relations/insert_spec.rb",
|
204
|
+
"spec/arel/engines/sql/unit/relations/join_spec.rb",
|
205
|
+
"spec/arel/engines/sql/unit/relations/order_spec.rb",
|
206
|
+
"spec/arel/engines/sql/unit/relations/project_spec.rb",
|
207
|
+
"spec/arel/engines/sql/unit/relations/skip_spec.rb",
|
208
|
+
"spec/arel/engines/sql/unit/relations/table_spec.rb",
|
209
|
+
"spec/arel/engines/sql/unit/relations/take_spec.rb",
|
210
|
+
"spec/arel/engines/sql/unit/relations/update_spec.rb",
|
211
|
+
"spec/arel/engines/sql/unit/relations/where_spec.rb",
|
212
|
+
"spec/connections/mysql_connection.rb",
|
213
|
+
"spec/connections/postgresql_connection.rb",
|
214
|
+
"spec/connections/sqlite3_connection.rb",
|
215
|
+
"spec/doubles/hash.rb",
|
216
|
+
"spec/matchers/be_like.rb",
|
217
|
+
"spec/matchers/disambiguate_attributes.rb",
|
218
|
+
"spec/matchers/hash_the_same_as.rb",
|
219
|
+
"spec/schemas/mysql_schema.rb",
|
220
|
+
"spec/schemas/postgresql_schema.rb",
|
221
|
+
"spec/schemas/sqlite3_schema.rb",
|
222
|
+
"spec/spec_helper.rb"
|
222
223
|
]
|
223
224
|
|
224
225
|
if s.respond_to? :specification_version then
|
@@ -226,8 +227,11 @@ Gem::Specification.new do |s|
|
|
226
227
|
s.specification_version = 3
|
227
228
|
|
228
229
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
230
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 3.0.pre"])
|
229
231
|
else
|
232
|
+
s.add_dependency(%q<activesupport>, [">= 3.0.pre"])
|
230
233
|
end
|
231
234
|
else
|
235
|
+
s.add_dependency(%q<activesupport>, [">= 3.0.pre"])
|
232
236
|
end
|
233
237
|
end
|