activerecord-slave 0.0.2

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3bf6fde1390af45c8e95d55e2405f19d092127c8
4
+ data.tar.gz: f5ab29a82e819cba72cdb3f6803c1c4be457d454
5
+ SHA512:
6
+ metadata.gz: 4501a56c331b50a00083accf835dd77ece806d469a8de242f3fa52b6d1ee4ff8bcfa6e43060d4c007b5856bf3044cac0a2128e7952106b6da9adf8389ecfa732
7
+ data.tar.gz: b0433107d0c77d13215581c9d2541307b01cf06edac34682a6588c4aa38c48986392c9166b1b2ac7fb0d7f6eae09e8aa666259483d8761d9024969df3424e6d1
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ log
19
+ vendor
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --require spec_helper
2
+ --format documentation
3
+ --color
@@ -0,0 +1,56 @@
1
+ AllCops:
2
+ Exclude:
3
+ - "vendor/**/*"
4
+ DisplayCopNames: true
5
+
6
+ Style/AsciiComments:
7
+ Enabled: false
8
+
9
+ Style/BracesAroundHashParameters:
10
+ Enabled: false
11
+
12
+ Style/Documentation:
13
+ Enabled: false
14
+
15
+ Style/ExtraSpacing:
16
+ Enabled: false
17
+
18
+ Style/GuardClause:
19
+ MinBodyLength: 5
20
+
21
+ Style/MethodDefParentheses:
22
+ EnforcedStyle: require_parentheses
23
+
24
+ Style/ModuleFunction:
25
+ Enabled: false
26
+
27
+ Style/StringLiterals:
28
+ EnforcedStyle: double_quotes
29
+
30
+ Style/HashSyntax:
31
+ EnforcedStyle: ruby19_no_mixed_keys
32
+ Exclude:
33
+ - "**/*.rake"
34
+ - "Rakefile"
35
+
36
+ Metrics/LineLength:
37
+ Max: 160
38
+ Exclude:
39
+ - "db/migrate/*.rb"
40
+
41
+ NumericLiterals:
42
+ MinDigits: 7
43
+
44
+ Lint/AssignmentInCondition:
45
+ Enabled: false
46
+
47
+ Lint/BlockAlignment:
48
+ Enabled: false
49
+
50
+ Metrics/MethodLength:
51
+ Max: 12
52
+
53
+ FileName:
54
+ Exclude:
55
+ - 'lib/activerecord-slave.rb'
56
+ - 'spec/tasks/activerecord-slave_spec.rb'
@@ -0,0 +1 @@
1
+ 2.2.3
@@ -0,0 +1,31 @@
1
+ language: ruby
2
+ install: bundle install --jobs=3 --retry=3
3
+ cache:
4
+ directories:
5
+ - vendor/bundle
6
+ rvm:
7
+ - 2.2.3
8
+ - 2.1.7
9
+ - 2.0.0-p647
10
+ services:
11
+ - mysql
12
+ addons:
13
+ apt:
14
+ packages:
15
+ - libaio-dev
16
+ - libaio1
17
+ env:
18
+ - DEBIAN_FRONTEND=noninteractive PERL_MM_USE_DEFAULT=1 PERL5LIB=$HOME/perl5/lib/perl5 PATH=$HOME/bin:$HOME/perl5/bin/:$PATH
19
+ before_install:
20
+ - mkdir ~/bin
21
+ - cd ~/bin
22
+ - curl -O https://github.com/miyagawa/cpanminus/raw/master/cpanm
23
+ - curl -L https://cpanmin.us/ -o cpanm
24
+ - chmod +x cpanm
25
+ - cd -
26
+ - cpanm MySQL::Sandbox
27
+ - wget http://ftp.kaist.ac.kr/mysql/Downloads/MySQL-5.6/mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz
28
+ - make_replication_sandbox mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz
29
+ - gem install bundler -v 1.10.6
30
+ script:
31
+ - bundle exec rake spec
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in activerecord-slave.gemspec
4
+ gemspec
@@ -0,0 +1,46 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(app lib config test spec features) \
6
+ # .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
7
+
8
+ ## Note: if you are using the `directories` clause above and you are not
9
+ ## watching the project directory ('.'), then you will want to move
10
+ ## the Guardfile to a watched dir and symlink it back, e.g.
11
+ #
12
+ # $ mkdir config
13
+ # $ mv Guardfile config/
14
+ # $ ln -s config/Guardfile .
15
+ #
16
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
17
+
18
+ # Note: The cmd option is now required due to the increasing number of ways
19
+ # rspec may be run, below are examples of the most common uses.
20
+ # * bundler: 'bundle exec rspec'
21
+ # * bundler binstubs: 'bin/rspec'
22
+ # * spring: 'bin/rspec' (This will use spring if running and you have
23
+ # installed the spring binstubs per the docs)
24
+ # * zeus: 'zeus rspec' (requires the server to be started separately)
25
+ # * 'just' rspec: 'rspec'
26
+
27
+ guard :rspec, cmd: "bundle exec rspec", all_on_start: true, all_after_pass: true do
28
+ require "guard/rspec/dsl"
29
+ dsl = Guard::RSpec::Dsl.new(self)
30
+
31
+ # Feel free to open issues for suggestions and improvements
32
+
33
+ # RSpec files
34
+ rspec = dsl.rspec
35
+ watch(rspec.spec_helper) { rspec.spec_dir }
36
+ watch(rspec.spec_support) { rspec.spec_dir }
37
+ watch(rspec.spec_files)
38
+
39
+ # Ruby files
40
+ ruby = dsl.ruby
41
+ dsl.watch_spec_files_for(ruby.lib_files)
42
+
43
+ watch(%r{^spec/.+_spec\.rb$})
44
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
45
+ watch("spec/spec_helper.rb") { "spec" }
46
+ end
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 hirocaster
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,141 @@
1
+ # Activerecord::Slave
2
+
3
+ [![Build Status](https://travis-ci.org/hirocaster/activerecord-slave.svg?branch=master)](https://travis-ci.org/hirocaster/activerecord-slave) [![Coverage Status](https://coveralls.io/repos/hirocaster/activerecord-slave/badge.svg?branch=master&service=github)](https://coveralls.io/github/hirocaster/activerecord-slave?branch=master) [![Code Climate](https://codeclimate.com/github/hirocaster/activerecord-slave/badges/gpa.svg)](https://codeclimate.com/github/hirocaster/activerecord-slave) [![Dependency Status](https://gemnasium.com/hirocaster/activerecord-slave.svg)](https://gemnasium.com/hirocaster/activerecord-slave)
4
+
5
+ ActiveRecord for MySQL Replication databases(master/slave).
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'activerecord-slave'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install activerecord-slave
20
+
21
+ ## Usage
22
+
23
+ Add database connections to your application's config/database.yml:
24
+
25
+ ```yaml
26
+ default: &default
27
+ adapter: mysql2
28
+ encoding: utf8
29
+ pool: 5
30
+ database: user
31
+ username: root
32
+ password:
33
+ host: localhost
34
+
35
+ user_master:
36
+ <<: *default
37
+ host: master.db.example.com
38
+
39
+ user_slave_001:
40
+ <<: *default
41
+ host: slave_001.db.example.com
42
+
43
+ user_slave_002:
44
+ <<: *default
45
+ host: slave_002.db.example.com
46
+ ```
47
+
48
+ Add this example, your application's config/initializers/active_record_slave.rb:
49
+
50
+ ```ruby
51
+ ActiveRecord::Slave.configure do |config|
52
+ config.define_replication(:user) do |replication| # replication name
53
+ replication.register_master(:user_master) # master connection
54
+
55
+ replication.register_slave(:user_slave_001, 70) # slave connection, weight
56
+ replication.register_slave(:user_slave_002, 30)
57
+ end
58
+ end
59
+ ```
60
+
61
+ ### Model
62
+
63
+ app/model/user.rb
64
+
65
+ ```ruby
66
+ class User < ActiveRecord::Base
67
+ has_many :items
68
+ include ActiveRecord::Slave::Model
69
+ use_slave :user # replicaition name
70
+ end
71
+
72
+ class Item < ActiveRecord::Base
73
+ belongs_to :user
74
+ include ActiveRecord::Slave::Model
75
+ use_slave :user # replicaition name
76
+ end
77
+ ```
78
+
79
+ Query for master database.
80
+
81
+ ```ruby
82
+ User.all
83
+ User.find(1)
84
+ User.where(name: "foobar")
85
+ ```
86
+
87
+ Query for slave databases.
88
+
89
+ distrebute(load-balance) connection by configured weight settings.
90
+
91
+ ```ruby
92
+ User.slave_for.all
93
+ User.slave_for.find(1)
94
+ User.slave_for.where(name: "foobar")
95
+ ```
96
+
97
+ Association case. If select from slave, should use #slave_for. Not use assosiaion daynamic methods.
98
+
99
+ ```ruby
100
+ User.find(1).items # items from master database
101
+
102
+ user = User.find(1)
103
+ Item.slave_for(user_id: user.id) # items from slave databases
104
+ ```
105
+
106
+ ### Tasks
107
+
108
+ Database create/drop tasks.
109
+
110
+ ```
111
+ rake active_record:slave:db_create[replicaition] # Create database for replicaition master
112
+ rake active_record:slave:db_drop[replicaition] # Drop database for replicaition master
113
+ ```
114
+
115
+ ### Migration
116
+
117
+ You shuld write `#connection` to migration file for replication databases.
118
+
119
+ ```
120
+ class CreateUsers < ActiveRecord::Migration
121
+ def connection
122
+ User.connection
123
+ end
124
+
125
+ def change
126
+ create_table :users do |t|
127
+ t.string :name
128
+
129
+ t.timestamps null: false
130
+ end
131
+ end
132
+ end
133
+ ```
134
+
135
+ ## Contributing
136
+
137
+ 1. Fork it ( http://github.com/hirocaster/activerecord-slave/fork )
138
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
139
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
140
+ 4. Push to the branch (`git push origin my-new-feature`)
141
+ 5. Create new Pull Request
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "active_record/slave/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "activerecord-slave"
8
+ spec.version = ActiveRecord::Slave::VERSION
9
+ spec.authors = ["hirocaster"]
10
+ spec.email = ["hohtsuka@gmail.com"]
11
+ spec.summary = "MySQL Replicaition(master/slave) for ActiveRecord"
12
+ spec.description = "MySQL Replicaition(master/slave) for ActiveRecord"
13
+ spec.homepage = "https://github.com/hirocaster/activerecord-slave"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.required_ruby_version = ">= 2.0"
22
+
23
+ spec.add_dependency "activerecord", ">= 4.1.0"
24
+ spec.add_dependency "pickup"
25
+
26
+ spec.add_development_dependency "awesome_print"
27
+ spec.add_development_dependency "bundler", "~> 1.5"
28
+ spec.add_development_dependency "codeclimate-test-reporter"
29
+
30
+ spec.add_development_dependency "coveralls"
31
+ spec.add_development_dependency "database_rewinder"
32
+ spec.add_development_dependency "guard-rspec"
33
+ spec.add_development_dependency "mysql2", "~> 0.3.18"
34
+ spec.add_development_dependency "pry"
35
+ spec.add_development_dependency "pry-byebug"
36
+ spec.add_development_dependency "rake"
37
+ spec.add_development_dependency "rspec"
38
+ spec.add_development_dependency "rspec-retry"
39
+ spec.add_development_dependency "simplecov"
40
+ end
@@ -0,0 +1,20 @@
1
+ module ActiveRecord
2
+ module Slave
3
+ class Config
4
+ def initialize
5
+ @replication_configs = {}
6
+ end
7
+
8
+ def define_replication(replication_name, &block)
9
+ replication_config = ReplicationConfig.new(replication_name)
10
+ replication_config.instance_eval(&block)
11
+ replication_config.validate_config!
12
+ @replication_configs[replication_name] = replication_config
13
+ end
14
+
15
+ def fetch_replication_config(replication_name)
16
+ @replication_configs.fetch replication_name
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ module ActiveRecord
2
+ module Slave
3
+ module DatabaseTasks
4
+ extend self
5
+
6
+ def create_database(args)
7
+ configuration = database_configuration args
8
+ ActiveRecord::Tasks::DatabaseTasks.create configuration
9
+ end
10
+
11
+ def drop_database(args)
12
+ configuration = database_configuration args
13
+ ActiveRecord::Tasks::DatabaseTasks.drop configuration
14
+ end
15
+
16
+ def database_configuration(args)
17
+ replication_name = args[:replicaition]
18
+ replication_config = fetch_replication_config replication_name.to_sym
19
+ connection_name = replication_config.master_connection_name
20
+ ActiveRecord::Base.configurations[connection_name.to_s]
21
+ end
22
+
23
+ def fetch_replication_config(replication_name)
24
+ ActiveRecord::Slave.config.fetch_replication_config replication_name
25
+ rescue KeyError
26
+ raise "Not exist #{replication_name} replicaition."
27
+ end
28
+ end
29
+ end
30
+ end