arc 0.0.2.1 → 0.0.3

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.
@@ -26,5 +26,6 @@ Gem::Specification.new do |s|
26
26
  s.add_development_dependency 'mysql2'
27
27
  s.add_development_dependency 'rspec'
28
28
  s.add_development_dependency 'simplecov'
29
+ s.add_development_dependency 'timecop'
29
30
 
30
31
  end
data/lib/arc.rb CHANGED
@@ -8,5 +8,4 @@ require 'q/symbol'
8
8
  require 'q/dispatcher'
9
9
 
10
10
  require "arc/version"
11
- require 'arc/data_stores'
12
-
11
+ require 'arc/data_stores'
@@ -3,20 +3,22 @@ module Arc
3
3
  class CannotCastValueError < StandardError; end
4
4
 
5
5
  TYPES = {
6
- integer: 'integer',
7
- int: 'integer',
8
- char: 'string' ,
9
- varchar: 'string' ,
10
- binary: 'binary' ,
11
- date: 'date' ,
12
- datetime: 'time' ,
13
- time: 'time' ,
14
- bool: 'boolean',
15
- boolean: 'boolean',
16
- bit: 'boolean',
17
- float: 'float' ,
18
- text: 'string' ,
19
- bytea: 'binary' ,
6
+ integer: 'integer',
7
+ int: 'integer',
8
+ char: 'string' ,
9
+ varchar: 'string' ,
10
+ binary: 'binary' ,
11
+ date: 'date' ,
12
+ datetime: 'time' ,
13
+ time: 'time' ,
14
+ bool: 'boolean',
15
+ boolean: 'boolean',
16
+ bit: 'boolean',
17
+ float: 'float' ,
18
+ text: 'string' ,
19
+ bytea: 'binary' ,
20
+ timestamp: 'timestamp',
21
+ blob: 'binary'
20
22
  }
21
23
 
22
24
  CAST_METHODS = Hash.new do |cast_methods, key|
@@ -41,9 +43,12 @@ module Arc
41
43
  value.to_f
42
44
  end
43
45
  def cast_time value
46
+ return value if value.is_a? Time
44
47
  Time.parse value
45
48
  end
49
+ alias :cast_timestamp :cast_time
46
50
  def cast_date value
51
+ return value if value.is_a? Date
47
52
  Date.parse value
48
53
  end
49
54
  def cast_binary value
@@ -8,6 +8,7 @@ module Arc
8
8
  class AbstractDataStore < ResourcePool
9
9
  include ArelCompatibility
10
10
  include Arc::Quoting
11
+ include Arc::Casting
11
12
 
12
13
  def [] table
13
14
  schema[table]
@@ -43,6 +44,40 @@ module Arc
43
44
  end
44
45
  alias :with_store :with_resource
45
46
  alias :columns :[]
47
+
48
+ def type_mappings_for query
49
+ type_mappings = {}
50
+ query.instance_variable_get(:@ctx).projections.each do |projection|
51
+ is_alias = projection.respond_to?(:right)
52
+ relation = is_alias ? projection.left.relation : projection.relation
53
+
54
+ root_projection = is_alias ? projection.left : projection
55
+ relation_is_alias = root_projection.relation.respond_to?(:left)
56
+
57
+ root_relation = relation_is_alias ? relation.left : relation
58
+
59
+ table_name = root_relation.name
60
+ result_column_name = is_alias ? projection.right.to_sym : projection.name
61
+ table_column_name = root_projection.name
62
+
63
+ table = Arel::Table.engine[table_name.to_sym]
64
+ column = table[table_column_name.to_sym]
65
+
66
+ type_mappings[result_column_name] = column.type.to_sym
67
+ end
68
+ type_mappings
69
+ end
70
+
71
+ def result_for query
72
+ mappings = type_mappings_for query
73
+ rows = read(query.to_sql)
74
+ return Array.new(rows.size) do |index|
75
+ Hash.new do |hash, key|
76
+ hash[key] = cast rows[index][key], mappings[key]
77
+ end
78
+ end
79
+ end
80
+
46
81
  private
47
82
  #better semantics for a class that deals with 'connections' instead of 'resources'
48
83
  def create_connection
