brainstem 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9bf2b0cdf9ecd18e7a90f8484238fe6e7f63ad43
4
- data.tar.gz: 7be99f891a90e26715f553fcf0971931bf51c404
3
+ metadata.gz: 6284bb9b32ad35fb5e88a28ada0cb128a533dbae
4
+ data.tar.gz: 3f1624b6bde3c0703b3540b70a77566c6312bd7b
5
5
  SHA512:
6
- metadata.gz: 138e7db36bf3692bde7fac6c61777ea8695195d32769dec30555bc2d4b5124679dd8f22e08624503ba3148e64c058bcad31f72b24842f2bf864bb4291ca8e052
7
- data.tar.gz: 37760c56b41a4fbf8dbb5e19b543229c878e61fd88a7a8400f961140565b70c9b738b1882b7aeee1dc3c41e651695e02ab43ed95efd1483a80eafbdf38abf50c
6
+ metadata.gz: '06469a9fd4016afafc4c169208eecf714bfc0159ff11a1f3442eefdcfe7406a5017288f146e25f5d4bdc203705fe3b26986ac8adac1d6112e05775898c7b33d4'
7
+ data.tar.gz: 2fccd29843c5b613e288520a9897f3c0dac7a02bcaf5953bf5dfa4bdeacf876711bf3d07cc65c4f1f14dc725b389c4541a1e002dc865ebc435507521686e474a
@@ -1,5 +1,8 @@
1
1
  # Changelog
2
2
 
3
+ + **1.1.1 - _01/15/2017_
4
+ - Add `Brainstem.mysql_use_calc_found_rows` boolean config option to utilize MySQL's [FOUND_ROWS()](https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_found-rows) functionality to avoid issuing a new query to calculate the record count, which has the potential to up to double the response time of the endpoint.
5
+
3
6
  + **1.1.0 - _12/18/2017_
4
7
  - Add `meta` key to API responses which includes `page_number`, `page_count`, and `page_size` keys.
5
8
 
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- brainstem (1.1.0)
4
+ brainstem (1.1.1)
5
5
  activerecord (>= 4.1)
6
6
  activesupport (>= 4.1)
7
7
 
@@ -30,21 +30,22 @@ GEM
30
30
  i18n (0.9.1)
31
31
  concurrent-ruby (~> 1.0)
32
32
  method_source (0.9.0)
33
- minitest (5.10.3)
33
+ minitest (5.11.1)
34
+ mysql2 (0.3.18)
34
35
  pry (0.9.12.6)
35
36
  coderay (~> 1.0)
36
37
  method_source (~> 0.8)
37
38
  slop (~> 3.4)
38
39
  pry-nav (0.2.4)
39
40
  pry (>= 0.9.10, < 0.11.0)
40
- rake (12.2.1)
41
+ rake (12.3.0)
41
42
  redcarpet (3.4.0)
42
43
  rr (1.2.1)
43
44
  rspec (3.7.0)
44
45
  rspec-core (~> 3.7.0)
45
46
  rspec-expectations (~> 3.7.0)
46
47
  rspec-mocks (~> 3.7.0)
47
- rspec-core (3.7.0)
48
+ rspec-core (3.7.1)
48
49
  rspec-support (~> 3.7.0)
49
50
  rspec-expectations (3.7.0)
50
51
  diff-lcs (>= 1.2.0, < 2.0)
@@ -58,7 +59,7 @@ GEM
58
59
  thread_safe (0.3.6)
59
60
  tzinfo (1.2.4)
60
61
  thread_safe (~> 0.1)
61
- yard (0.9.9)
62
+ yard (0.9.12)
62
63
 
63
64
  PLATFORMS
64
65
  ruby
@@ -67,6 +68,7 @@ DEPENDENCIES
67
68
  brainstem!
68
69
  database_cleaner
69
70
  db-query-matchers
71
+ mysql2
70
72
  pry
71
73
  pry-nav
72
74
  rake
data/README.md CHANGED
@@ -184,6 +184,11 @@ Rails.application.config.to_prepare do
184
184
  # Set the current default API namespace.
185
185
  Brainstem.default_namespace = :v1
186
186
 
