connection_manager 1.1.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e1ece73057ea47a6c1602f2add01427a2ea71f84
4
- data.tar.gz: 5315c54bb422f7d5a1108c2b24d5ed134441914b
3
+ metadata.gz: 147e706061b9694c3582c5d7afe29134b7b1fdbe
4
+ data.tar.gz: 93e2744959ed2c6fdb8b65fdd5c7a04c2535ee55
5
5
  SHA512:
6
- metadata.gz: d8be9d03eee932357726baaae1acdf0219c819385d7e7b37ae034aa5135d6f0a365f579bc983de09f8faa6b72d9eb50a532fbbfb7212167bba575b6d83012939
7
- data.tar.gz: 1ca913a938d454a87f5e2558306da6260f7c98cdca7e7aea9538bcbaeab5d98628ee6d35dfa00793846260672f6d0e2079ac561ab292c95df6e4e65cfe633507
6
+ metadata.gz: e5ca838d7a5b23faa9fdd3fac02484338b8f5a778e47427482827d4f2bddc8c2a30b09504ec8bd48ee66dc2b038592af025232751c40921c35f9d5fe464fa281
7
+ data.tar.gz: 9999b5b6365cf69d59ec15d34850453746493ceb8b926b3026b082c1a810a9371d6ee4c9e872b643ea2084a899d9acddff1a9776eae0ccca290adb563e41218d
data/.gitignore CHANGED
@@ -5,3 +5,4 @@ pkg/*
5
5
  .DS_Store
6
6
  log/*
7
7
  Gemfile.lock
8
+ .byebug_history
@@ -0,0 +1,14 @@
1
+ sudo: false
2
+ cache: bundler
3
+ language: ruby
4
+ rvm:
5
+ - 2.3.1
6
+ services:
7
+ - mysql
8
+ - postgresql
9
+
10
+ script: bundle exec rspec spec
11
+ gemfile:
12
+ - gemfiles/4.2.gemfile
13
+ - gemfiles/4.1.gemfile
14
+ - gemfiles/4.0.gemfile
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # ConnectionManager
1
+ # ConnectionManager [![Build Status](https://travis-ci.org/JoshMcKin/connection_manager.svg)](https://travis-ci.org/JoshMcKin/connection_manager)
2
2
  Improved cross-schema, replication and mutli-DMS gem for ActiveRecord.
3
3
 
4
4
  ## Features
@@ -12,7 +12,7 @@ ConnectionManager is available through [Rubygems](https://rubygems.org/gems/conn
12
12
 
13
13
  $ gem install connection_manager
14
14
 
15
- ## Rails 3/4 setup
15
+ ## Rails 4 setup
16
16
 
17
17
  Add connection_manager to you gemfile:
18
18
 
@@ -136,16 +136,15 @@ If there are multiple replication connections the system will pick a connection
136
136
  User.slaves.where('id BETWEEN ? and ?',1,100]).all => returns results from slave_2_user_data_development
137
137
 
138
138
  ### Repliation with cross-schema queries
139
- Setup replication as you would normally
139
+ Setup replication as you would normally. Then build connection classes that inherit from you base connection
140
+ classes for each of your schemas.
140
141
 
141
- Next build connection classes that inherit from you base connection classes for each of your schemas
142
- EX
143
142
  class UserSchema < ActiveRecord::Base
144
143
  self.abstract_class = true
145
- self.table_name_prefix = 'user_schema.'
144
+ self.schema_name = 'user_schema'
146
145
 
147
146
  def self.inherited(base)
148
- base.use_schema(self.schema_name)
147
+ base.schema_name = self.schema_name
149
148
  end
150
149
  end
151
150
 
@@ -155,10 +154,10 @@ EX
155
154
 
156
155
  class FooSchema < ActiveRecord::Base
157
156
  self.abstract_class = true
158
- self.table_name_prefix = 'foo.'
157
+ self.schema_name = 'foo'
159
158
 
160
159
  def self.inherited(base)
161
- base.use_schema(self.schema_name)
160
+ base.schema_name = self.schema_name
162
161
  end
163
162
  end
164
163
 
@@ -168,7 +167,7 @@ EX
168
167
 
169
168
  User.joins(:bars).limit(1).to_sql # => SELECT * FROM `user_schema`.`users` INNER JOIN `foo.bars` ON `foo.bars`.`user_id` = `user_schema`.`users` LIMIT 1"
170
169
 
171
- ## Sharding
170
+ ## Shards
172
171
 
173
172
  After tinkering with some solutions for shards, I've come to a similar conclusion as [DataFabric] (https://github.com/mperham/data_fabric):
174
173
  "Sharding should be implemented at the application level". The `shards` method is very basic and
@@ -17,10 +17,11 @@ Gem::Specification.new do |s|
17
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
- s.add_runtime_dependency 'activerecord','>= 3.0', '< 5.0'
21
- s.add_runtime_dependency 'activesupport','>= 3.0', '< 5.0'
22
- s.add_runtime_dependency 'thread_safe'
23
- s.add_development_dependency 'rspec', '~> 2.0'
20
+ s.add_runtime_dependency 'activerecord', '>= 3.0', '< 5.0'
21
+ s.add_runtime_dependency 'activesupport', '>= 3.0', '< 5.0'
22
+ s.add_runtime_dependency 'concurrent-ruby'
23
+ s.add_development_dependency 'rspec', '~> 3.0'
24
+ s.add_development_dependency 'rspec-autotest'
24
25
  s.add_development_dependency 'autotest'
25
26
  s.add_development_dependency 'mocha'
26
27
  s.add_development_dependency 'factory_girl'
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'activerecord','~> 4.0.0'
4
+ gem 'mysql2', '~> 0.3.20'
5
+
6
+ gemspec :path => "../"
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'activerecord','~> 4.1.0'
4
+ gem 'mysql2', '~> 0.3.20'
5
+
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'activerecord','~> 4.2.0'
4
+
5
+ gemspec :path => "../"
@@ -1,20 +1,19 @@
1
1
  require "connection_manager/version"
2
+ require 'concurrent'
3
+ require 'active_record'
4
+ require 'active_support'
5
+ require 'connection_manager/connection_adapters/abstract_adapter'
6
+ require 'connection_manager/core'
7
+ require 'connection_manager/connection_handling'
8
+ require 'connection_manager/relation'
9
+ require 'connection_manager/querying'
10
+ require 'connection_manager/builder'
11
+ require 'connection_manager/using'
12
+ require 'connection_manager/replication'
13
+ require 'connection_manager/shards'
14
+ require 'connection_manager/railtie' if defined?(Rails)
2
15
 
3
16
  module ConnectionManager
4
- require 'thread_safe'
5
- require 'active_record'
6
- require 'active_support'
7
- require 'connection_manager/connection_adapters/abstract_adapter'
8
- require 'connection_manager/core'
9
- require 'connection_manager/connection_handling'
10
- require 'connection_manager/relation'
11
- require 'connection_manager/querying'
12
- require 'connection_manager/builder'
13
- require 'connection_manager/using'
14
- require 'connection_manager/replication'
15
- require 'connection_manager/shards'
16
- require 'connection_manager/railtie' if defined?(Rails)
17
-
18
17
  # Get the current environment if defined
19
18
  # Check for Rails, check for RACK_ENV, default to 'development'
20
19
  def self.env
@@ -32,7 +31,7 @@ module ConnectionManager
32
31
  def self.logger
33
32
  @logger ||= ActiveRecord::Base.logger
34
33
  end
35
-
34
+
36
35
  def self.logger=logger
37
36
  @logger = logger
38
37
  end
@@ -31,23 +31,27 @@ module ConnectionManager
31
31
 
32
32
  def env_regex
33
33
  return @env_regex if @env_regex
34
- s = "#{ConnectionManager.env}$"
35
- @env_regex = Regexp.new("(#{s})")
34
+ env_str = "#{ConnectionManager.env}$"
35
+ @env_regex = Regexp.new("(#{env_str})")
36
36
  end
37
37
 
38
38
  private
39
39
  # Creates a string to be used for the class name. Removes the current env.
40
40
  def clean_yml_key(name)
41
- new_name = "#{name}".gsub(env_regex,'')
41
+ new_name = "#{name}"
42
+ new_name.gsub!(env_regex,'')
42
43
  new_name = "Base" if new_name.blank?
43
- new_name.gsub(/\_$/,'')
44
+ new_name.gsub!(/\_$/,'')
45
+ new_name
44
46
  end
45
47
 
46
48
  # Given an connection key name from the database.yml, returns the string
47
49
  # equivalent of the class name for that entry.
48
50
  def connection_class_name(name_from_yml)
49
51
  new_class_name = clean_yml_key(name_from_yml)
50
- new_class_name = new_class_name.gsub(/\_/,' ').titleize.gsub(/ /,'')
52
+ new_class_name.gsub!(/\_/,' ')
53
+ new_class_name.gsub!(/\b(?<!['’`])[a-z]/) { $&.capitalize! }
54
+ new_class_name.gsub!(/ /,'')
51
55
  new_class_name << "Connection"
52
56
  new_class_name
53
57
  end
@@ -4,20 +4,20 @@ module ConnectionManager
4
4
 
5
5
  # Determines if connection supports cross database queries
6
6
  def cross_schema_support?
7
- @cross_schema_support ||= (config[:adapter].match(/(mysql)|(postgres)|(sqlserver)/i))
7
+ @cross_schema_support ||= (config[:adapter] =~ /(mysql)|(postgres)|(sqlserver)/i)
8
8
  end
9
9
  alias :cross_database_support? :cross_schema_support?
10
10
 
11
11
  def mysql?
12
- @is_mysql ||= (config[:adapter].match(/(mysql)/i))
12
+ @is_mysql ||= (config[:adapter] =~ /(mysql)/i)
13
13
  end
14
14
 
15
15
  def postgresql?
16
- @is_postgresql ||= (config[:adapter].match(/(postgres)/i))
16
+ @is_postgresql ||= (config[:adapter] =~ /(postgres)/i)
17
17
  end
18
18
 
19
19
  def sqlserver?
20
- @is_sqlserver ||= (config[:adapter].match(/(sqlserver)/i))
20
+ @is_sqlserver ||= (config[:adapter] =~ /(sqlserver)/i)
21
21
  end
22
22
 
23
23
  def replicated?
@@ -1,13 +1,12 @@
1
- require 'thread'
2
1
  require 'active_record/relation'
3
2
  module ConnectionManager
4
3
  module ConnectionHandling
5
- @@managed_connections = ThreadSafe::Cache.new
4
+ @@managed_connections = Concurrent::Map.new
6
5
 
7
6
  # Attempts to return the schema from table_name and table_name_prefix
8
7
  def schema_name
9
- return self.table_name.split('.')[0] if self.table_name && self.table_name.match(/\./)
10
- return self.table_name_prefix.to_s.gsub(/\./,'') if self.table_name_prefix && self.table_name_prefix.match(/\./)
8
+ return self.table_name.split('.')[0] if self.table_name && self.table_name =~ /\./
9
+ return self.table_name_prefix.to_s.gsub(/\./,'') if self.table_name_prefix && self.table_name_prefix =~ /\./
11
10
  return self.connection.config[:database] if self.connection.mysql?
12
11
  end
13
12
  alias :database_name :schema_name
@@ -21,7 +20,7 @@ module ConnectionManager
21
20
  # User.table_name_prefix # => 'users_db.'
22
21
  # User.table_name # => 'users_db.users'
23
22
  def schema_name=schema_name
24
- self.table_name_prefix = "#{schema_name}." if schema_name && schema_name.to_s != ""
23
+ self.table_name_prefix = "#{schema_name}." if schema_name && !schema_name.blank?
25
24
  self.table_name = "#{self.table_name_prefix}#{self.table_name}" unless self.abstract_class?
26
25
  end
27
26
  alias :database_name= :schema_name=
@@ -83,9 +82,5 @@ module ConnectionManager
83
82
  end
84
83
  end
85
84
  end
86
- if ActiveRecord::VERSION::MAJOR == 4
87
- ActiveRecord::ConnectionHandling.send(:include, ConnectionManager::ConnectionHandling)
88
- else
89
- require 'active_record/base'
90
- ActiveRecord::Base.extend(ConnectionManager::ConnectionHandling)
91
- end
85
+ ActiveRecord::ConnectionHandling.send(:include, ConnectionManager::ConnectionHandling)
86
+
@@ -17,8 +17,4 @@ module ConnectionManager
17
17
  end
18
18
  end
19
19
  end
20
- if ActiveRecord::VERSION::MAJOR == 4
21
- ActiveRecord::Core::ClassMethods.send(:include,ConnectionManager::Core)
22
- else
23
- ActiveRecord::Base.extend ConnectionManager::Core
24
- end
20
+ ActiveRecord::Core::ClassMethods.send(:include,ConnectionManager::Core)
@@ -1,13 +1,9 @@
1
1
  require 'active_support/core_ext/module/delegation'
2
2
  module ConnectionManager
3
3
  module Querying
4
- delegate :using, :to => (ActiveRecord::VERSION::MAJOR == 4 ? :all : :scoped)
5
- delegate :slaves, :to => (ActiveRecord::VERSION::MAJOR == 4 ? :all : :scoped)
6
- delegate :masters, :to => (ActiveRecord::VERSION::MAJOR == 4 ? :all : :scoped)
4
+ delegate :using, :to => :all
5
+ delegate :slaves, :to => :all
6
+ delegate :masters, :to => :all
7
7
  end
8
8
  end
9
- if ActiveRecord::VERSION::MAJOR == 4
10
- ActiveRecord::Querying.send(:include, ConnectionManager::Querying)
11
- else
12
- ActiveRecord::Base.send(:extend, ConnectionManager::Querying)
13
- end
9
+ ActiveRecord::Querying.send(:include, ConnectionManager::Querying)
@@ -1,7 +1,6 @@
1
1
  module ConnectionManager
2
2
  class Railtie < ::Rails::Railtie
3
3
  initializer "connection_manager.build_connection_classes" do
4
- require 'connection_manager/connection_adapters/mysql_adapter' if (ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR <= 1 && (defined?(Mysql2::VERSION) || defined?(Mysql2::VERSION)))
5
4
  ConnectionManager.env = Rails.env
6
5
  ConnectionManager.logger = Rails.logger
7
6
  ConnectionManager::Builder.build_connection_classes(Rails.application.config.database_configuration.select{ |k,v| v['build_connection_class'] && k.match(ConnectionManager::Builder.env_regex)}.keys)
@@ -1,20 +1,17 @@
1
1
  module ConnectionManager
2
2
  module Replication
3
- attr_accessor :replication_connections
3
+
4
4
  # Replication methods (replication_method_name, which is the option[:name] for the
5
5
  # #replication method) and all their associated connections. The key is the
6
6
  # replication_method_name and the value is an array of all the replication_classes
7
7
  # the replication_method has access to.
8
8
  #
9
9
  # EX: replication_methods[:slaves] => ['Slave1Connection',Slave2Connection]
10
- def replication_connections
11
- @replication_connections ||= {:slaves => [], :masters => []}
12
- end
13
-
10
+ attr_accessor :replication_connections
14
11
 
15
12
  # Is this class replicated
16
13
  def replicated?
17
- (@replication_connections && (!replication_connections[:slaves].empty? || !replication_connections[:masters].empty?))
14
+ defined?(@replication_connections)
18
15
  end
19
16
 
20
17
  # Builds a class method that returns an ActiveRecord::Relation for use with
@@ -30,9 +27,13 @@ module ConnectionManager
30
27
  # * :name - name of class method to call to access replication, default to slaves
31
28
  # * :type - the type of replication; :slaves or :masters, defaults to :slaves
32
29
  def replicated(*connections)
33
- options = {:slaves => [], :masters => [], :type => :slaves}.merge(connections.extract_options!.symbolize_keys)
34
- options[options[:type]] = connections unless connections.empty?
35
- set_replications_connections(options)
30
+ opts = connections.extract_options!
31
+ opts.symbolize_keys!
32
+ opts[:slaves] ||= []
33
+ opts[:masters] ||= []
34
+ opts[:type] ||= :slaves
35
+ opts[opts[:type]] = connections unless connections.empty?
36
+ set_replications_connections(opts)
36
37
  end
37
38
 
38
39
  def fetch_slave_connection
@@ -50,10 +51,11 @@ module ConnectionManager
50
51
  # connections we use sample to get a random connection instead of blocking
51
52
  # to rotate the pool on every fetch.
52
53
  def fetch_replication_connection(method_name)
53
- set_replications_connections(self.replication_connections) unless self.replicated?
54
- available_connections = self.replication_connections[method_name] || []
55
- raise ArgumentError, "No connections found for #{method_name}." if available_connections.blank?
56
- available_connections.sample
54
+ if @replication_connections && available_connections = @replication_connections[method_name]
55
+ available_connections.sample
56
+ else
57
+ raise ArgumentError, "Replication connections could not be found for #{method_name}."
58
+ end
57
59
  end
58
60
 
59
61
  # Builds replication connection classes and methods
@@ -61,21 +63,22 @@ module ConnectionManager
61
63
  [:masters,:slaves].each do |type|
62
64
  cons = (options[type].empty? ? connection.replications[type] : options[type])
63
65
  unless cons.empty?
64
- self.replication_connections[type] = []
66
+ @replication_connections ||= {}
65
67
  cons.each do |to_use|
66
- self.replication_connections[type] << fetch_connection_class_name(to_use)
68
+ @replication_connections[type] ||= []
69
+ @replication_connections[type] << fetch_connection_class_name(to_use)
67
70
  end
68
71
  end
69
72
  end
70
- raise ArgumentError, "Connections could not be found for #{self.name}." if self.replication_connections[:masters].empty? && self.replication_connections[:slaves].empty?
71
- self.replication_connections
73
+ raise ArgumentError, "Connection class could not be found for #{self.name}." unless (replicated? && (@replication_connections[:masters] || @replication_connections[:slaves]))
74
+ @replication_connections
72
75
  end
73
76
 
74
77
  def fetch_connection_class_name(to_use)
75
- connection_class_name = to_use
76
- connection_class_name = fetch_connection_class_name_from_yml_key(connection_class_name) if connection_class_name.to_s.match(/_/)
77
- raise ArgumentError, "For #{self.name}, the class #{connection_class_name} could not be found." if connection_class_name.blank?
78
- connection_class_name
78
+ conn_class_name = to_use
79
+ conn_class_name = fetch_connection_class_name_from_yml_key(conn_class_name) if conn_class_name.to_s =~ /_/
80
+ raise ArgumentError, "For #{self.name}, the class #{conn_class_name} could not be found." if conn_class_name.blank?
81
+ conn_class_name
79
82
  end
80
83
 
81
84
  def fetch_connection_class_name_from_yml_key(yml_key)
@@ -1,16 +1,16 @@
1
1
  module ConnectionManager
2
- module Shards
2
+ module Shards
3
3
  @shard_class_names = []
4
-
4
+
5
5
  def shard_class_names(*shard_class_names)
6
6
  @shard_class_names = shard_class_names
7
- end
8
-
7
+ end
8
+
9
9
  # Takes a block that is call on all available shards.
10
10
  def shards(*opts,&shards_block)
11
11
  opts = {:include_self => true}.merge(opts.extract_options!)
12
12
  raise ArgumentError, "shard_class_names have not been defined for #{self.class.name}" if @shard_class_names.length == 0
13
- if block_given?
13
+ if block_given?
14
14
  results = []
15
15
  @shard_class_names.each do |s|
16
16
  results << shards_block.call(s.constantize)
@@ -23,4 +23,4 @@ module ConnectionManager
23
23
  end
24
24
  end
25
25
  end
26
- ActiveRecord::Base.extend(ConnectionManager::Shards)
26
+ ActiveRecord::Base.extend(ConnectionManager::Shards)
@@ -1,3 +1,4 @@
1
+ require 'active_record/querying.rb'
1
2
  module ConnectionManager
2
3
  module Using
3
4
  module ClassMethods
@@ -16,7 +17,10 @@ module ConnectionManager
16
17
  super(compare)
17
18
  end
18
19
  end
20
+
19
21
  class Proxy
22
+ include ActiveRecord::Querying
23
+
20
24
  attr_accessor :klass, :connection_class
21
25
 
22
26
  def initialize(klass,connection_class)
@@ -63,61 +67,6 @@ module ConnectionManager
63
67
  @klass.parent
64
68
  end
65
69
 
66
- if ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 0
67
- # Rails 3.0
68
- def find_by_sql(sql)
69
- connection.select_all(sanitize_sql(sql), "#{name} Load").collect! { |record| instantiate(record) }
70
- end
71
-
72
- elsif ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 1
73
- # Rails 3.1
74
- def find_by_sql(sql, binds = [])
75
- connection.select_all(sanitize_sql(sql), "#{name} Load", binds).collect! { |record| instantiate(record) }
76
- end
77
-
78
- elsif ActiveRecord::VERSION::MAJOR == 3
79
- # Rails 3.2
80
- def find_by_sql(sql, binds = [])
81
- logging_query_plan do
82
- connection.select_all(sanitize_sql(sql), "#{name} Load", binds).collect! { |record| instantiate(record) }
83
- end
84
- end
85
-
86
- elsif ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR <= 1
87
- #Rails 4.0 & 4.1
88
- def find_by_sql(sql, binds = [])
89
- result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds)
90
- column_types = {}
91
- if result_set.respond_to? :column_types
92
- column_types = result_set.column_types
93
- else
94
- ActiveSupport::Deprecation.warn "the object returned from `select_all` must respond to `column_types`"
95
- end
96
- result_set.map { |record| instantiate(record, column_types) }
97
- end
98
-
99
- else
100
- # Edge Rails
101
- def find_by_sql(sql, binds = [])
102
- result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds)
103
- column_types = result_set.column_types.dup
104
- columns_hash.each_key { |k| column_types.delete k }
105
- message_bus = ActiveSupport::Notifications.instrumenter
106
- payload = {
107
- record_count: result_set.length,
108
- class_name: name
109
- }
110
- message_bus.instrument('instantiation.active_record', payload) do
111
- result_set.map { |record| instantiate(record, column_types) }
112
- end
113
- end
114
- end
115
-
116
- def count_by_sql(sql)
117
- sql = sanitize_conditions(sql)
118
- connection.select_value(sql, "#{name} Count").to_i
119
- end
120
-
121
70
  # Pass all methods to @klass, this ensures objects
122
71
  # build from the query are the correct class and
123
72
  # any settings in the model like table_name_prefix
@@ -1,3 +1,3 @@
1
1
  module ConnectionManager
2
- VERSION = "1.1.5"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -64,7 +64,6 @@ class TestMigrations < ActiveRecord::Migration
64
64
  create_table "cm_test.fruits" do |t|
65
65
  t.string :name
66
66
  t.integer :region_id
67
- t.timestamps
68
67
  end
69
68
  rescue => e
70
69
  puts "tables failed to create: #{e}"
@@ -72,7 +71,6 @@ class TestMigrations < ActiveRecord::Migration
72
71
  begin
73
72
  create_table "cm_test.baskets" do |t|
74
73
  t.string :name
75
- t.timestamps
76
74
  end
77
75
  rescue => e
78
76
  puts "tables failed to create: #{e}"
@@ -81,7 +79,6 @@ class TestMigrations < ActiveRecord::Migration
81
79
  create_table "cm_test.fruit_baskets" do |t|
82
80
  t.integer :fruit_id
83
81
  t.integer :basket_id
84
- t.timestamps
85
82
  end
86
83
  rescue => e
87
84
  puts "tables failed to create: #{e}"
@@ -90,7 +87,6 @@ class TestMigrations < ActiveRecord::Migration
90
87
  create_table "cm_test.regions" do |t|
91
88
  t.string :name
92
89
  t.integer :type_id
93
- t.timestamps
94
90
  end
95
91
  rescue => e
96
92
  puts "tables failed to create: #{e}"
@@ -98,7 +94,6 @@ class TestMigrations < ActiveRecord::Migration
98
94
  begin
99
95
  create_table "cm_test.types" do |t|
100
96
  t.string :name
101
- t.timestamps
102
97
  end
103
98
  rescue => e
104
99
  puts "tables failed to create: #{e}"
@@ -117,7 +112,6 @@ class TestMigrations < ActiveRecord::Migration
117
112
  begin
118
113
  create_table "cm_user_test.types" do |t|
119
114
  t.string :name
120
- t.timestamps
121
115
  end
122
116
  rescue => e
123
117
  puts "tables failed to create: #{e}"
@@ -18,14 +18,14 @@ describe ConnectionManager::Builder do
18
18
  ConnectionManager::Builder.build_connection_class("MyConnectionClass", :test)
19
19
  end
20
20
  it "should add a class with supplied class name to ConnectionManager::Builder" do
21
- expect(defined?(MyConnectionClass)).to be_true
21
+ expect(defined?(MyConnectionClass)).to eql("constant")
22
22
  expect(MyConnectionClass).to be_a(Class)
23
23
  end
24
24
  it "should have a super class of ActiveRecord::Base" do
25
25
  expect(MyConnectionClass.superclass).to eql(ActiveRecord::Base)
26
26
  end
27
27
  it "should be an abstract class" do
28
- expect(MyConnectionClass.abstract_class?).to be_true
28
+ expect(MyConnectionClass.abstract_class?).to eql(true)
29
29
  end
30
30
  end
31
31
  end
@@ -11,15 +11,15 @@ describe ConnectionManager::AbstractAdapter do
11
11
  describe '#cross_schema_support?' do
12
12
  it "should be true for Mysql" do
13
13
  @con.stubs(:config).returns({:adapter => 'mysql'})
14
- expect(@con.cross_schema_support?).to be_true
14
+ expect(@con).to be_cross_schema_support
15
15
  end
16
16
  it "should be true for Postgres" do
17
17
  @con.stubs(:config).returns({:adapter => 'postgresql'})
18
- expect(@con.cross_schema_support?).to be_true
18
+ expect(@con).to be_cross_schema_support
19
19
  end
20
20
  it "should be true for SQL server" do
21
21
  @con.stubs(:config).returns({:adapter => 'sqlserver'})
22
- expect(@con.cross_schema_support?).to be_true
22
+ expect(@con).to be_cross_schema_support
23
23
  end
24
24
  end
25
25
 
@@ -4,10 +4,10 @@ require 'spec_helper'
4
4
  describe ActiveRecord::Base do
5
5
  describe '#table_exists?' do
6
6
  it "should return true for unquoted full_names" do
7
- expect(Fruit.connection.table_exists?('cm_test.fruits')).to be_true
7
+ expect(Fruit.connection.table_exists?('cm_test.fruits')).to eql(true)
8
8
  end
9
9
  it "should return true for table only names" do
10
- expect(Fruit.connection.table_exists?('fruits')).to be_true
10
+ expect(Fruit.connection.table_exists?('fruits')).to eql(true)
11
11
  end
12
12
  end
13
13
  end
@@ -47,18 +47,18 @@ describe ConnectionManager::ConnectionHandling do
47
47
 
48
48
  describe '#establish_connection' do
49
49
  it "should register class as connection class" do
50
- expect(ActiveRecord::Base.managed_connection_classes.include?("MyConnectionClass")).to be_true
50
+ expect(ActiveRecord::Base.managed_connection_classes.include?("MyConnectionClass")).to eql(true)
51
51
  end
52
52
  end
53
53
 
54
54
  describe '#establish_managed_connection' do
55
55
  context 'the connection class' do
56
56
  it "should create abstract class" do
57
- expect(MyManagedConnectionClass.abstract_class).to be_true
57
+ expect(MyManagedConnectionClass.abstract_class).to eql(true)
58
58
  end
59
59
 
60
60
  it "should check in the connection" do
61
- expect(ActiveRecord::Base.managed_connection_classes.include?("MyManagedConnectionClass")).to be_true
61
+ expect(ActiveRecord::Base.managed_connection_classes.include?("MyManagedConnectionClass")).to eql(true)
62
62
  end
63
63
  end
64
64
  end
@@ -9,14 +9,14 @@ describe ActiveRecord::Base do
9
9
 
10
10
  describe '#joins' do
11
11
  it "should work" do
12
- @user.foos.blank?.should be_false
12
+ @user.foos.blank?.should eql(false)
13
13
  found = Foo.joins(:cm_user).select('cm_users.name AS user_name').where('cm_users.id = ?',@user.id).first
14
14
  expect(found.user_name).to_not be_blank
15
15
  end
16
16
  end
17
17
  describe '#includes' do
18
18
  before(:each) do
19
- @user.foos.blank?.should be_false
19
+ @user.foos.blank?.should eql(false)
20
20
  search = Foo.includes(:cm_user).where('cm_users.id = ?',@user.id)
21
21
  search = search.references(:cm_user) if search.respond_to?(:references)
22
22
  @found = search.first
@@ -12,7 +12,7 @@ describe ConnectionManager::Replication do
12
12
  ActiveRecord::Base.stubs(:replication_connections).returns({:masters => [], :slaves => []})
13
13
  ActiveRecord::ConnectionAdapters::AbstractAdapter.any_instance.stubs(:slave_keys).returns([])
14
14
  ActiveRecord::ConnectionAdapters::AbstractAdapter.any_instance.stubs(:master_keys).returns([])
15
- expect(lambda { Fruit.replicated }).to raise_error
15
+ expect(lambda { Fruit.replicated }).to raise_error(ArgumentError)
16
16
  end
17
17
 
18
18
  it "should not raise an exception if no connections are empty, but connection.replication_keys are not blank" do
@@ -17,7 +17,7 @@ describe ConnectionManager::Shards do
17
17
  a = Fruit.shards do |shard|
18
18
  shard.where(:id => fruit.id).first
19
19
  end
20
- expect(klasses.include?(a[0].class.name)).to be_true
20
+ expect(klasses.include?(a[0].class.name)).to eql(true)
21
21
  end
22
22
 
23
23
 
@@ -34,7 +34,7 @@ describe ConnectionManager::Shards do
34
34
  cfruit = Fruit.shards do |shard|
35
35
  shard.where('id = ?', fruit.id).first
36
36
  end
37
- expect((afruit == bfruit && bfruit == cfruit)).to be_true
37
+ expect((afruit == bfruit && bfruit == cfruit)).to eql(true)
38
38
  end
39
39
  end
40
40
  end
@@ -43,7 +43,7 @@ describe ConnectionManager::Using do
43
43
  context 'A shard like connection' do
44
44
  it "should use other connection" do
45
45
  fruit = FactoryGirl.create(:fruit)
46
- expect(Fruit.using("OtherConnection").where(:name => fruit.name).exists?).to be_false
46
+ expect(Fruit.using("OtherConnection").where(:name => fruit.name).exists?).to eql(false)
47
47
  end
48
48
  end
49
49
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: connection_manager
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.5
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Mckinney
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-05 00:00:00.000000000 Z
11
+ date: 2016-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -51,7 +51,7 @@ dependencies:
51
51
  - !ruby/object:Gem::Version
52
52
  version: '5.0'
53
53
  - !ruby/object:Gem::Dependency
54
- name: thread_safe
54
+ name: concurrent-ruby
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
57
  - - ">="
@@ -70,14 +70,28 @@ dependencies:
70
70
  requirements:
71
71
  - - "~>"
72
72
  - !ruby/object:Gem::Version
73
- version: '2.0'
73
+ version: '3.0'
74
74
  type: :development
75
75
  prerelease: false
76
76
  version_requirements: !ruby/object:Gem::Requirement
77
77
  requirements:
78
78
  - - "~>"
79
79
  - !ruby/object:Gem::Version
80
- version: '2.0'
80
+ version: '3.0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: rspec-autotest
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
81
95
  - !ruby/object:Gem::Dependency
82
96
  name: autotest
83
97
  requirement: !ruby/object:Gem::Requirement
@@ -158,16 +172,19 @@ extra_rdoc_files: []
158
172
  files:
159
173
  - ".gitignore"
160
174
  - ".rspec"
175
+ - ".travis.yml"
161
176
  - CHANGE.md
162
177
  - Gemfile
163
178
  - LICENSE.txt
164
179
  - README.md
165
180
  - Rakefile
166
181
  - connection_manager.gemspec
182
+ - gemfiles/4.0.gemfile
183
+ - gemfiles/4.1.gemfile
184
+ - gemfiles/4.2.gemfile
167
185
  - lib/connection_manager.rb
168
186
  - lib/connection_manager/builder.rb
169
187
  - lib/connection_manager/connection_adapters/abstract_adapter.rb
170
- - lib/connection_manager/connection_adapters/mysql_adapter.rb
171
188
  - lib/connection_manager/connection_handling.rb
172
189
  - lib/connection_manager/core.rb
173
190
  - lib/connection_manager/querying.rb
@@ -1,39 +0,0 @@
1
- module ConnectionManager
2
- module MysqlAdapter
3
-
4
- # Force all tables to be cached for the life connection
5
- def cached_tables
6
- @cached_tables ||= {}
7
- end
8
-
9
- def new_tables(name = nil, database = nil, like =nil)
10
- return cached_tables[database] if cached_tables[database] && like.nil?
11
- cached_tables[database] ||= []
12
- return [like] if like && cached_tables[database].include?(like)
13
- sql = "SHOW TABLES "
14
- sql << "IN #{database} " if database
15
- sql << "LIKE #{quote(like)}" if like
16
- result = execute(sql, 'SCHEMA')
17
- cached_tables[database] = (cached_tables[database] | result.collect { |field| field[0] }).compact
18
- end
19
- alias :tables :new_tables
20
-
21
-
22
- # We have to clean the name of '`' and fetch table name with schema
23
- def table_exists?(name)
24
- return false unless name
25
- name = name.to_s
26
- schema, table = name.split('.', 2)
27
- unless table # A table was provided without a schema
28
- table = schema
29
- schema = nil
30
- end
31
- new_tables(nil, schema, table).include?(table)
32
- end
33
- end
34
- end
35
- if ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR <= 1
36
- require 'active_record/connection_adapters/mysql2_adapter'
37
- ActiveRecord::ConnectionAdapters::MysqlAdapter.send(:include,(ConnectionManager::MysqlAdapter)) if defined?(ActiveRecord::ConnectionAdapters::MysqlAdapter)
38
- ActiveRecord::ConnectionAdapters::Mysql2Adapter.send(:include,(ConnectionManager::MysqlAdapter))
39
- end