@@ -9,7 +9,12 @@ module Arc::DataStores
9
9
  class MysqlDataStore < AbstractDataStore
10
10
 
11
11
  def read query
12
- execute(query).entries
12
+ case query
13
+ when String
14
+ execute(query).entries
15
+ when Arel::SelectManager
16
+ result_for query
17
+ end
13
18
  end
14
19
 
15
20
  def create sql
@@ -41,6 +46,16 @@ module Arc::DataStores
41
46
  @schema ||= ObjectDefinitions::MysqlSchema.new self
42
47
  end
43
48
 
49
+ def cast_blob data
50
+ debugger
51
+ data
52
+ end
53
+ def quote_blob data
54
+ with_store do |store|
55
+ "'#{store.escape(data).force_encoding("BINARY")}'"
56
+ end
57
+ end
58
+
44
59
  private
45
60
  def create_connection
46
61
  Mysql2::Client.new @config
@@ -4,9 +4,16 @@ require 'arc/data_stores/postgres/object_definitions'
4
4
  module Arc
5
5
  module DataStores
6
6
  class PostgresDataStore < AbstractDataStore
7
+
7
8
  def read query
8
- execute(query).to_a.symbolize_keys!
9
- end
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
+
10
17
  def create sql
11
18
  table = sql.match(/\AINSERT into ([^ (]*)/i)[1]
12
19
  sql[-1] = sql[-1] == ';' ? '' : sql[-1]
@@ -23,6 +30,19 @@ module Arc
23
30
  def schema
24
31
  @schema ||= ObjectDefinitions::PostgresSchema.new self
25
32
  end
33
+
34
+ def quote_binary data
35
+ with_store do |store|
36
+ "'#{store.escape_bytea data}'"
37
+ end
38
+ end
39
+
40
+ def cast_binary data
41
+ with_store do |store|
42
+ store.unescape_bytea data
43
+ end
44
+ end
45
+
26
46
  private
27
47
  def create_connection
28
48
  PGconn.connect({
@@ -13,6 +13,7 @@ module Arc
13
13
  end
14
14
 
15
15
  def fetch_item name
16
+ raise "Table does not exist: #{name}" unless table_names.include? name.to_sym
16
17
  SqliteTable.new name, @data_store
17
18
  end
18
19
  end
@@ -6,7 +6,12 @@ module Arc
6
6
  class SqliteDataStore < AbstractDataStore
7
7
 
8
8
  def read query
9
- execute(query).symbolize_keys!
9
+ case query
10
+ when String
11
+ execute(query).symbolize_keys!
12
+ when Arel::SelectManager
13
+ result_for query
14
+ end
10
15
  end
11
16
 
12
17
  def create sql
@@ -65,6 +65,7 @@ module Arc
65
65
  return quote_string value if value.is_a? String
66
66
  quote_string "#{value.strftime '%Y-%m-%d %H:%M:%S'}"
67
67
  end
68
+ alias :quote_timestamp :quote_time
68
69
  def quote_numeric value
69
70
  value.to_s
70
71
  end
@@ -79,6 +80,7 @@ module Arc
79
80
  'NULL'
80
81
  end
81
82
  def quote_binary value
83
+ value.force_encoding 'BINARY'
82
84
  value.gsub!(/\0|\%/n) do |byte|
83
85
  case byte
84
86
  when "\0" then "%00"
@@ -1,3 +1,3 @@
1
1
  module Arc
2
- VERSION = "0.0.2.1"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -6,6 +6,9 @@ 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.config[:sqlite]
10
+ @sstore.schema.execute_ddl File.read("spec/support/schemas/sqlite.sql")
11
+ Arel::Table.engine = @sstore
9
12
  end
10
13
 
11
14
  it 'proxies methods to the schema' do
@@ -52,6 +55,108 @@ module Arc
52
55
  end
53
56
  end
54
57
 
58
+ describe '#type_mappings_for' do
59
+ it '#converts data store data types (varchar, tinyint, etc) into ruby types (string, integer, etc)' do
60
+ superheros = Arel::Table.new :superheros
61
+ query = superheros.project(
62
+ superheros[:name],
63
+ superheros[:born_on],
64
+ superheros[:photo],
65
+ superheros[:created_at]
66
+ )
67
+ @sstore.type_mappings_for(query).should == {
68
+ :name => :varchar,
69
+ :born_on => :date,
70
+ :photo => :binary,
71
+ :created_at => :time
72
+ }
73
+ end
74
+
75
+ it '#handles aliased tables' do
76
+ superheros = Arel::Table.new :superheros
77
+ superheros_1 = superheros.alias
78
+ query = superheros.project(
79
+ superheros_1[:name],
80
+ superheros_1[:born_on],
81
+ superheros_1[:photo],
82
+ superheros_1[:created_at]
83
+ )
84
+ @sstore.type_mappings_for(query).should == {
85
+ :name => :varchar,
86
+ :born_on => :date,
87
+ :photo => :binary,
88
+ :created_at => :time
89
+ }
90
+ end
91
+
92
+ it '#handles aliased columns (attributes)' do
93
+ superheros = Arel::Table.new :superheros
94
+ superheros_1 = superheros.alias
95
+ query = superheros.project(
96
+ superheros_1[:name].as('superhero_name'),
97
+ superheros_1[:born_on],
98
+ superheros_1[:photo],
99
+ superheros_1[:created_at]
100
+ )
101
+ @sstore.type_mappings_for(query).should == {
102
+ :superhero_name => :varchar,
103
+ :born_on => :date,
104
+ :photo => :binary,
105
+ :created_at => :time
106
+ }
107
+ end
108
+
109
+ it '#handles complex joins' do
110
+ powers = Arel::Table.new :powers
111
+ superheros_powers = Arel::Table.new :superheros_powers
112
+ superheros = Arel::Table.new :superheros
113
+
114
+ superheros_powers = superheros_powers.alias
115
+ powers = powers.alias
116
+
117
+ stmt = superheros
118
+ .join(superheros_powers).on(
119
+ superheros_powers[:superhero_id].eq(superheros[:id])
120
+ )
121
+ .join(powers).on(
122
+ powers[:id].eq(superheros_powers[:power_id])
123
+ )
124
+ .project(
125
+ superheros[:name].as('superhero_name'),
126
+ superheros[:created_at].as("hello"),
127
+ powers[:name].as("power_name")
128
+ )
129
+ .where(
130
+ superheros[:id].eq(1)
131
+ )
132
+
133
+ @sstore.type_mappings_for(stmt).should == {
134
+ :superhero_name => :varchar,
135
+ :hello => :time,
136
+ :power_name => :varchar
137
+ }
138
+ end
139
+ end
140
+
141
+ describe '#result_for' do
142
+ it 'creates a lazy loaded array whose elements are lazy loaded hashes whose values are type-casted query results' do
143
+ Arel::Table.engine = @sstore
144
+ load "spec/support/seed.rb"
145
+ superheros = Arel::Table.new :superheros
146
+ query = superheros.project(
147
+ superheros[:name],
148
+ superheros[:born_on],
149
+ superheros[:photo],
150
+ superheros[:created_at]
151
+ )
152
+ result = @sstore.result_for query
153
+ result.should be_an(Array)
154
+ result[0].should be_a(Hash)
155
+ result[0][:born_on].should be_a(Date)
156
+ result[0][:created_at].should be_a(Time)
157
+ end
158
+ end
159
+
55
160
  end
56
161
  end
57
162
  end
@@ -30,24 +30,35 @@ module Arc
30
30
 
31
31
  describe '#create and #read' do
32
32
  before :each do
33
- properties = {
34
- :name => "green hornet",
35
- :born_on => Time.now,
36
- :photo => "hello",
37
- :created_at => Time.now
38
- }
39
- im = Arel::InsertManager.new Arel::Table.engine
40
- im.insert values_array(:superheros, properties)
41
- @result = @store.create im.to_sql
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
42
45
  end
43
46
 
44
47
  it 'creates a new record' do
48
+ superheros = @tables[:superheros]
45
49
  query = @tables[:superheros]
46
- .project('*')
50
+ .project(
51
+ superheros[:name],
52
+ superheros[:born_on],
53
+ superheros[:created_at],
54
+ superheros[:photo]
55
+ )
47
56
  .where(@tables[:superheros][:name].eq('green hornet'))
48
- .to_sql
49
57
  result = @store.read query
50
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")
51
62
  end
52
63
 
53
64
  it 'returns the record with a populated primary key' do
@@ -88,7 +99,7 @@ module Arc
88
99
  superman.size.should == 0
89
100
  superman.size.should == 0
90
101
  superman.should be_a(Enumerable)
91
- end
102
+ end
92
103
  end
93
104
 
94
105
  end
@@ -2,19 +2,52 @@ require 'spec_helper'
2
2
  require 'arc/data_stores/mysql/store'
3
3
 
4
4
  describe Arc::DataStores::MysqlDataStore do
5
- describe '#quote_table_name', :wip => true do
6
- store = Arc::DataStores::MysqlDataStore.new ArcTest.config[:mysql]
7
- store.quote_table_name('my-table').should == "`my-table`"
5
+ before :each do
6
+ @store = Arc::DataStores[:mysql].new ArcTest.config[:mysql]
8
7
  end
9
- describe '#quote_column_name', :wip => true do
10
- store = Arc::DataStores::MysqlDataStore.new ArcTest.config[:mysql]
11
- store.quote_column_name('my-column').should == "`my-column`"
8
+
9
+ it 'saves binary data', :wip => true do
10
+ Arel::Table.engine = @store
11
+ load "spec/support/seed.rb"
12
+ superheros = Arel::Table.new :superheros
13
+ result = @store.read superheros.project(superheros[:photo]).where(superheros[:name].eq("superman"))
14
+ result[0][:photo].should_not be_nil
15
+ result[0][:photo].should == File.read("spec/support/resources/superman.gif").force_encoding("BINARY")
16
+ File.open("spec/support/resources/out/superman.gif", "w+"){ |f| f.write result[0][:photo] }
12
17
  end
13
18
 
14
19
  describe "#schema" do
15
20
  it 'is an instance of Arc::DataStores::MysqlSchema' do
16
- store = Arc::DataStores::MysqlDataStore.new ArcTest.config[:mysql]
17
- store.schema.should be_a(Arc::DataStores::ObjectDefinitions::MysqlSchema)
21
+ @store.schema.should be_a(Arc::DataStores::ObjectDefinitions::MysqlSchema)
22
+ end
23
+ end
24
+
25
+ describe '#quote' do
26
+ it 'quotes table names' do
27
+ @store.quote_table_name('my-table').should == "`my-table`"
28
+ end
29
+ it 'quotes column names' do
30
+ @store.quote_column_name('my-column').should == "`my-column`"
31
+ end
32
+ it 'quotes dates' do
33
+ date = Date.parse '2012-01-01'
34
+ quoted_date = @store.quote date
35
+ quoted_date.should == "'2012-01-01'"
36
+ end
37
+ it 'quotes a time' do
38
+ time = Time.parse '2012-01-01 12:30:21 -0700'
39
+ quoted_time = @store.quote time
40
+ quoted_time.should == "'2012-01-01 12:30:21'"
41
+ end
42
+ end
43
+
44
+ describe '#cast' do
45
+ it 'casts a date' do
46
+ date = Date.parse '2012-01-01'
47
+ casted_date = @store.cast date, :date
48
+ casted_date.should be_a(Date)
49
+ casted_date.should == Date.parse('2012-01-01')
18
50
  end
19
51
  end
52
+
20
53
  end
@@ -2,13 +2,25 @@ require 'spec_helper'
2
2
  require 'arc/data_stores/postgres/store'
3
3
 
4
4
  describe Arc::DataStores::PostgresDataStore do
5
+ before :each do
6
+ @store = Arc::DataStores[:postgres].new ArcTest.config[:postgres]
7
+ ddl = File.read "spec/support/schemas/postgres.sql"
8
+ @store.schema.execute_ddl ddl
9
+ end
10
+
11
+ after :each do
12
+ drop_ddl = File.read "spec/support/schemas/drop_postgres.sql"
13
+ @store.schema.execute_ddl @drop_ddl
14
+ @schema_loaded = false
15
+ end
16
+
5
17
  describe "#schema" do
6
18
  it 'is an instance of Arc::DataStores::PostgresSchema' do
7
- store = Arc::DataStores::PostgresDataStore.new ArcTest.config[:Postgres]
19
+ store = Arc::DataStores[:postgres].new ArcTest.config[:postgres]
8
20
  store.schema.should be_a(Arc::DataStores::ObjectDefinitions::PostgresSchema)
9
21
  end
10
22
  end
11
- describe Arc::DataStores::ObjectDefinitions::PostgresColumn, :wip => true do
23
+ describe Arc::DataStores::ObjectDefinitions::PostgresColumn do
12
24
  it 'returns a time type' do
13
25
  c = Arc::DataStores::ObjectDefinitions::PostgresColumn.new(nil,
14
26
  :type => "time without time zone"
@@ -18,4 +30,13 @@ describe Arc::DataStores::PostgresDataStore do
18
30
  c.type.should == :time
19
31
  end
20
32
  end
33
+ it 'can save binary data' do
34
+ Arel::Table.engine = @store
35
+ load "spec/support/seed.rb"
36
+ superheros = Arel::Table.new :superheros
37
+ result = @store.read superheros.project(superheros[:photo]).where(superheros[:name].eq("superman"))
38
+ result[0][:photo].should_not be_nil
39
+ result[0][:photo].should == File.read("spec/support/resources/superman.gif").force_encoding("BINARY")
40
+ File.open("spec/support/resources/out/superman.gif", "w+"){ |f| f.write result[0][:photo] }
41
+ end
21
42
  end
@@ -36,10 +36,14 @@ module Arc
36
36
  quoter.quote(date.strftime(fmt), Date).should == "'#{date.strftime fmt}'"
37
37
  end
38
38
  it 'quotes a time object' do
39
- time = Time.now
40
- fmt = '%Y-%m-%d %H:%M:%S'
41
- quoter.quote(time).should == "'#{time.strftime fmt}'"
42
- quoter.quote(time.strftime(fmt), Time).should == "'#{time.strftime fmt}'"
39
+ Timecop.freeze Time.now do
40
+ fmt = '%Y-%m-%d %H:%M:%S'
41
+ time = Time.parse(Time.now.strftime(fmt))
42
+ quoted_time = quoter.quote(time)
43
+ Time.parse(quoted_time).should == time
44
+ quoted_time = quoter.quote(time.strftime(fmt), Time)
45
+ Time.parse(quoted_time).should == time
46
+ end
43
47
  end
44
48
  it 'quotes a fixnum' do
45
49
  fixnum = 10
@@ -7,7 +7,7 @@ require 'rspec'
7
7
  require 'arc'
8
8
  require 'arel'
9
9
  require 'q/resource_pool'
10
-
10
+ require 'timecop'
11
11
 
12
12
  RSpec.configure do |config|
13
13
  config.after(:all) do
@@ -3,8 +3,8 @@ CREATE TABLE superheros (
3
3
  id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
4
4
  name VARCHAR(256) NOT NULL,
5
5
  born_on DATE NOT NULL,
6
- photo BINARY NULL,
7
- created_at TIME NOT NULL
6
+ photo BLOB NULL,
7
+ created_at TIMESTAMP NOT NULL
8
8
  );
9
9
 
10
10
  DROP TABLE IF EXISTS powers;
@@ -1,4 +1,3 @@
1
-
2
1
  tables = Hash.new do |hash, key|
3
2
  hash[key] = Arel::Table.new key
4
3
  end
@@ -9,19 +8,19 @@ data = {
9
8
  {
10
9
  :name => 'superman',
11
10
  :born_on => Time.now,
12
- :photo => 'file',#File.read("#{file_root}/resources/superman.gif"),
11
+ :photo => File.read("#{file_root}/resources/superman.gif"),
13
12
  :created_at => Time.now
14
13
  },
15
14
  {
16
15
  :name => 'ironman',
17
16
  :born_on => Time.now,
18
- :photo => 'file',#File.read("#{file_root}/resources/ironman.gif"),
17
+ :photo => File.read("#{file_root}/resources/ironman.gif"),
19
18
  :created_at => Time.now
20
19
  },
21
20
  {
22
21
  :name => 'megaman',
23
22
  :born_on => Time.now,
24
- :photo => 'file',#File.read("#{file_root}/resources/megaman.jpg"),
23
+ :photo => File.read("#{file_root}/resources/megaman.jpg"),
25
24
  :created_at => Time.now
26
25
  }
27
26
  ],
@@ -42,16 +41,34 @@ data = {
42
41
  ]
43
42
  }
44
43
 
44
+ ids = {:superheros => {}, :powers => {}}
45
+
45
46
  data.each_pair do |name, tuples|
46
47
  table = tables[name]
47
48
  delete = Arel::DeleteManager.new Arel::Table.engine
48
49
  Arel::Table.engine.destroy delete.from(table).to_sql
50
+
49
51
  tuples.each do |tuple|
50
52
  stmt = Arel::InsertManager.new Arel::Table.engine
51
53
  values = tuple.keys.map do |key|
52
54
  [table[key], tuple[key]]
53
55
  end
54
56
  stmt.insert(values)
55
- Arel::Table.engine.create stmt.to_sql
57
+ record = Arel::Table.engine.create(stmt.to_sql)
58
+ ids[name][record[:name]] = record[:id]
56
59
  end
57
60
  end
61
+ power_map = Arel::Table.new :superheros_powers
62
+
63
+ power_sets = [
64
+ ['superman', 'flight'],
65
+ ['ironman', 'money']
66
+ ]
67
+ power_sets.each do |set|
68
+ im = Arel::InsertManager.new Arel::Table.engine
69
+ im.insert([
70
+ [power_map[:superhero_id], ids[:superheros][set[0]]],
71
+ [power_map[:power_id], ids[:powers][set[1]]]
72
+ ])
73
+ Arel::Table.engine.create im.to_sql
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.2.1
4
+ version: 0.0.3
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-23 00:00:00.000000000Z
12
+ date: 2011-12-27 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: agent-q
16
- requirement: &70360858994860 !ruby/object:Gem::Requirement
16
+ requirement: &70144475547120 !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: *70360858994860
24
+ version_requirements: *70144475547120
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: arel
27
- requirement: &70360858994420 !ruby/object:Gem::Requirement
27
+ requirement: &70144475546620 !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: *70360858994420
35
+ version_requirements: *70144475546620
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: pg
38
- requirement: &70360858994000 !ruby/object:Gem::Requirement
38
+ requirement: &70144475546020 !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: *70360858994000
46
+ version_requirements: *70144475546020
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: sqlite3
49
- requirement: &70360858993580 !ruby/object:Gem::Requirement
49
+ requirement: &70144475545200 !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: *70360858993580
57
+ version_requirements: *70144475545200
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: mysql2
60
- requirement: &70360858993160 !ruby/object:Gem::Requirement
60
+ requirement: &70144475544780 !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: *70360858993160
68
+ version_requirements: *70144475544780
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
- requirement: &70360858992740 !ruby/object:Gem::Requirement
71
+ requirement: &70144475544360 !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: *70360858992740
79
+ version_requirements: *70144475544360
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: simplecov
82
- requirement: &70360858992320 !ruby/object:Gem::Requirement
82
+ requirement: &70144475543720 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,7 +87,18 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70360858992320
90
+ version_requirements: *70144475543720
91
+ - !ruby/object:Gem::Dependency
92
+ name: timecop
93
+ requirement: &70144475543240 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *70144475543240
91
102
  description: Compatible with mysql, sqlite, and postgres
92
103
  email:
93
104
  - jacob.s.morris@gmail.com
@@ -130,6 +141,7 @@ files:
130
141
  - spec/support/config.yml
131
142
  - spec/support/resources/ironman.gif
132
143
  - spec/support/resources/megaman.jpg
144
+ - spec/support/resources/out/superman.gif
133
145
  - spec/support/resources/rails.png
134
146
  - spec/support/resources/superman.gif
135
147
  - spec/support/schemas/drop_mysql.sql
@@ -179,6 +191,7 @@ test_files:
179
191
  - spec/support/config.yml
180
192
  - spec/support/resources/ironman.gif
181
193
  - spec/support/resources/megaman.jpg
194
+ - spec/support/resources/out/superman.gif
182
195
  - spec/support/resources/rails.png
183
196
  - spec/support/resources/superman.gif
184
197
  - spec/support/schemas/drop_mysql.sql