187
+ # (Optional) Utilize MySQL's [FOUND_ROWS()](https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_found-rows)
188
+ # functionality to avoid issuing a new query to calculate the record count,
189
+ # which has the potential to up to double the response time of the endpoint.
190
+ Brainstem.mysql_use_calc_found_rows = true
191
+
187
192
  # (Optional) Load a default base helper into all presenters. You could use
188
193
  # this to bring in a concept like `current_user`. # While not necessarily the
189
194
  # best approach, something like http://stackoverflow.com/a/11670283 can
@@ -27,6 +27,7 @@ Gem::Specification.new do |gem|
27
27
  gem.add_development_dependency "rr"
28
28
  gem.add_development_dependency "rspec", "~> 3.5"
29
29
  gem.add_development_dependency "sqlite3"
30
+ gem.add_development_dependency "mysql2"
30
31
  gem.add_development_dependency "database_cleaner"
31
32
  gem.add_development_dependency "yard"
32
33
  gem.add_development_dependency "pry"
@@ -21,6 +21,19 @@ module Brainstem
21
21
  @default_namespace || "none"
22
22
  end
23
23
 
24
+ # Sets {mysql_use_calc_found_rows} to a new value.
25
+ # @param [Boolean] bool
26
+ # @return [Boolean] the new mysql_use_calc_found_rows setting
27
+ def self.mysql_use_calc_found_rows=(bool)
28
+ @mysql_use_calc_found_rows = bool
29
+ end
30
+
31
+ # Whether or not to use MYSQL_CALC_FOUND_ROWS to calculate the result set count instead of issuing two queries.
32
+ # @return [Boolean] the mysql_use_calc_found_rows setting
33
+ def self.mysql_use_calc_found_rows
34
+ @mysql_use_calc_found_rows || false
35
+ end
36
+
24
37
  # @param [String] namespace
25
38
  # @return [PresenterCollection] the {PresenterCollection} for the given namespace.
26
39
  def self.presenter_collection(namespace = nil)
@@ -73,5 +86,6 @@ module Brainstem
73
86
 
74
87
  @presenter_collection = {}
75
88
  @default_namespace = nil
89
+ @mysql_use_calc_found_rows = false
76
90
  end
77
91
  end
@@ -6,6 +6,7 @@ module Brainstem
6
6
  class BaseStrategy
7
7
  def initialize(options)
8
8
  @options = options
9
+ @last_count = nil
9
10
  end
10
11
 
11
12
  def execute(scope)
@@ -13,19 +14,24 @@ module Brainstem
13
14
  end
14
15
 
15
16
  def evaluate_scope(scope)
17
+ @last_count = nil
18
+
16
19
  # Load models!
17
20
  # On complex queries, MySQL can sometimes handle 'SELECT id FROM ... ORDER BY ...' much faster than
18
21
  # 'SELECT * FROM ...', so we pluck the ids, then find those specific ids in a separate query.
19
- if(ActiveRecord::Base.connection.instance_values["config"][:adapter] =~ /mysql|sqlite/i)
20
- ids = scope.pluck("#{scope.table_name}.id")
21
- id_lookup = {}
22
- ids.each.with_index { |id, index| id_lookup[id] = index }
23
- primary_models = scope.klass.where(id: id_lookup.keys).sort_by { |model| id_lookup[model.id] }
22
+ if ActiveRecord::Base.connection.instance_values["config"][:adapter] =~ /mysql|sqlite/i
23
+ get_ids_sql(scope)
24
24
  else
25
- primary_models = scope.to_a
25
+ scope.to_a
26
26
  end
27
27
  end
28
28
 
29
+ def evaluate_count(count_scope)
30
+ ret = @last_count || count_scope.count
31
+ @last_count = nil
32
+ ret
33
+ end
34
+
29
35
  def calculate_per_page
30
36
  per_page = [(@options[:params][:per_page] || @options[:per_page] || @options[:default_per_page]).to_i, (@options[:max_per_page] || @options[:default_max_per_page]).to_i].min
31
37
  per_page = @options[:default_per_page] if per_page < 1
@@ -34,6 +40,19 @@ module Brainstem
34
40
 
35
41
  private
36
42
 
