secondbase 0.6.0 → 1.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.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +16 -0
  4. data/.yardopts +1 -0
  5. data/Appraisals +12 -0
  6. data/CHANGELOG.md +18 -6
  7. data/Gemfile +3 -12
  8. data/Guardfile +16 -0
  9. data/LICENSE.txt +2 -1
  10. data/README.md +144 -0
  11. data/Rakefile +18 -41
  12. data/VERSION +1 -1
  13. data/gemfiles/rails40.gemfile +8 -0
  14. data/gemfiles/rails41.gemfile +8 -0
  15. data/gemfiles/rails42.gemfile +8 -0
  16. data/lib/rails/second_base/generators/migration_generator.rb +25 -0
  17. data/lib/second_base.rb +20 -0
  18. data/lib/second_base/base.rb +8 -0
  19. data/lib/second_base/databases.rake +127 -0
  20. data/lib/second_base/forced.rb +21 -0
  21. data/lib/second_base/on_base.rb +36 -0
  22. data/lib/second_base/railtie.rb +40 -0
  23. data/lib/second_base/test_help.rb +11 -0
  24. data/lib/second_base/version.rb +3 -0
  25. data/lib/secondbase.rb +1 -46
  26. data/secondbase.gemspec +25 -75
  27. data/test/cases/dbtask_test.rb +225 -0
  28. data/test/cases/forced_test.rb +49 -0
  29. data/test/cases/generator_test.rb +41 -0
  30. data/test/cases/on_base_test.rb +35 -0
  31. data/test/cases/railtie_test.rb +31 -0
  32. data/test/dummy_app/Rakefile +2 -0
  33. data/test/dummy_app/app/controllers/application_controller.rb +7 -0
  34. data/test/dummy_app/app/helpers/application_helper.rb +3 -0
  35. data/test/dummy_app/app/models/comment.rb +6 -0
  36. data/test/dummy_app/app/models/comment_forced.rb +6 -0
  37. data/test/dummy_app/app/models/post.rb +7 -0
  38. data/test/dummy_app/app/models/user.rb +6 -0
  39. data/test/dummy_app/bin/rails +5 -0
  40. data/test/dummy_app/config/database.yml +14 -0
  41. data/test/dummy_app/config/routes.rb +3 -0
  42. data/test/dummy_app/db/migrate/20141209165002_create_users.rb +11 -0
  43. data/test/dummy_app/db/migrate/20141214142700_create_posts.rb +12 -0
  44. data/test/dummy_app/db/secondbase/migrate/20151202075826_create_comments.rb +11 -0
  45. data/test/dummy_app/init.rb +40 -0
  46. data/test/dummy_app/log/.keep +0 -0
  47. data/test/dummy_app/tmp/.keep +0 -0
  48. data/test/test_helper.rb +36 -0
  49. data/test/test_helpers/dummy_app_helpers.rb +90 -0
  50. data/test/test_helpers/rails_version_helpers.rb +29 -0
  51. data/test/test_helpers/stream_helpers.rb +40 -0
  52. metadata +220 -139
  53. data/.document +0 -5
  54. data/Gemfile.lock +0 -38
  55. data/README.rdoc +0 -143
  56. data/lib/generators/secondbase/USAGE +0 -19
  57. data/lib/generators/secondbase/migration_generator.rb +0 -36
  58. data/lib/generators/secondbase/templates/migration.rb +0 -13
  59. data/lib/secondbase/active_record/associations/has_and_belongs_to_many_association.rb +0 -66
  60. data/lib/secondbase/active_record/base.rb +0 -13
  61. data/lib/secondbase/active_record/fixtures.rb +0 -66
  62. data/lib/secondbase/active_record/patches.rb +0 -13
  63. data/lib/secondbase/active_record/test_fixtures.rb +0 -32
  64. data/lib/secondbase/model.rb +0 -11
  65. data/lib/secondbase/railtie.rb +0 -10
  66. data/lib/secondbase/rake_method_chain.rb +0 -22
  67. data/lib/secondbase/tasks.rb +0 -219
  68. data/rails_generators/secondbase/USAGE +0 -29
  69. data/rails_generators/secondbase/secondbase_migration_generator.rb +0 -20
  70. data/rails_generators/secondbase/templates/migration.rb +0 -15
  71. data/test/helper.rb +0 -18
  72. data/test/test_secondbase.rb +0 -7
