arc 0.0.3 → 0.0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +109 -0
- data/README.md.orig +74 -0
- data/Rakefile +12 -0
- data/lib/arc.rb +9 -1
- data/lib/arc/data_stores/abstract/object_definitions.rb +1 -1
- data/lib/arc/data_stores/abstract/store.rb +53 -15
- data/lib/arc/data_stores/mysql/store.rb +3 -25
- data/lib/arc/data_stores/postgres/store.rb +6 -20
- data/lib/arc/data_stores/sqlite/store.rb +1 -24
- data/lib/arc/version.rb +1 -1
- data/spec/data_stores/abstract/arel_compatibility_spec.rb +19 -37
- data/spec/data_stores/abstract/store_spec.rb +1 -1
- data/spec/data_stores/mysql/store_spec.rb +1 -1
- data/spec/data_stores/postgres/store_spec.rb +1 -1
- data/spec/integration_spec.rb +127 -0
- data/spec/quoting_spec.rb +6 -6
- data/spec/spec_helper.rb +18 -52
- data/spec/support/seed.rb +2 -2
- metadata +22 -23
- data/lib/arc/data_stores.rb +0 -9
- data/spec/data_stores/integration/crud_spec.rb +0 -107
- data/spec/data_stores/integration/schema_spec.rb +0 -49
data/README.md
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
#Arc (**Ar**el **C**onnection)
|
2
|
+
Arc is a database connection engine that provides everything Arel needs to construct an AST.
|
3
|
+
You can use sqlite, postgresql and/or mysql.
|
4
|
+
|
5
|
+
Arc gives you:
|
6
|
+
|
7
|
+
- quoting and casting of values as they enter and exit the data store
|
8
|
+
- standard and **thread safe** CRUD interface for executing queries
|
9
|
+
- a hash-like interface that provides information about the tables and columns in your database (see below)
|
10
|
+
|
11
|
+
There are two dependencies: [q][6] and arel itself.
|
12
|
+
|
13
|
+
Arc lets you use arel without the cost of including active record as a dependency.
|
14
|
+
|
15
|
+
[Arel][1] is a very capable and [inspired][2] bit of code which provides machinery for building an [abstract syntax tree][2](ast) of a complex sql query in pure ruby.
|
16
|
+
|
17
|
+
|
18
|
+
##Arc is *not*:
|
19
|
+
Arc isn't an ORM.
|
20
|
+
There has been some [recent discussion][4] about the state of ruby ORMs. Arc does not make any attempt to [pass judgement][5] against any of the fine ORMs out there. Arc came out of a need for a lighter weight method for manipulating data in a database. Arc gives developers flexibility to build their own frameworks and write smaller libraries with fewer dependencies.
|
21
|
+
|
22
|
+
##Installation
|
23
|
+
Add this to your Gemfile
|
24
|
+
gem 'pg' #'mysql2' or 'sqlite'
|
25
|
+
gem 'arc'
|
26
|
+
|
27
|
+
##Basics
|
28
|
+
####Connect to a database:
|
29
|
+
|
30
|
+
require 'arc'
|
31
|
+
@store = Arc::DataStores[:postgres].new({
|
32
|
+
database: arc_development,
|
33
|
+
host: localhost,
|
34
|
+
user: superman
|
35
|
+
})
|
36
|
+
@store[:superheros]
|
37
|
+
# => <Arc::DataStores::ObjectDefinitions::SqliteTable:0x007f86d4026f68 @name="superheros">
|
38
|
+
@store[:superheros].column_names
|
39
|
+
# => [:is_awesome, :name, :id ]
|
40
|
+
@store[:superheros][:id]
|
41
|
+
# => #<Arc::DataStores::ObjectDefinitions::SqliteColumn @name='id'>
|
42
|
+
@store[:superheros][:id].primary_key?
|
43
|
+
# => true
|
44
|
+
@store[:superheros][:is_awesome].type
|
45
|
+
# => :bool
|
46
|
+
|
47
|
+
####Execute a query
|
48
|
+
Build an Arel query and pass it to one of the store's CRUD methods:
|
49
|
+
|
50
|
+
"Read" Example:
|
51
|
+
|
52
|
+
s = Arel::Table.new :superheros
|
53
|
+
s.project(s[:name], s[:id], s[:is_awesome])
|
54
|
+
@store.read s
|
55
|
+
# => [{ :id => 1, :name => 'superman', :is_awesome => true }
|
56
|
+
# => { :id => 2, :name => 'batman', :is_awesome => false }
|
57
|
+
# => { :id => 3, :name => 'ironman', :is_awesome => nil }]
|
58
|
+
|
59
|
+
"Create" example
|
60
|
+
|
61
|
+
im = Arel::InsertManager.new
|
62
|
+
im.insert([
|
63
|
+
[superheros[:name], 'green hornet'],
|
64
|
+
[superheros[:is_awesome], true]
|
65
|
+
])
|
66
|
+
@store.create im
|
67
|
+
# => { :id => 4, :name => 'green hornet', :is_awesome => true }
|
68
|
+
|
69
|
+
##Advanced
|
70
|
+
Arc handles some of the more complex features of arel, like complex joins:
|
71
|
+
|
72
|
+
s = Arel::Table.new :superheros
|
73
|
+
sp = Arel::Table.new :superheros_powers
|
74
|
+
p = Arel::Table.new :powers
|
75
|
+
stmt = s.join(sp).on(s[:id].eq(sp[:superhero_id]))
|
76
|
+
.join(p).on(p[:id].eq(sp[:power_id]))
|
77
|
+
.project(
|
78
|
+
s[:name].as('superhero_name'),
|
79
|
+
p[:name].as('power_name')
|
80
|
+
)
|
81
|
+
@store.read stmt
|
82
|
+
# => [{:superhero_name => 'superman', :power_name => 'flight'},
|
83
|
+
# => {:superhero_name => 'superman', :power_name => 'x-ray-vision'},
|
84
|
+
# => {:superhero_name => 'batman', :power_name => "a belt'}]
|
85
|
+
|
86
|
+
##TODO
|
87
|
+
Arc is a new library. The test suite has excellent coverage, but bugs need to be identified, tested and fixed.
|
88
|
+
Next step is to add RDoc magic.
|
89
|
+
A long term goal would be to add on to the schema interface to allow for some ddl operations.
|
90
|
+
|
91
|
+
##Development
|
92
|
+
Install dependencies with bundler
|
93
|
+
Make sure you have bundler installed, point your terminal to the project's root directory and run
|
94
|
+
|
95
|
+
$ bundle install
|
96
|
+
Running the tests:
|
97
|
+
|
98
|
+
$ rake test
|
99
|
+
To run the tests agains a particular adapter
|
100
|
+
|
101
|
+
$ rake test:adapter[<your-adapter-here>]
|
102
|
+
|
103
|
+
|
104
|
+
[1]: http://github.com/rails/arel
|
105
|
+
[2]: http://twitter.com/#!/jacobsimeon/status/97183215013466113
|
106
|
+
[3]: http://en.wikipedia.org/wiki/Abstract_syntax_tree
|
107
|
+
[4]: http://solnic.eu/2011/11/29/the-state-of-ruby-orm.html
|
108
|
+
[5]: https://github.com/garybernhardt/base
|
109
|
+
[6]: http://github.com/jacobsimeon/q
|
data/README.md.orig
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
#Arc (**AR**el **C**onnection)
|
2
|
+
Arc lets you use arel without the cost of including active record as a dependency.
|
3
|
+
[Arel][1] is a very capable and [inspired][2] bit of code which provides machinery for building an [abstract syntax tree][2](ast) of a complex sql query in pure ruby.
|
4
|
+
|
5
|
+
##Arc is:
|
6
|
+
Arc is a database connection engine that provides everything Arel needs to construct an AST
|
7
|
+
Arc supports sqlite, postgresql and mysql
|
8
|
+
|
9
|
+
@store = Arel::Table.engine = Arc::DataStores[:sqlite].new :database => ":memory:"
|
10
|
+
superheros = Arel::Table.new :superheros
|
11
|
+
query = superheros.project(
|
12
|
+
superheros[:name],
|
13
|
+
superheros[:is_awesome]
|
14
|
+
)
|
15
|
+
@result = @store.read(query)
|
16
|
+
# => [{ :name => 'superman', :is_awesome => true },
|
17
|
+
# => { :name => 'batman', :is_awesome => false }]
|
18
|
+
|
19
|
+
Arc handles quoting and casting of values when you create or update records and results are wrapped in lazy loading arrays and hashes.
|
20
|
+
<<<<<<< HEAD
|
21
|
+
|
22
|
+
=======
|
23
|
+
>>>>>>> e11634854b0583300a597ff8b7850d55048d8323
|
24
|
+
@result.class
|
25
|
+
# => Array
|
26
|
+
@result[0].class
|
27
|
+
# => Hash
|
28
|
+
@result[0][:is_awesome].class
|
29
|
+
# => TrueClass
|
30
|
+
|
31
|
+
Arc provides a standard and **thread safe** CRUD interface for executing queries
|
32
|
+
<<<<<<< HEAD
|
33
|
+
|
34
|
+
=======
|
35
|
+
>>>>>>> e11634854b0583300a597ff8b7850d55048d8323
|
36
|
+
@store.read superheros.project(superheros[:name])
|
37
|
+
# => [<superhero names here>]
|
38
|
+
im = Arel::InsertManager
|
39
|
+
im.insert([superheros[name], 'ironman'])
|
40
|
+
@store.create im
|
41
|
+
# => { :id => 3, :name => 'batman', :is_awesome => nil }
|
42
|
+
Arel::Table.engine
|
43
|
+
|
44
|
+
Arc tells what kind of schema you're working with
|
45
|
+
<<<<<<< HEAD
|
46
|
+
|
47
|
+
=======
|
48
|
+
>>>>>>> e11634854b0583300a597ff8b7850d55048d8323
|
49
|
+
@store[:superheros]
|
50
|
+
# => <Arc::DataStores::ObjectDefinitions::SqliteTable:0x007f86d4026f68 @name="superheros">
|
51
|
+
@store[:superheros].column_names
|
52
|
+
# => [:is_awesome, :name, :id ]
|
53
|
+
@store[:superheros][:id]
|
54
|
+
# => #<Arc::DataStores::ObjectDefinitions::SqliteColumn @name='id'>
|
55
|
+
@store[:superheros][:id].primary_key?
|
56
|
+
# => true
|
57
|
+
@store[:superheros][:is_awesome].type
|
58
|
+
# => :bool
|
59
|
+
|
60
|
+
##Arc is *not*:
|
61
|
+
Arc is **not** an ORM.
|
62
|
+
There has been some [recent discussion][4] about the state of ruby ORMs. Arc does not make any attempt to [pass judgement][5] against any of the fine ORMs out there. Arc came out of a need for a lighter weight method for manipulating data in a database. Arc gives developers flexibility to build their own frameworks and write smaller libraries with fewer dependencies.
|
63
|
+
|
64
|
+
##Setup
|
65
|
+
|
66
|
+
##Basics
|
67
|
+
|
68
|
+
##Advanced
|
69
|
+
|
70
|
+
[1]: http://github.com/rails/arel
|
71
|
+
[2]: http://twitter.com/#!/jacobsimeon/status/97183215013466113
|
72
|
+
[3]: http://en.wikipedia.org/wiki/Abstract_syntax_tree
|
73
|
+
[4]: http://solnic.eu/2011/11/29/the-state-of-ruby-orm.html
|
74
|
+
[5]: https://github.com/garybernhardt/base
|
data/Rakefile
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
|
+
require 'yaml'
|
3
|
+
|
2
4
|
task :test do
|
3
5
|
['sqlite', 'postgres', 'mysql'].each do |environment|
|
4
6
|
puts "Running tests for environment #{environment}"
|
@@ -29,6 +31,16 @@ task :yank do
|
|
29
31
|
end
|
30
32
|
|
31
33
|
namespace :test do
|
34
|
+
task :integration do
|
35
|
+
before = ENV['ARC_ENV']
|
36
|
+
adapters = YAML::load(File.read("./spec/support/config.yml")).keys
|
37
|
+
adapters.each do |adapter|
|
38
|
+
ENV['ARC_ENV'] = adapter
|
39
|
+
puts "Running integration test for adapter: #{adapter}"
|
40
|
+
system "rspec spec/integration_spec.rb"
|
41
|
+
end
|
42
|
+
ENV['ARC_ENV'] = before
|
43
|
+
end
|
32
44
|
task :adapter, :env do |task, args|
|
33
45
|
ENV['ARC_ENV'] = args.env
|
34
46
|
system 'rspec spec/data_stores/integration/'
|
data/lib/arc.rb
CHANGED
@@ -8,4 +8,12 @@ require 'q/symbol'
|
|
8
8
|
require 'q/dispatcher'
|
9
9
|
|
10
10
|
require "arc/version"
|
11
|
-
require 'arc/data_stores'
|
11
|
+
require 'arc/data_stores/abstract/store'
|
12
|
+
|
13
|
+
module Arc
|
14
|
+
module DataStores
|
15
|
+
extend Q::Dispatcher
|
16
|
+
require_pattern "arc/data_stores/%s/store.rb"
|
17
|
+
constant_suffix "DataStore"
|
18
|
+
end
|
19
|
+
end
|
@@ -18,28 +18,66 @@ module Arc
|
|
18
18
|
raise NotImplementedError
|
19
19
|
end
|
20
20
|
|
21
|
-
def create query
|
22
|
-
#add new data
|
23
|
-
raise NotImplementedError
|
24
|
-
end
|
25
|
-
|
26
21
|
def read query
|
27
|
-
|
28
|
-
|
22
|
+
case query
|
23
|
+
when String
|
24
|
+
execute(query).symbolize_keys!
|
25
|
+
when Arel::SelectManager
|
26
|
+
result_for query
|
27
|
+
end
|
29
28
|
end
|
30
|
-
|
31
|
-
def
|
32
|
-
|
33
|
-
|
29
|
+
|
30
|
+
def create stmt
|
31
|
+
case stmt
|
32
|
+
when String
|
33
|
+
execute stmt
|
34
|
+
when Arel::InsertManager
|
35
|
+
table = stmt.instance_variable_get(:@ast).relation
|
36
|
+
execute stmt.to_sql
|
37
|
+
projections = schema[table.name.to_sym].column_names.map{ |c| table[c.to_sym] }
|
38
|
+
read(
|
39
|
+
table.project(*projections).where(
|
40
|
+
table.primary_key.eq(
|
41
|
+
Arel.sql(last_insert_rowid(table.name, table.primary_key.name).to_s)
|
42
|
+
)
|
43
|
+
)
|
44
|
+
)[0]
|
45
|
+
end
|
34
46
|
end
|
35
|
-
|
36
|
-
def
|
37
|
-
|
38
|
-
|
47
|
+
|
48
|
+
def update stmt, id=nil
|
49
|
+
case stmt
|
50
|
+
when String
|
51
|
+
execute stmt
|
52
|
+
when Arel::UpdateManager
|
53
|
+
execute stmt.to_sql
|
54
|
+
if id
|
55
|
+
table = stmt.instance_variable_get(:@ast).relation
|
56
|
+
projections = schema[table.name.to_sym].column_names.map{ |c| table[c.to_sym] }
|
57
|
+
read(
|
58
|
+
table.project(*projections)
|
59
|
+
.where(table.primary_key.eq id)
|
60
|
+
)[0]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def destroy stmt
|
66
|
+
case stmt
|
67
|
+
when String
|
68
|
+
execute stmt
|
69
|
+
when Arel::DeleteManager
|
70
|
+
execute stmt.to_sql
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def last_insert_rowid table_name, pk_name
|
75
|
+
'last_insert_rowid()'
|
39
76
|
end
|
40
77
|
|
41
78
|
def execute query
|
42
79
|
#adapters should override this method to execute a query against the database
|
80
|
+
#the methods should return an array-like object of hash-like objects
|
43
81
|
raise NotImplementedError
|
44
82
|
end
|
45
83
|
alias :with_store :with_resource
|
@@ -8,38 +8,16 @@ Mysql2::Client.default_query_options.merge!({
|
|
8
8
|
module Arc::DataStores
|
9
9
|
class MysqlDataStore < AbstractDataStore
|
10
10
|
|
11
|
-
def read query
|
12
|
-
case query
|
13
|
-
when String
|
14
|
-
execute(query).entries
|
15
|
-
when Arel::SelectManager
|
16
|
-
result_for query
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def create sql
|
21
|
-
table = sql.match(/\AINSERT into ([^ (]*)/i)[1]
|
22
|
-
execute sql
|
23
|
-
read("select * from #{table} where id = " + last_row_id.to_s).first
|
24
|
-
end
|
25
|
-
|
26
|
-
def update sql
|
27
|
-
execute sql
|
28
|
-
end
|
29
|
-
|
30
|
-
def destroy sql
|
31
|
-
execute sql
|
32
|
-
end
|
33
|
-
|
34
11
|
def quote_column_name table
|
35
12
|
"`#{table}`"
|
36
13
|
end
|
37
14
|
alias :quote_column :quote_column_name
|
38
15
|
|
39
16
|
def execute query
|
40
|
-
with_store do |store|
|
17
|
+
result = with_store do |store|
|
41
18
|
store.query query
|
42
19
|
end
|
20
|
+
result.entries if result.respond_to? :entries
|
43
21
|
end
|
44
22
|
|
45
23
|
def schema
|
@@ -61,7 +39,7 @@ module Arc::DataStores
|
|
61
39
|
Mysql2::Client.new @config
|
62
40
|
end
|
63
41
|
|
64
|
-
def
|
42
|
+
def last_insert_rowid table, column
|
65
43
|
with_store do |store|
|
66
44
|
store.last_id
|
67
45
|
end
|
@@ -5,28 +5,10 @@ module Arc
|
|
5
5
|
module DataStores
|
6
6
|
class PostgresDataStore < AbstractDataStore
|
7
7
|
|
8
|
-
def read query
|
9
|
-
case query
|
10
|
-
when String
|
11
|
-
execute(query).to_a.symbolize_keys!
|
12
|
-
when Arel::SelectManager
|
13
|
-
result_for query
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def create sql
|
18
|
-
table = sql.match(/\AINSERT into ([^ (]*)/i)[1]
|
19
|
-
sql[-1] = sql[-1] == ';' ? '' : sql[-1]
|
20
|
-
sql += " RETURNING id" unless sql =~ /returning/
|
21
|
-
id = execute(sql).to_a[0].first[1]
|
22
|
-
read("select * from #{table} where id = #{id}")[0]
|
23
|
-
end
|
24
8
|
def execute query
|
25
|
-
with_store { |connection| connection.exec query }
|
9
|
+
with_store { |connection| connection.exec query }.to_a.symbolize_keys!
|
26
10
|
end
|
27
|
-
|
28
|
-
alias :update :execute
|
29
|
-
|
11
|
+
|
30
12
|
def schema
|
31
13
|
@schema ||= ObjectDefinitions::PostgresSchema.new self
|
32
14
|
end
|
@@ -43,6 +25,10 @@ module Arc
|
|
43
25
|
end
|
44
26
|
end
|
45
27
|
|
28
|
+
def last_insert_rowid table, field
|
29
|
+
id = execute("SELECT currval('#{table}_#{field}_seq');")[0][:currval]
|
30
|
+
end
|
31
|
+
|
46
32
|
private
|
47
33
|
def create_connection
|
48
34
|
PGconn.connect({
|
@@ -4,33 +4,10 @@ require 'arc/data_stores/sqlite/object_definitions'
|
|
4
4
|
module Arc
|
5
5
|
module DataStores
|
6
6
|
class SqliteDataStore < AbstractDataStore
|
7
|
-
|
8
|
-
def read query
|
9
|
-
case query
|
10
|
-
when String
|
11
|
-
execute(query).symbolize_keys!
|
12
|
-
when Arel::SelectManager
|
13
|
-
result_for query
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def create sql
|
18
|
-
table = sql.match(/\AINSERT into ([^ (]*)/i)[1]
|
19
|
-
execute sql
|
20
|
-
read("select * from #{table} where id = last_insert_rowid();")[0]
|
21
|
-
end
|
22
|
-
|
23
|
-
def update sql
|
24
|
-
execute sql
|
25
|
-
end
|
26
|
-
|
27
|
-
def destroy sql
|
28
|
-
execute sql
|
29
|
-
end
|
30
7
|
|
31
8
|
def execute query
|
32
9
|
with_store do |connection|
|
33
|
-
result = connection.execute(query)
|
10
|
+
result = connection.execute(query).symbolize_keys!
|
34
11
|
end
|
35
12
|
end
|
36
13
|
|
data/lib/arc/version.rb
CHANGED
@@ -3,59 +3,41 @@ require 'spec_helper'
|
|
3
3
|
module Arc
|
4
4
|
module DataStores
|
5
5
|
describe ArelCompatibility do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
end
|
11
|
-
it '#responds to #connection_pool#spec#config' do
|
12
|
-
ArcTest.with_store do |s|
|
13
|
-
s.connection_pool.spec.config[:adapter].should == ArcTest.config_key.to_s
|
14
|
-
end
|
6
|
+
|
7
|
+
before :all do
|
8
|
+
@s = ArcTest.get_store
|
15
9
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
10
|
+
|
11
|
+
it '#responds to #connection_pool#spec#config' do
|
12
|
+
@s.connection_pool.spec.config[:adapter].should == ArcTest.adapter.to_s
|
13
|
+
end
|
14
|
+
it 'responds to #with_connection and yields an object which has an execute method' do
|
15
|
+
@s.with_connection do |connection|
|
16
|
+
connection.should respond_to(:execute)
|
21
17
|
end
|
22
18
|
end
|
23
19
|
it 'provides a visitor at #connection.visitor' do
|
24
|
-
|
25
|
-
|
26
|
-
s.connection.visitor.should == "lol"
|
27
|
-
end
|
20
|
+
@s.stub!(:visitor).and_return("lol")
|
21
|
+
@s.connection.visitor.should == "lol"
|
28
22
|
end
|
29
23
|
it "aliases #quote_table to #quote_table_name" do
|
30
|
-
|
31
|
-
s.method(:quote_table).should == s.method(:quote_table_name)
|
32
|
-
end
|
24
|
+
@s.method(:quote_table).should == @s.method(:quote_table_name)
|
33
25
|
end
|
34
26
|
it 'aliases quote_column to #quote_column_name' do
|
35
|
-
|
36
|
-
s.method(:quote_column).should == s.method(:quote_column_name)
|
37
|
-
end
|
27
|
+
@s.method(:quote_column).should == @s.method(:quote_column_name)
|
38
28
|
end
|
39
29
|
it 'provides a table_exists? method' do
|
40
|
-
|
41
|
-
s.table_exists?(:superheros).should be_true
|
42
|
-
end
|
30
|
+
@s.table_exists?(:superheros).should be_true
|
43
31
|
end
|
44
32
|
it 'provides a hashlike object at #connection_pool.columns_hash' do
|
45
|
-
|
46
|
-
s.connection_pool.columns_hash.should be(s)
|
47
|
-
end
|
33
|
+
@s.connection_pool.columns_hash.should be(@s)
|
48
34
|
end
|
49
35
|
it 'responds to primary_key given a table name' do
|
50
|
-
|
51
|
-
s.connection.primary_key(:superheros).should be(:id)
|
52
|
-
end
|
36
|
+
@s.connection.primary_key(:superheros).should be(:id)
|
53
37
|
end
|
54
38
|
it 'should quote a hash' do
|
55
|
-
|
56
|
-
|
57
|
-
s.quote_hash(hash).should == "'#{hash.to_yaml}'"
|
58
|
-
end
|
39
|
+
hash = {:a => :b}
|
40
|
+
@s.quote_hash(hash).should == "'#{hash.to_yaml}'"
|
59
41
|
end
|
60
42
|
|
61
43
|
end
|
@@ -6,7 +6,7 @@ module Arc
|
|
6
6
|
before :each do
|
7
7
|
@store = AbstractDataStore.new ArcTest.config[:empty]
|
8
8
|
@query = "omg"
|
9
|
-
@sstore = Arc::DataStores[:sqlite].new ArcTest.
|
9
|
+
@sstore = Arc::DataStores[:sqlite].new ArcTest._config[:sqlite]
|
10
10
|
@sstore.schema.execute_ddl File.read("spec/support/schemas/sqlite.sql")
|
11
11
|
Arel::Table.engine = @sstore
|
12
12
|
end
|
@@ -3,7 +3,7 @@ require 'arc/data_stores/mysql/store'
|
|
3
3
|
|
4
4
|
describe Arc::DataStores::MysqlDataStore do
|
5
5
|
before :each do
|
6
|
-
@store = Arc::DataStores[:mysql].new ArcTest.
|
6
|
+
@store = Arc::DataStores[:mysql].new ArcTest._config[:mysql]
|
7
7
|
end
|
8
8
|
|
9
9
|
it 'saves binary data', :wip => true do
|
@@ -3,7 +3,7 @@ require 'arc/data_stores/postgres/store'
|
|
3
3
|
|
4
4
|
describe Arc::DataStores::PostgresDataStore do
|
5
5
|
before :each do
|
6
|
-
@store = Arc::DataStores[:postgres].new ArcTest.
|
6
|
+
@store = Arc::DataStores[:postgres].new ArcTest._config[:postgres]
|
7
7
|
ddl = File.read "spec/support/schemas/postgres.sql"
|
8
8
|
@store.schema.execute_ddl ddl
|
9
9
|
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Arc do
|
4
|
+
#thread safety
|
5
|
+
#create a record
|
6
|
+
#read a record
|
7
|
+
#complex query
|
8
|
+
#update a record
|
9
|
+
#destroy a record
|
10
|
+
|
11
|
+
#convenience method for building a tree of arel values
|
12
|
+
def values_array table_name, hash
|
13
|
+
hash.keys.map do |attr|
|
14
|
+
[@tables[table_name][attr], hash[attr]]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
#grab a superhero record by name
|
19
|
+
def get_hero(hero_name)
|
20
|
+
query = @tables[:superheros]
|
21
|
+
.project('*')
|
22
|
+
.where(@tables[:superheros][:name].eq(hero_name))
|
23
|
+
.to_sql
|
24
|
+
@store.read query
|
25
|
+
end
|
26
|
+
|
27
|
+
before :all do
|
28
|
+
@store = ArcTest.get_store
|
29
|
+
@tables = Hash.new do |hash, key|
|
30
|
+
hash[key] = Arel::Table.new key
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
it "Safely executes queries initiated on different threads" do
|
35
|
+
threads = []
|
36
|
+
s = @tables[:superheros]
|
37
|
+
query = s.project( s[:name] )
|
38
|
+
result = @store.read(query)[0][:name]
|
39
|
+
5.times do
|
40
|
+
threads << Thread.start do
|
41
|
+
Thread.current[:result] = @store.read(query)[0][:name]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
names = threads.map {|t| t.join; t[:result] }
|
45
|
+
names.each {|n| n.should == result }
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#create and #read' do
|
49
|
+
before :each do
|
50
|
+
Timecop.freeze Time.now do
|
51
|
+
@created_at = Time.parse('2011-12-27 11:52:56 -0700')
|
52
|
+
properties = {
|
53
|
+
:name => "green hornet",
|
54
|
+
:born_on => @created_at,
|
55
|
+
:photo => File.read('spec/support/resources/ironman.gif'),
|
56
|
+
:created_at => @created_at
|
57
|
+
}
|
58
|
+
im = Arel::InsertManager.new Arel::Table.engine
|
59
|
+
im.insert values_array(:superheros, properties)
|
60
|
+
@result = @store.create im
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'creates a new record' do
|
65
|
+
superheros = @tables[:superheros]
|
66
|
+
query = @tables[:superheros]
|
67
|
+
.project(
|
68
|
+
superheros[:name],
|
69
|
+
superheros[:born_on],
|
70
|
+
superheros[:created_at],
|
71
|
+
superheros[:photo]
|
72
|
+
)
|
73
|
+
.where(@tables[:superheros][:name].eq('green hornet'))
|
74
|
+
result = @store.read query
|
75
|
+
result[0][:name].should == 'green hornet'
|
76
|
+
result[0][:born_on].should == Date.today
|
77
|
+
result[0][:created_at].should == @created_at
|
78
|
+
result[0][:photo].should == File.read('spec/support/resources/ironman.gif').force_encoding("BINARY")
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'returns the record with a populated primary key' do
|
82
|
+
@result[:id].should_not be_nil
|
83
|
+
@result[:name].should == 'green hornet'
|
84
|
+
@result[:born_on].should == Date.today
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#update' do
|
90
|
+
it 'updates a record (and returns the updated record when passing an id)' do
|
91
|
+
s = @tables[:superheros]
|
92
|
+
stmt = s.project(s[:id]).where(s[:name].eq('megaman'))
|
93
|
+
id = @store.read(stmt)[0][:id]
|
94
|
+
|
95
|
+
properties = {:name => 'batman'}
|
96
|
+
um = Arel::UpdateManager.new @store
|
97
|
+
um.table @tables[:superheros]
|
98
|
+
um.set(values_array(:superheros, properties))
|
99
|
+
.where(@tables[:superheros][:name].eq('megaman'))
|
100
|
+
result = @store.update um, id
|
101
|
+
result[:name].should == 'batman'
|
102
|
+
result[:born_on].should be_a(Date)
|
103
|
+
|
104
|
+
megaman = get_hero('megaman')
|
105
|
+
megaman.size.should == 0
|
106
|
+
megaman.should be_a(Enumerable)
|
107
|
+
|
108
|
+
batman = get_hero('batman')
|
109
|
+
batman.size.should == 1
|
110
|
+
batman.first[:name].should == 'batman'
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe '#destroy' do
|
115
|
+
it 'deletes a record' do
|
116
|
+
delete = Arel::DeleteManager.new @store
|
117
|
+
delete
|
118
|
+
.from(@tables[:superheros])
|
119
|
+
.where(@tables[:superheros][:name].eq('superman'))
|
120
|
+
@store.destroy delete
|
121
|
+
superman = get_hero('superman')
|
122
|
+
superman.size.should == 0
|
123
|
+
superman.size.should == 0
|
124
|
+
superman.should be_a(Enumerable)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
data/spec/quoting_spec.rb
CHANGED
@@ -71,12 +71,12 @@ module Arc
|
|
71
71
|
end
|
72
72
|
it 'quotes an object based on column type' do
|
73
73
|
superman = "superman"
|
74
|
-
ArcTest.
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
74
|
+
store = ArcTest.get_store
|
75
|
+
c = store[:superheros][:name]
|
76
|
+
quoter.quote(superman, c).should == "'superman'"
|
77
|
+
c = store[:superheros][:id]
|
78
|
+
quoter.quote(10, c).should == '10'
|
79
|
+
ArcTest.drop_store store
|
80
80
|
end
|
81
81
|
it 'quotes a bigdecimal' do
|
82
82
|
big_decimal = BigDecimal.new((1 << 100).to_s)
|
data/spec/spec_helper.rb
CHANGED
@@ -6,76 +6,42 @@ require 'bundler/setup'
|
|
6
6
|
require 'rspec'
|
7
7
|
require 'arc'
|
8
8
|
require 'arel'
|
9
|
-
require 'q/resource_pool'
|
10
9
|
require 'timecop'
|
11
10
|
|
12
|
-
RSpec.configure do |config|
|
13
|
-
config.after(:all) do
|
14
|
-
ArcTest.drop
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
11
|
module ArcTest
|
19
12
|
DEFAULT_ADAPTER = 'sqlite'
|
20
13
|
|
21
|
-
class StoreProvider < ResourcePool
|
22
|
-
def create_resource
|
23
|
-
Arc::DataStores[ArcTest.adapter].new ArcTest.current_config
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
14
|
class << self
|
28
|
-
|
29
|
-
def config_key
|
15
|
+
def env
|
30
16
|
@config_key ||= (ENV['ARC_ENV'] ||= ArcTest::DEFAULT_ADAPTER).to_sym
|
31
|
-
end
|
32
|
-
|
33
|
-
def file_root
|
34
|
-
@file_root ||= "#{File.dirname __FILE__}/support/schemas"
|
35
|
-
end
|
36
|
-
|
37
|
-
def config
|
38
|
-
@config ||= YAML::load(File.read "#{File.dirname __FILE__}/support/config.yml").symbolize_keys!
|
39
17
|
end
|
40
|
-
|
41
|
-
def
|
42
|
-
|
43
|
-
@drop_ddl ||= File.read "#{file_root}/drop_#{config_key}.sql"
|
44
|
-
provider.with_resource { |store| store.schema.execute_ddl @drop_ddl }
|
45
|
-
@schema_loaded = false
|
46
|
-
end
|
47
|
-
|
48
|
-
def load_schema
|
49
|
-
return if @schema_loaded
|
50
|
-
@ddl ||= File.read "#{file_root}/#{config_key}.sql"
|
51
|
-
provider.with_resource { |store| store.schema.execute_ddl @ddl }
|
52
|
-
@schema_loaded = true
|
18
|
+
alias :adapter :env
|
19
|
+
def adapter
|
20
|
+
env
|
53
21
|
end
|
54
22
|
|
55
|
-
def
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
provider.with_resource do |store|
|
63
|
-
yield store
|
23
|
+
def get_store
|
24
|
+
@store = begin
|
25
|
+
s = Arc::DataStores[ArcTest.adapter].new ArcTest.config
|
26
|
+
Arel::Table.engine = s
|
27
|
+
s.schema.execute_ddl File.read("spec/support/schemas/#{adapter}.sql")
|
28
|
+
load "spec/support/seed.rb"
|
29
|
+
s
|
64
30
|
end
|
65
31
|
end
|
66
32
|
|
67
|
-
def
|
68
|
-
|
33
|
+
def drop_store store
|
34
|
+
store.schema.execute_ddl File.read("spec/support/schemas/drop_#{adapter}.sql")
|
69
35
|
end
|
70
36
|
|
71
|
-
def
|
72
|
-
|
37
|
+
def _config
|
38
|
+
@config ||= YAML::load(File.read "spec/support/config.yml").symbolize_keys!
|
73
39
|
end
|
74
40
|
|
75
|
-
|
76
|
-
|
77
|
-
@provider ||= StoreProvider.new nil
|
41
|
+
def config
|
42
|
+
_config[env]
|
78
43
|
end
|
44
|
+
|
79
45
|
end
|
80
46
|
|
81
47
|
end
|
data/spec/support/seed.rb
CHANGED
@@ -54,7 +54,7 @@ data.each_pair do |name, tuples|
|
|
54
54
|
[table[key], tuple[key]]
|
55
55
|
end
|
56
56
|
stmt.insert(values)
|
57
|
-
record = Arel::Table.engine.create(stmt
|
57
|
+
record = Arel::Table.engine.create(stmt)
|
58
58
|
ids[name][record[:name]] = record[:id]
|
59
59
|
end
|
60
60
|
end
|
@@ -70,5 +70,5 @@ power_sets.each do |set|
|
|
70
70
|
[power_map[:superhero_id], ids[:superheros][set[0]]],
|
71
71
|
[power_map[:power_id], ids[:powers][set[1]]]
|
72
72
|
])
|
73
|
-
Arel::Table.engine.create im
|
73
|
+
Arel::Table.engine.create im
|
74
74
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.3
|
4
|
+
version: 0.0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-12-
|
12
|
+
date: 2011-12-28 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: agent-q
|
16
|
-
requirement: &
|
16
|
+
requirement: &70332275934140 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70332275934140
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: arel
|
27
|
-
requirement: &
|
27
|
+
requirement: &70332275933640 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70332275933640
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: pg
|
38
|
-
requirement: &
|
38
|
+
requirement: &70332275932980 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70332275932980
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: sqlite3
|
49
|
-
requirement: &
|
49
|
+
requirement: &70332275932240 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70332275932240
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: mysql2
|
60
|
-
requirement: &
|
60
|
+
requirement: &70332275931820 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70332275931820
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
|
-
requirement: &
|
71
|
+
requirement: &70332275931360 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70332275931360
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: simplecov
|
82
|
-
requirement: &
|
82
|
+
requirement: &70332275930860 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70332275930860
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: timecop
|
93
|
-
requirement: &
|
93
|
+
requirement: &70332275930440 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70332275930440
|
102
102
|
description: Compatible with mysql, sqlite, and postgres
|
103
103
|
email:
|
104
104
|
- jacob.s.morris@gmail.com
|
@@ -109,11 +109,12 @@ files:
|
|
109
109
|
- .gitignore
|
110
110
|
- .rspec
|
111
111
|
- Gemfile
|
112
|
+
- README.md
|
113
|
+
- README.md.orig
|
112
114
|
- Rakefile
|
113
115
|
- arc.gemspec
|
114
116
|
- lib/arc.rb
|
115
117
|
- lib/arc/casting.rb
|
116
|
-
- lib/arc/data_stores.rb
|
117
118
|
- lib/arc/data_stores/abstract/arel_compatibility.rb
|
118
119
|
- lib/arc/data_stores/abstract/object_definitions.rb
|
119
120
|
- lib/arc/data_stores/abstract/store.rb
|
@@ -130,12 +131,11 @@ files:
|
|
130
131
|
- spec/data_stores/abstract/arel_compatibility_spec.rb
|
131
132
|
- spec/data_stores/abstract/object_definitions_spec.rb
|
132
133
|
- spec/data_stores/abstract/store_spec.rb
|
133
|
-
- spec/data_stores/integration/crud_spec.rb
|
134
|
-
- spec/data_stores/integration/schema_spec.rb
|
135
134
|
- spec/data_stores/mysql/store_spec.rb
|
136
135
|
- spec/data_stores/postgres/store_spec.rb
|
137
136
|
- spec/data_stores/sqlite/store_spec.rb
|
138
137
|
- spec/data_stores_spec.rb
|
138
|
+
- spec/integration_spec.rb
|
139
139
|
- spec/quoting_spec.rb
|
140
140
|
- spec/spec_helper.rb
|
141
141
|
- spec/support/config.yml
|
@@ -180,12 +180,11 @@ test_files:
|
|
180
180
|
- spec/data_stores/abstract/arel_compatibility_spec.rb
|
181
181
|
- spec/data_stores/abstract/object_definitions_spec.rb
|
182
182
|
- spec/data_stores/abstract/store_spec.rb
|
183
|
-
- spec/data_stores/integration/crud_spec.rb
|
184
|
-
- spec/data_stores/integration/schema_spec.rb
|
185
183
|
- spec/data_stores/mysql/store_spec.rb
|
186
184
|
- spec/data_stores/postgres/store_spec.rb
|
187
185
|
- spec/data_stores/sqlite/store_spec.rb
|
188
186
|
- spec/data_stores_spec.rb
|
187
|
+
- spec/integration_spec.rb
|
189
188
|
- spec/quoting_spec.rb
|
190
189
|
- spec/spec_helper.rb
|
191
190
|
- spec/support/config.yml
|
data/lib/arc/data_stores.rb
DELETED
@@ -1,107 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'pp'
|
3
|
-
module Arc
|
4
|
-
module DataStores
|
5
|
-
describe 'The data store crud operations' do
|
6
|
-
#convenience method for building a tree of arel values
|
7
|
-
def values_array table_name, hash
|
8
|
-
hash.keys.map do |attr|
|
9
|
-
[@tables[table_name][attr], hash[attr]]
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
#grab a superhero record by name
|
14
|
-
def get_hero(hero_name)
|
15
|
-
query = @tables[:superheros]
|
16
|
-
.project('*')
|
17
|
-
.where(@tables[:superheros][:name].eq(hero_name))
|
18
|
-
.to_sql
|
19
|
-
@store.read query
|
20
|
-
end
|
21
|
-
|
22
|
-
before :each do
|
23
|
-
ArcTest.with_store do |store|
|
24
|
-
Arel::Table.engine = store
|
25
|
-
load "spec/support/seed.rb"
|
26
|
-
end
|
27
|
-
@tables = Hash.new { |hash, key| hash[key] = Arel::Table.new key }
|
28
|
-
@store = Arel::Table.engine
|
29
|
-
end
|
30
|
-
|
31
|
-
describe '#create and #read' do
|
32
|
-
before :each do
|
33
|
-
Timecop.freeze Time.now do
|
34
|
-
@created_at = Time.parse('2011-12-27 11:52:56 -0700')
|
35
|
-
properties = {
|
36
|
-
:name => "green hornet",
|
37
|
-
:born_on => @created_at,
|
38
|
-
:photo => File.read('spec/support/resources/ironman.gif'),
|
39
|
-
:created_at => @created_at
|
40
|
-
}
|
41
|
-
im = Arel::InsertManager.new Arel::Table.engine
|
42
|
-
im.insert values_array(:superheros, properties)
|
43
|
-
@result = @store.create im.to_sql
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'creates a new record' do
|
48
|
-
superheros = @tables[:superheros]
|
49
|
-
query = @tables[:superheros]
|
50
|
-
.project(
|
51
|
-
superheros[:name],
|
52
|
-
superheros[:born_on],
|
53
|
-
superheros[:created_at],
|
54
|
-
superheros[:photo]
|
55
|
-
)
|
56
|
-
.where(@tables[:superheros][:name].eq('green hornet'))
|
57
|
-
result = @store.read query
|
58
|
-
result[0][:name].should == 'green hornet'
|
59
|
-
result[0][:born_on].should == Date.today
|
60
|
-
result[0][:created_at].should == @created_at
|
61
|
-
result[0][:photo].should == File.read('spec/support/resources/ironman.gif').force_encoding("BINARY")
|
62
|
-
end
|
63
|
-
|
64
|
-
it 'returns the record with a populated primary key' do
|
65
|
-
@result[:id].should_not be_nil
|
66
|
-
@result[:name].should == 'green hornet'
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
|
-
describe '#update' do
|
72
|
-
it 'updates a record and returns the updated record' do
|
73
|
-
properties = {:name => 'batman'}
|
74
|
-
um = Arel::UpdateManager.new @store
|
75
|
-
um.table @tables[:superheros]
|
76
|
-
um.set(values_array(:superheros, properties))
|
77
|
-
.where(@tables[:superheros][:name].eq('megaman'))
|
78
|
-
query = um.to_sql
|
79
|
-
result = @store.update query
|
80
|
-
|
81
|
-
megaman = get_hero('megaman')
|
82
|
-
megaman.size.should == 0
|
83
|
-
megaman.should be_a(Enumerable)
|
84
|
-
|
85
|
-
batman = get_hero('batman')
|
86
|
-
batman.size.should == 1
|
87
|
-
batman.first[:name].should == 'batman'
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
describe '#destroy' do
|
92
|
-
it 'deletes a record' do
|
93
|
-
delete = Arel::DeleteManager.new @store
|
94
|
-
delete
|
95
|
-
.from(@tables[:superheros])
|
96
|
-
.where(@tables[:superheros][:name].eq('superman'))
|
97
|
-
@store.destroy delete.to_sql
|
98
|
-
superman = get_hero('superman')
|
99
|
-
superman.size.should == 0
|
100
|
-
superman.size.should == 0
|
101
|
-
superman.should be_a(Enumerable)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Arc
|
4
|
-
module DataStores
|
5
|
-
module ObjectDefinitions
|
6
|
-
describe "All the Schemas!" do
|
7
|
-
it 'lists the table names' do
|
8
|
-
ArcTest.with_store do |store|
|
9
|
-
[:superheros, :powers, :superheros_powers].each do |t|
|
10
|
-
store.schema.table_names.should include(t)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'provides a Table object for each table' do
|
16
|
-
ArcTest.with_store do |store|
|
17
|
-
heros = store[:superheros]
|
18
|
-
heros.should be_a(Table)
|
19
|
-
heros.column_names.should include(:id)
|
20
|
-
heros.column_names.should include(:name)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'provides a Column object for each column' do
|
25
|
-
ArcTest.with_store do |store|
|
26
|
-
heros = store[:superheros]
|
27
|
-
id = heros[:id]
|
28
|
-
id.should be_a(Column)
|
29
|
-
id.pk?.should be_true
|
30
|
-
id.allows_null?.should be_false
|
31
|
-
id.default.should be_nil
|
32
|
-
id.name.should == "id"
|
33
|
-
id.type.should == :integer
|
34
|
-
|
35
|
-
#name column
|
36
|
-
name = heros[:name]
|
37
|
-
name.should be_a(Column)
|
38
|
-
name.pk?.should be_false
|
39
|
-
name.allows_null?.should be_false
|
40
|
-
name.default.should be_nil
|
41
|
-
name.name.should == "name"
|
42
|
-
name.type.should == :varchar
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|