43
+ def get_ids_sql(scope)
44
+ if Brainstem.mysql_use_calc_found_rows && ActiveRecord::Base.connection.instance_values["config"][:adapter] =~ /mysql/i
45
+ ids = scope.pluck("SQL_CALC_FOUND_ROWS #{scope.table_name}.id")
46
+ @last_count = ActiveRecord::Base.connection.execute("SELECT FOUND_ROWS()").first.first
47
+ else
48
+ ids = scope.pluck("#{scope.table_name}.id")
49
+ end
50
+
51
+ id_lookup = {}
52
+ ids.each.with_index { |id, index| id_lookup[id] = index }
53
+ scope.klass.where(id: id_lookup.keys).sort_by { |model| id_lookup[model.id] }
54
+ end
55
+
37
56
  def calculate_limit
38
57
  [[@options[:params][:limit].to_i, 1].max, (@options[:max_per_page] || @options[:default_max_per_page]).to_i].min
39
58
  end
@@ -6,10 +6,11 @@ module Brainstem
6
6
  scope = @options[:primary_presenter].apply_filters_to_scope(scope, @options[:params], @options)
7
7
 
8
8
  if ordering?
9
- count = scope.count
9
+ count_scope = scope
10
10
  scope = paginate(scope)
11
11
  scope = @options[:primary_presenter].apply_ordering_to_scope(scope, @options[:params])
12
12
  primary_models = evaluate_scope(scope)
13
+ count = evaluate_count(count_scope)
13
14
  else
14
15
  filtered_ids = scope.pluck(:id)
15
16
  count = filtered_ids.size
@@ -18,18 +18,18 @@ module Brainstem
18
18
 
19
19
  if @options[:params][:only].present?
20
20
  # Handle Only
21
- scope, count = handle_only(scope, @options[:params][:only])
21
+ scope, count_scope = handle_only(scope, @options[:params][:only])
22
22
  else
23
23
  # Paginate
24
- scope, count = paginate scope
24
+ scope, count_scope = paginate scope
25
25
  end
26
26
 
27
- count = count.keys.length if count.is_a?(Hash)
28
-
29
27
  # Ordering
30
28
  scope = @options[:primary_presenter].apply_ordering_to_scope(scope, @options[:params])
31
29
 
32
30
  primary_models = evaluate_scope(scope)
31
+ count = evaluate_count(count_scope)
32
+ count = count.keys.length if count.is_a?(Hash)
33
33
  end
34
34
 
35
35
  [primary_models, count]
@@ -69,12 +69,12 @@ module Brainstem
69
69
 
70
70
  def paginate(scope)
71
71
  limit, offset = calculate_limit_and_offset
72
- [scope.limit(limit).offset(offset).distinct, scope.select("distinct #{scope.connection.quote_table_name @options[:table_name]}.id").count]
72
+ [scope.limit(limit).offset(offset).distinct, scope.select("distinct #{scope.connection.quote_table_name @options[:table_name]}.id")]
73
73
  end
74
74
 
75
75
  def handle_only(scope, only)
76
76
  ids = (only || "").split(",").select {|id| id =~ /\A\d+\z/}.uniq
77
- [scope.where(:id => ids), scope.where(:id => ids).count]
77
+ [scope.where(:id => ids), scope.where(:id => ids)]
78
78
  end
79
79
  end
80
80
  end
@@ -1,3 +1,3 @@
1
1
  module Brainstem
2
- VERSION = "1.1.0"
2
+ VERSION = "1.1.1"
3
3
  end
@@ -747,7 +747,8 @@ describe Brainstem::Presenter do
747
747
  end
748
748
 
749
749
  sql = presenter.apply_ordering_to_scope(scope, 'order' => 'title').to_sql