@@ -1,11 +0,0 @@
1
- # Secondbase model definition
2
- #
3
- # NOTE: By extending this model, you assume that the underlying table will be located in your Second (Data)base
4
- module SecondBase
5
-
6
- class Base < ActiveRecord::Base
7
- establish_connection ActiveRecord::Base.configurations[SecondBase::CONNECTION_PREFIX][Rails.env]
8
-
9
- self.abstract_class = true
10
- end
11
- end
@@ -1,10 +0,0 @@
1
- require 'secondbase'
2
- require 'rails'
3
- module SecondBase
4
- class Railtie < Rails::Railtie
5
-
6
- rake_tasks do
7
- load "secondbase/tasks.rb"
8
- end
9
- end
10
- end
@@ -1,22 +0,0 @@
1
- require 'rake'
2
-
3
- # We want to provide a way to alias tasks so we can hook our custom logic
4
- # into the existing rails framework. For more information and usage, see:
5
- # http://www.metaskills.net/2010/5/26/the-alias_method_chain-of-rake-override-rake-task
6
- Rake::TaskManager.class_eval do
7
- def alias_task(fq_name)
8
- new_name = "#{fq_name}:original"
9
- @tasks[new_name] = @tasks.delete(fq_name)
10
- end
11
- end
12
-
13
- def alias_task(fq_name)
14
- Rake.application.alias_task(fq_name)
15
- end
16
-
17
- def override_task(*args, &block)
18
- name, params, deps = Rake.application.resolve_args(args.dup)
19
- fq_name = Rake.application.instance_variable_get(:@scope).dup.push(name).join(':')
20
- alias_task(fq_name)
21
- Rake::Task.define_task(*args, &block)
22
- end
@@ -1,219 +0,0 @@
1
- require 'secondbase'
2
-
3
- ####################################
4
- #
5
- # SecondBase database managment tasks
6
- #
7
- # We are overriding a handful of rake tasks here:
8
- # db:create
9
- # db:migrate
10
- # db:test:prepare
11
- #
12
- # We ARE NOT redefining the implementation of these tasks, we are simply
13
- # appending custom functionality to them. We just want to be sure that in
14
- # addition to creating, migrating, and preparing your default (Rails.env)
15
- # database, that we can also work with with the second (data)base.
16
-
17
- namespace :db do
18
- override_task :create do
19
- # First, we execute the original/default create task
20
- Rake::Task["db:create:original"].invoke
21
-
22
- # now, we create our secondary databases
23
- Rake::Task['environment'].invoke
24
- ActiveRecord::Base.configurations[SecondBase::CONNECTION_PREFIX].each_value do |config|
25
- next unless config['database']
26
-
27
- # Only connect to local databases
28
- local_database?(config) { create_database(config) }
29
- end
30
- end
31
-
32
- override_task :migrate do
33
- Rake::Task['environment'].invoke
34
-
35
- # Migrate secondbase...
36
- Rake::Task["db:migrate:secondbase"].invoke
37
-
38
- # Execute the original/default prepare task
39
- Rake::Task["db:migrate:original"].invoke
40
- end
41
-
42
- override_task :abort_if_pending_migrations do
43
- # Execute the original/default prepare task
44
- Rake::Task["db:abort_if_pending_migrations"].invoke
45
-
46
- Rake::Task["db:abort_if_pending_migrations:secondbase"].invoke
47
- end
48
-
49
- namespace :test do
50
- override_task :prepare do
51
- Rake::Task['environment'].invoke
52
-
53
- # Clone the secondary database structure
54
- Rake::Task["db:test:prepare:secondbase"].invoke
55
-
56
- # Execute the original/default prepare task
57
- Rake::Task["db:test:prepare:original"].invoke
58
- end
59
- end
60
-
61
- ##################################
62
- # SecondBase specific database tasks
63
- namespace :abort_if_pending_migrations do
64
- desc "determines if your secondbase has pending migrations"
65
- task :secondbase => :environment do
66
- # reset connection to secondbase...
67
- SecondBase::has_runner(Rails.env)
68
-
69
- pending_migrations = ActiveRecord::Migrator.new(:up, "db/migrate/#{SecondBase::CONNECTION_PREFIX}").pending_migrations
70
-
71
- if pending_migrations.any?
72
- puts "You have #{pending_migrations.size} pending migrations:"
73
- pending_migrations.each do |pending_migration|
74
- puts ' %4d %s' % [pending_migration.version, pending_migration.name]
75
- end
76
- abort %{Run "rake db:migrate" to update your database then try again.}
77
- end
78
-
79
- # reset connection back to firstbase...
80
- FirstBase::has_runner(Rails.env)
81
- end
82
- end
83
-
84
- namespace :migrate do
85
- desc "migrates the second database"
86
- task :secondbase => :load_config do
87
- Rake::Task['environment'].invoke
88
- # NOTE: We are not generating a db schema on purpose. Since we're running
89
- # in a dual db mode, it could be confusing to have two schemas.
90
-
91
- # reset connection to secondbase...
92
- SecondBase::has_runner(Rails.env)
93
-
94
- # run secondbase migrations...
95
- ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
96
- ActiveRecord::Migrator.migrate("db/migrate/#{SecondBase::CONNECTION_PREFIX}/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
97
-
98
- # reset connection back to firstbase...
99
- FirstBase::has_runner(Rails.env)
100
- end
101
-
102
- namespace :up do
103
- desc 'Runs the "up" for a given SecondBase migration VERSION.'
104
- task :secondbase => :environment do
105
- version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
106
- raise "VERSION is required" unless version
107
-
108
- # reset connection to secondbase...
109
- SecondBase::has_runner(Rails.env)
110
-
111
- ActiveRecord::Migrator.run(:up, "db/migrate/#{SecondBase::CONNECTION_PREFIX}/", version)
112
-
113
- # reset connection back to firstbase...
114
- FirstBase::has_runner(Rails.env)
115
- end
116
- end
117
-
118
- namespace :down do
119
- desc 'Runs the "down" for a given SecondBase migration VERSION.'
120
- task :secondbase => :environment do
121
- version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
122
- raise "VERSION is required" unless version
123
-
124
- # reset connection to secondbase...
125
- SecondBase::has_runner(Rails.env)
126
-
127
- ActiveRecord::Migrator.run(:down, "db/migrate/#{SecondBase::CONNECTION_PREFIX}/", version)
128
-
129
- # reset connection back to firstbase...
130
- FirstBase::has_runner(Rails.env)
131
- end
132
- end
133
- end
134
-
135
- namespace :create do
136
- desc 'Create the database defined in config/database.yml for the current RAILS_ENV'
137
- task :secondbase => :load_config do
138
-
139
- # We can still use the #create_database method defined in activerecord's databases.rake
140
- # we call it passing the secondbase config instead of the default (Rails.env) config...
141
- create_database(secondbase_config(Rails.env))
142
- end
143
- end
144
-
145
- namespace :structure do
146
- namespace :dump do
147
- desc "dumps structure for both (first and second) databases."
148
- task :secondbase do
149
- Rake::Task['environment'].invoke
150
-
151
- SecondBase::has_runner(Rails.env)
152
-
153
- # dump the current env's db, be sure to add the schema information!!!
154
- dump_file = "#{RAILS_ROOT}/db/#{SecondBase::CONNECTION_PREFIX}_#{RAILS_ENV}_structure.sql"
155
-
156
- File.open(dump_file, "w+") do |f|
157
- f << ActiveRecord::Base.connection.structure_dump
158
- end
159
-
160
- if ActiveRecord::Base.connection.supports_migrations?
161
- File.open(dump_file, "a") { |f| f << ActiveRecord::Base.connection.dump_schema_information }
162
- end
163
-
164
- FirstBase::has_runner(Rails.env)
165
- end
166
- end
167
- end
168
-
169
- namespace :test do
170
- namespace :prepare do
171
- desc 'Prepares the test instance of secondbase'
172
- task :secondbase => 'db:abort_if_pending_migrations:secondbase' do
173
- Rake::Task["db:test:clone_structure:secondbase"].invoke
174
- end
175
- end
176
-
177
- namespace :purge do
178
- task :secondbase do
179
- Rake::Task['environment'].invoke
180
-
181
- SecondBase::has_runner('test')
182
-
183
- ActiveRecord::Base.connection.recreate_database(secondbase_config('test')["database"], secondbase_config('test'))
184
-
185
- FirstBase::has_runner(Rails.env)
186
- end
187
- end
188
-
189
- namespace :clone_structure do
190
- task :secondbase do
191
- Rake::Task['environment'].invoke
192
-
193
- # dump secondbase structure and purge the test secondbase
194
- `rake db:structure:dump:secondbase`
195
- `rake db:test:purge:secondbase`
196
-
197
- # now lets clone the structure for secondbase
198
- SecondBase::has_runner('test')
199
-
200
- ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0') if secondbase_config(RAILS_ENV)['adapter'][/mysql/]
201
-
202
- IO.readlines("#{RAILS_ROOT}/db/#{SecondBase::CONNECTION_PREFIX}_#{RAILS_ENV}_structure.sql").join.split("\n\n").each do |table|
203
- ActiveRecord::Base.connection.execute(table)
204
- end
205
-
206
- FirstBase::has_runner(Rails.env)
207
- end
208
- end
209
- end
210
-
211
- end
212
-
213
-
214
- ####################################
215
- #
216
- # Some helper methods to run back and forth between first and second base.
217
- def secondbase_config(env)
218
- ActiveRecord::Base.configurations[SecondBase::CONNECTION_PREFIX][env]
219
- end
@@ -1,29 +0,0 @@
1
- Description:
2
- Stubs out a new database migration. Pass the migration name, either
3
- CamelCased or under_scored, and an optional list of attribute pairs as arguments.
4
-
5
- A migration class is generated in db/migrate_mysql prefixed by a timestamp of the current date and time.
6
-
7
- You can name your migration in either of these formats to generate add/remove
8
- column lines from supplied attributes: AddColumnsToTable or RemoveColumnsFromTable
9
-
10
- Example:
11
- `./script/generate secondbase_migration AddSslFlag`
12
-
13
- If the current date is May 14, 2008 and the current time 09:09:12, this creates the AddSslFlag migration
14
- db/migrate_mysql/20080514090912_add_ssl_flag.rb
15
-
16
- `./script/generate secondbase_migration AddTitleBodyToPost title:string body:text published:boolean`
17
-
18
- This will create the AddTitleBodyToPost in db/migrate_mysql/20080514090912_add_title_body_to_post.rb with
19
- this in the Up migration:
20
-
21
- add_column :posts, :title, :string
22
- add_column :posts, :body, :text
23
- add_column :posts, :published, :boolean
24
-
25
- And this in the Down migration:
26
-
27
- remove_column :posts, :published
28
- remove_column :posts, :body
29
- remove_column :posts, :title
@@ -1,20 +0,0 @@
1
- class SecondbaseMigrationGenerator < Rails::Generator::NamedBase
2
- def manifest
3
- record do |m|
4
- m.migration_template 'migration.rb', "db/migrate/#{SecondBase::CONNECTION_PREFIX}", :assigns => get_local_assigns
5
- end
6
- end
7
-
8
-
9
- private
10
- def get_local_assigns
11
- returning(assigns = {}) do
12
- if class_name.underscore =~ /^(add|remove)_.*_(?:to|from)_(.*)/
13
- assigns[:migration_action] = $1
14
- assigns[:table_name] = $2.pluralize
15
- else
16
- assigns[:attributes] = []
17
- end
18
- end
19
- end
20
- end
@@ -1,15 +0,0 @@
1
- class <%= class_name.underscore.camelize %> < ActiveRecord::Migration
2
- ############################################################
3
- # Database migration targeting the Secondbase!
4
- # Generated using: ./script/generator secondbase_migration [ModelName]
5
-
6
- def self.up<% attributes.each do |attribute| %>
7
- <%= migration_action %>_column :<%= table_name %>, :<%= attribute.name %><% if migration_action == 'add' %>, :<%= attribute.type %><% end -%>
8
- <%- end %>
9
- end
10
-
11
- def self.down<% attributes.reverse.each do |attribute| %>
12
- <%= migration_action == 'add' ? 'remove' : 'add' %>_column :<%= table_name %>, :<%= attribute.name %><% if migration_action == 'remove' %>, :<%= attribute.type %><% end -%>
13
- <%- end %>
14
- end
15
- end
data/test/helper.rb DELETED
@@ -1,18 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
- require 'test/unit'
11
- require 'shoulda'
12
-
13
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
- $LOAD_PATH.unshift(File.dirname(__FILE__))
15
- require 'secondbase'
16
-
17
- class Test::Unit::TestCase
18
- end
@@ -1,7 +0,0 @@
1
- require 'helper'
2
-
3
- class TestSecondbase < Test::Unit::TestCase
4
- should "probably rename this file and start testing for real" do
5
- flunk "hey buddy, you should probably rename this file and start testing for real"
6
- end
7
- end