750
- expect(sql).to match(/order by workspaces.title desc, workspaces.id desc, "workspaces"."id" ASC/i)
750
+ # match SQLite and MySQL quotes
751
+ expect(sql).to match(/order by workspaces\.title desc, workspaces.id desc, [`"]workspaces[`"]\.[`"]id[`"] ASC/i)
751
752
  # this should be ok, since the first id sort will never have a tie
752
753
  end
753
754
 
@@ -757,7 +758,8 @@ describe Brainstem::Presenter do
757
758
  end
758
759
 
759
760
  sql = presenter.apply_ordering_to_scope(scope, 'order' => 'title').to_sql
760
- expect(sql).to match(/order by workspaces.title desc, "workspaces"."id" ASC/i)
761
+ # match SQLite and MySQL quotes
762
+ expect(sql).to match(/order by workspaces\.title desc, [`"]workspaces[`"]\.[`"]id[`"] ASC/i)
761
763
  end
762
764
  end
763
765
 
@@ -772,7 +774,8 @@ describe Brainstem::Presenter do
772
774
 
773
775
  it 'applies the named ordering in the given direction and adds the primary key as a fallback sort' do
774
776
  sql = presenter.apply_ordering_to_scope(scope, order).to_sql
775
- expect(sql).to match(/ORDER BY workspaces.title asc, "workspaces"."id" ASC/i)
777
+ # match SQLite and MySQL quotes
778
+ expect(sql).to match(/ORDER BY workspaces\.title asc, [`"]workspaces[`"]\.[`"]id[`"] ASC/i)
776
779
  end
777
780
  end
778
781
 
@@ -781,7 +784,8 @@ describe Brainstem::Presenter do
781
784
 
782
785
  it 'applies the named ordering in the given direction and adds the primary key as a fallback sort' do
783
786
  sql = presenter.apply_ordering_to_scope(scope, order).to_sql
784
- expect(sql).to match(/order by workspaces.title asc, "workspaces"."id" ASC/i)
787
+ # match SQLite and MySQL quotes
788
+ expect(sql).to match(/order by workspaces\.title asc, [`"]workspaces[`"]\.[`"]id[`"] ASC/i)
785
789
  end
786
790
  end
787
791
  end
@@ -791,7 +795,8 @@ describe Brainstem::Presenter do
791
795
 
792
796
  it 'orders by the primary key' do
793
797
  sql = presenter.apply_ordering_to_scope(scope, order).to_sql
794
- expect(sql).to match(/order by "workspaces"."id" ASC/i)
798
+ # match SQLite and MySQL quotes
799
+ expect(sql).to match(/order by [`"]workspaces[`"]\.[`"]id[`"] ASC/i)
795
800
  end
796
801
  end
797
802
 
@@ -809,7 +814,7 @@ describe Brainstem::Presenter do
809
814
 
810
815
  it 'does not add a fallback deterministic sort, and you deserve whatever fate befalls you' do
811
816
  sql = presenter.apply_ordering_to_scope(scope, order).to_sql.squish
812
- expect(sql).to eq("SELECT \"workspaces\".* FROM \"workspaces\" WHERE \"workspaces\".\"type\" IN ('Cthulhu') ORDER BY workspaces.updated_at asc")
817
+ expect(sql).to match(/SELECT [`"]workspaces[`"]\.\* FROM [`"]workspaces[`"] WHERE [`"]workspaces[`"]\.[`"]type[`"] IN \('Cthulhu'\) ORDER BY workspaces\.updated_at asc/i)
813
818
  end
814
819
  end
815
820
  end
@@ -75,6 +75,50 @@ describe Brainstem::QueryStrategies::FilterAndSearch do
75
75
  expect(results.map(&:id)).to eq(expected_paginated_ids)
76
76
  end
77
77
  end
78
+
79
+ if(ActiveRecord::Base.connection.instance_values["config"][:adapter] =~ /mysql/i)
80
+ describe 'mysql_use_calc_found_rows' do
81
+ context 'when using mysql_use_calc_found_rows' do
82
+ before do
83
+ Brainstem.mysql_use_calc_found_rows = true
84
+ expect(Brainstem.mysql_use_calc_found_rows).to eq(true)
85
+ end
86
+
87
+ after do
88
+ Brainstem.mysql_use_calc_found_rows = false
89
+ end
90
+
91
+ it 'returns the results without issuing a second query' do
92
+ expect { run_query }.
93
+ not_to make_database_queries({ count: 1, matching: "SELECT COUNT(*) FROM" })
94
+
95
+ expect { run_query }.
96
+ to make_database_queries({ count: 1, matching: "SELECT DISTINCT SQL_CALC_FOUND_ROWS cheeses.id FROM" }).
97
+ and make_database_queries({ count: 1, matching: "SELECT FOUND_ROWS()" })
98
+
99
+ _, count = run_query
100
+ expect(count).to eq(owned_by_bob.count)
101
+ end
102
+ end
103
+
104
+ context 'when not using mysql_use_calc_found_rows' do
105
+ before do
106
+ expect(Brainstem.mysql_use_calc_found_rows).to eq(false)
107
+ end
108
+
109
+ it 'returns the results by issuing a count query' do
110
+ expect { run_query }.
111
+ to make_database_queries({ count: 1, matching: "SELECT COUNT(*) FROM" })
112
+
113
+ expect { run_query }.
114
+ not_to make_database_queries({ count: 1, matching: "SELECT DISTINCT SQL_CALC_FOUND_ROWS cheeses.id FROM" })
115
+
116
+ expect { run_query }.
117
+ not_to make_database_queries({ count: 1, matching: "SELECT FOUND_ROWS()" })
118
+ end
119
+ end
120
+ end
121
+ end
78
122
  end
79
123
 
80
124
  context 'when no order is specified' do
@@ -29,19 +29,64 @@ describe Brainstem::QueryStrategies::FilterOrSearch do
29
29
  end
30
30
 
31
31
  context 'we are not searching' do
32
- let(:subject) { described_class.new(@options) }
33
-
34
- before do
35
- @options = { primary_presenter: WorkspacePresenter.new,
36
- table_name: 'workspaces',
37
- default_per_page: 20,
38
- default_max_per_page: 200,
39
- params: { } }
32
+ let(:options) do
33
+ {
34
+ primary_presenter: WorkspacePresenter.new,
35
+ table_name: 'workspaces',
36
+ default_per_page: 20,
37
+ default_max_per_page: 200,
38
+ params: {}
39
+ }
40
40
  end
41
+ let(:subject) { described_class.new(options) }
41
42
 
42
43
  it 'returns the primary models and count' do
43
44
  expect(subject.execute(Workspace.unscoped)).to eq([Workspace.unscoped.to_a, Workspace.count])
44
45
  end
46
+
47
+ if(ActiveRecord::Base.connection.instance_values["config"][:adapter] =~ /mysql/i)
48
+ describe 'mysql_use_calc_found_rows' do
49
+ context 'when using mysql_use_calc_found_rows' do
50
+ before do
51
+ Brainstem.mysql_use_calc_found_rows = true
52
+ expect(Brainstem.mysql_use_calc_found_rows).to eq(true)
53
+ end
54
+
55
+ after do
56
+ Brainstem.mysql_use_calc_found_rows = false
57
+ end
58
+
59
+ it 'returns the results without issuing a second query' do
60
+ expect { subject.execute(Workspace.unscoped) }.
61
+ not_to make_database_queries({ count: 1, matching: "SELECT COUNT(*) FROM" })
62
+
63
+ expect { subject.execute(Workspace.unscoped) }.
64
+ to make_database_queries({ count: 1, matching: "SELECT DISTINCT SQL_CALC_FOUND_ROWS workspaces.id FROM" }).
65
+ and make_database_queries({ count: 1, matching: "SELECT FOUND_ROWS()" })
66
+
67
+ _, count = subject.execute(Workspace.unscoped)
68
+ expect(count).to eq(Workspace.count)
69
+ end
70
+ end
71
+
72
+ context 'when not using mysql_use_calc_found_rows' do
73
+ before do
74
+ expect(Brainstem.mysql_use_calc_found_rows).to eq(false)
75
+ end
76
+
77
+ it 'returns the results by issuing a count query' do
78
+ expect { subject.execute(Workspace.unscoped) }.
79
+ to make_database_queries({ count: 1, matching: "SELECT COUNT(distinct `workspaces`.id) FROM" })
80
+
81
+ expect { subject.execute(Workspace.unscoped) }.
82
+ not_to make_database_queries({ count: 1, matching: "SELECT DISTINCT SQL_CALC_FOUND_ROWS workspaces.id FROM" })
83
+
84
+ expect { subject.execute(Workspace.unscoped) }.
85
+ not_to make_database_queries({ count: 1, matching: "SELECT FOUND_ROWS()" })
86
+ end
87
+ end
88
+ end
89
+ end
45
90
  end
46
91
  end
47
92
  end
@@ -12,6 +12,17 @@ describe Brainstem do
12
12
  end
13
13
  end
14
14
 
15
+ describe "mysql_use_calc_found_rows attribute" do
16
+ it "can be set and read" do
17
+ Brainstem.mysql_use_calc_found_rows = true
18
+ expect(Brainstem.mysql_use_calc_found_rows).to eq(true)
19
+ end
20
+
21
+ it "returns false if unset" do
22
+ expect(Brainstem.mysql_use_calc_found_rows).to eq(false)
23
+ end
24
+ end
25
+
15
26
  describe "presenter collection method" do
16
27
  it "returns an instance of PresenterCollection" do
17
28
  expect(Brainstem.presenter_collection).to be_a(Brainstem::PresenterCollection)
@@ -3,6 +3,52 @@ require "spec_helper"
3
3
  shared_examples_for Brainstem::QueryStrategies::BaseStrategy do
4
4
  let(:strategy) { described_class.new(options) }
5
5
 
6
+ if(ActiveRecord::Base.connection.instance_values["config"][:adapter] =~ /mysql/i)
7
+ describe 'mysql_use_calc_found_rows' do
8
+ let(:options) {{}}
9
+
10
+ context 'when using mysql_use_calc_found_rows' do
11
+ before do
12
+ Brainstem.mysql_use_calc_found_rows = true
13
+ expect(Brainstem.mysql_use_calc_found_rows).to eq(true)
14
+ end
15
+
16
+ after do
17
+ Brainstem.mysql_use_calc_found_rows = false
18
+ end
19
+
20
+ it 'returns the results without issuing a second query' do
21
+ expect { strategy.evaluate_scope(Workspace.unscoped) }.
22
+ to make_database_queries({ count: 1, matching: "SELECT SQL_CALC_FOUND_ROWS workspaces.id FROM" }).
23
+ and make_database_queries({ count: 1, matching: "SELECT FOUND_ROWS()" })
24
+
25
+ count_scope_that_should_not_be_used = Workspace.none
26
+ count_expected = Workspace.count
27
+
28
+ expect {
29
+ expect(strategy.evaluate_count(count_scope_that_should_not_be_used)).to eq(count_expected)
30
+ }.not_to make_database_queries
31
+ end
32
+ end
33
+
34
+ context 'when not using mysql_use_calc_found_rows' do
35
+ before do
36
+ expect(Brainstem.mysql_use_calc_found_rows).to eq(false)
37
+ end
38
+
39
+ it 'returns the results by issuing a count query' do
40
+ expect { strategy.evaluate_scope(Workspace.unscoped) }.
41
+ not_to make_database_queries({ count: 1, matching: "SELECT SQL_CALC_FOUND_ROWS workspaces.id FROM" })
42
+ expect { strategy.evaluate_scope(Workspace.unscoped) }.
43
+ not_to make_database_queries({ count: 1, matching: "SELECT FOUND_ROWS()" })
44
+
45
+ expect { strategy.evaluate_count(Workspace.unscoped) }.
46
+ to make_database_queries({ count: 1, matching: "SELECT COUNT(*) FROM" })
47
+ end
48
+ end
49
+ end
50
+ end
51
+
6
52
  describe "#calculate_per_page" do
7
53
  let(:result) { strategy.calculate_per_page }
8
54
 
@@ -2,7 +2,11 @@ require 'active_record'
2
2
  require 'logger'
3
3
  require 'rr'
4
4
  require 'rspec'
5
- require 'sqlite3'
5
+ if ENV['USE_MYSQL']
6
+ require 'mysql2'
7
+ else
8
+ require 'sqlite3'
9
+ end
6
10
  require 'database_cleaner'
7
11
  require 'pry'
8
12
  require 'pry-nav'
@@ -1,4 +1,9 @@
1
- ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
1
+ if ENV['USE_MYSQL']
2
+ ActiveRecord::Base.establish_connection(:adapter => 'mysql2', :database => 'test', :username => 'root', :password => '', :host => '127.0.0.1')
3
+ else
4
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
5
+ end
6
+
2
7
  ActiveRecord::Schema.define do
3
8
  self.verbose = false
4
9
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brainstem
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mavenlink
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-03 00:00:00.000000000 Z
11
+ date: 2018-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: mysql2
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: database_cleaner
113
127
  requirement: !ruby/object:Gem::Requirement