multi_ar 4.1.0 → 5.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
- SHA1:
3
- metadata.gz: 34e048d2d4906e2af853ade40a158107495f140e
4
- data.tar.gz: 44a38ed6cd16746d8e70565d61e22524fe2fcc9c
2
+ SHA256:
3
+ metadata.gz: e703260ff0896138cefe607320db98e5c020bbe0233117a518e833ae5afb0408
4
+ data.tar.gz: 2a2d097579ffb99fd8735b4fe5c53aef110d5edabc47761375b0edcbc4f59174
5
5
  SHA512:
6
- metadata.gz: b8c98f946f3546b27e0eed21f396760df13e90f53a74fd8ac66e222a245b4762240c58126049a947e23febe7d1e650ea5fa9f97ee7dcc8687eaff62486c297ce
7
- data.tar.gz: b4e6afd293a028585492fefa6637b8771042533e22c8d8f232637edc86934b1b3e532fd5d3594ebe50a591955a71019c2a0db12bed9428cce1016e6f5d2cbfe4
6
+ metadata.gz: 1c8c633fbdc59cd7d7bf4e01429956a602776f26bb726d2b26ef55985786c98e8cebfd960040dd540e5255d4405a227b805a5ed20859c10723d29cbaf81095d0
7
+ data.tar.gz: 665b59f332f12c9c6ee82629fb07a7e06fb3e56dc3425433c1e6801672ad1db8b178465450c446168a4e6f8ad639f4717ccf620efa2c6a7383f5338c5cc8cd87
checksums.yaml.gz.sig CHANGED
Binary file
@@ -31,8 +31,8 @@ module MultiAR
31
31
 
32
32
  # @return real connection name, nil in case connection is not available
33
33
  def self.connection_name base_name
34
- raise "#{base_name} is not in databases configuration variable." unless MultiAR.app.databases.include? base_name
35
- return nil unless MultiAR.app.databases.include? base_name
34
+ raise "#{base_name} is not in databases configuration variable." unless MultiAR::databases.include? base_name
35
+ return nil unless MultiAR::databases.include? base_name
36
36
  "#{base_name}_#{MultiAR.app.environment}"
37
37
  end
38
38
 
@@ -20,8 +20,7 @@ module MultiAR
20
20
  # - dry # boolean
21
21
  # - environment # `true` or `String`
22
22
  # - verbose # boolean
23
- # - databases # `false` or `Array`, by default asks for databases
24
- # - migration_dir # String
23
+ # - databases # false, `Array` or `Hash`.
25
24
  #
26
25
  # If value is `true`, an option will be added to CLI interface. If the value is something else, the option will be populated by this value instead.
27
26
  #
@@ -79,7 +78,7 @@ module MultiAR
79
78
  # TODO: not implemented currently, do we really need this?
80
79
  #p.opt "list_databases", "Lists databases that contains migrations in the gem", type: :flag
81
80
  # TODO: should we do migration_dirs here too instead?
82
- p.opt "migration_dir", "The directory where migrations for databases are read from", type: :string, default: "db/migrate"
81
+ #p.opt "migration_dir", "The directory where migrations for databases are read from", type: :string, default: "db/migrate"
83
82
  p.opt "task", "Rake task to execute", short: "t", type: :string
84
83
  p.opt "tasks", "List available Rake tasks", short: "T", type: :flag
85
84
  end
@@ -136,14 +135,31 @@ module MultiAR
136
135
  def init_multi_ar
137
136
  opts = {}
138
137
  opts[:db_config] = @opts["db_config"] unless @opts["db_config"].nil?
139
- opts[:migration_dirs] = [ @opts["migration_dir"] ]
138
+ #opts[:migration_dirs] = [ @opts["migration_dir"] ]
140
139
  opts[:config] = @opts["config"] unless @opts["config"].nil?
141
- opts[:databases] = @opts["databases"]
140
+ opts[:databases] = parse_databases_input(@opts["databases"])
142
141
  opts[:environment] = @opts["environment"]
143
142
  opts[:verbose] = @opts["verbose"]
143
+ opts[:migration_framework] = @migration_framework
144
144
  @multi_ar = MultiAR.new opts
145
145
  end
146
146
 
147
+ def parse_databases_input databases
148
+ raise "You did not give proper databases. Please see --help for instructions." unless databases.respond_to? :each
149
+
150
+ out = {}
151
+ databases.each do |database|
152
+ if database.include? ":"
153
+ splitted = database.split(":")
154
+ out[splitted[0]] = splitted[1]
155
+ else
156
+ out[database] = "db/migrate/#{database}"
157
+ end
158
+ end
159
+
160
+ out
161
+ end
162
+
147
163
  # @note This method will always quit the application or raise another exception for errors. Catch SystemExit if that’s not good for you.
148
164
  def bootstrap opts
149
165
  raise "--databases must be given when bootstrapping." unless opts["databases"]
@@ -171,7 +187,12 @@ module MultiAR
171
187
 
172
188
  def bootstrap_db_config opts
173
189
  str = ""
174
- opts["databases"].each do |db|
190
+ databases = parse_databases_input(opts["databases"])
191
+ databases.each do |db, migration_path|
192
+ # This is a bit misleading place to create the migration dir, but it needs to be done somewhere.
193
+ FileUtils.mkdir_p(migration_path)
194
+
195
+ # Create the config file
175
196
  [ "development", "production", "test"].each do |env|
176
197
  full_name = "#{db}_#{env}"
177
198
  str << <<-EOS.gsub(/^ {10}/, "")
@@ -241,11 +262,14 @@ module MultiAR
241
262
  def bootstrap_config opts
242
263
  settings_file = "config/settings.yaml"
243
264
  return if File.exist? settings_file
244
- str = <<-EOF
245
- databases:
265
+ str = <<~EOF
266
+ databases:
246
267
  EOF
247
- opts["databases"].each do |database|
248
- str << " - #{database}"
268
+ databases = parse_databases_input(opts["databases"])
269
+ databases.each do |database, path|
270
+ str << "-\n"
271
+ str << " database: #{database}\n"
272
+ str << " migration_path: #{path}\n"
249
273
  end
250
274
 
251
275
  File.open settings_file, "w" do |f|
@@ -10,9 +10,7 @@ module ActiveRecordMigrations
10
10
  source_root ::ActiveRecord::Generators::MigrationGenerator.source_root
11
11
 
12
12
  def db_migrate_path
13
- dir = ::ActiveRecord::Tasks::DatabaseTasks.migrations_paths.first
14
- db_dir = ::ActiveRecord::Tasks::DatabaseTasks.sub_db_dir
15
- "#{dir}/#{db_dir}"
13
+ databases = MultiAR::MultiAR::databases.first[1]
16
14
  end
17
15
  end
18
16
  end
@@ -78,7 +78,9 @@ module Rake
78
78
  name = args[:name] || ENV["name"]
79
79
  options = args[:options] || ENV["options"]
80
80
 
81
- raise "You need to specify exactly one database for migration generation. See --databases. Given databases: #{databases.inspect}" if databases.size != 1
81
+ if MultiAR::MultiAR::databases.size != 1
82
+ raise "You need to specify exactly one database for migration generation. See --databases. Given databases: #{MultiAR::MultiAR::databases.inspect}"
83
+ end
82
84
 
83
85
  unless name
84
86
  generator = Rails::Generators.find_by_namespace "migration"
@@ -100,7 +102,7 @@ module Rake
100
102
  multiple_databases_task "migrate", "db" do |database_name|
101
103
  establish_connection database_name
102
104
 
103
- context = ActiveRecord::MigrationContext.new MultiAR::MultiAR.migration_dirs
105
+ context = ActiveRecord::MigrationContext.new(MultiAR::MultiAR.databases[database_name])
104
106
  context.migrate
105
107
 
106
108
  #MultiAR::MultiAR.migration_dirs.each do |dir|
@@ -118,11 +120,59 @@ module Rake
118
120
  multiple_databases_task "rollback", "db" do |database_name|
119
121
  establish_connection database_name
120
122
  step = ENV['STEP'] ? ENV['STEP'].to_i : 1
121
- MultiAR::MultiAR.migration_dirs.each do |dir|
122
- path = "#{dir}/#{database_name}/"
123
- # The database should be present only on one migration dir, so this will fail if there is more than one migration dir
124
- ActiveRecord::Migrator.rollback(path, step) if Dir.exist? path
123
+
124
+ context = ActiveRecord::MigrationContext.new(MultiAR::MultiAR.databases[database_name])
125
+ context.rollback step
126
+ end
127
+
128
+ multiple_databases_task "forward", "db" do |database_name|
129
+ establish_connection database_name
130
+ step = ENV['STEP'] ? ENV['STEP'].to_i : 1
131
+
132
+ context = ActiveRecord::MigrationContext.new(MultiAR::MultiAR.databases[database_name])
133
+ context.forward step
134
+ end
135
+
136
+ multiple_databases_task "down", "db:migrate" do |database_name|
137
+ establish_connection database_name
138
+ raise "db:down is used to go back to certain version. Use db:rollback if you want to go back n migrations." unless ENV["VERSION"]
139
+ version = ENV["VERSION"]
140
+
141
+ context = ActiveRecord::MigrationContext.new(MultiAR::MultiAR.databases[database_name])
142
+ context.down version
143
+ end
144
+
145
+ multiple_databases_task "up", "db:migrate" do |database_name|
146
+ establish_connection database_name
147
+ raise "db:up is used to go to certain version. Use db:forward if you want to go up n migrations." unless ENV["VERSION"]
148
+ version = ENV["VERSION"]
149
+
150
+ context = ActiveRecord::MigrationContext.new(MultiAR::MultiAR.databases[database_name])
151
+ context.up version
152
+ end
153
+
154
+ multiple_databases_task "status", "db:migrate" do |database_name|
155
+ establish_connection database_name
156
+
157
+ unless ActiveRecord::SchemaMigration.table_exists?
158
+ abort "Schema migrations table does not exist yet."
125
159
  end
160
+
161
+ #raise "db:up is used to go to certain version. Use db:forward if you want to go up n migrations." unless ENV["VERSION"]
162
+ #version = ENV["VERSION"]
163
+
164
+ #context = ActiveRecord::MigrationContext.new(MultiAR::MultiAR.databases[database_name])
165
+ #context.up version
166
+
167
+ # output
168
+ puts "\ndatabase: #{ActiveRecord::Base.connection_config[:database]}\n\n"
169
+ puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
170
+ puts "-" * 50
171
+ ActiveRecord::Base.connection.migration_context.migrations_status.each do |status, version, name|
172
+ puts "#{status.center(8)} #{version.ljust(14)} #{name}"
173
+ end
174
+ puts
175
+
126
176
  end
127
177
 
128
178
  multiple_databases_task "drop", "db" do |database_name|
@@ -146,14 +196,16 @@ module Rake
146
196
  name = (namespace && name) || "#{namespace}:#{name_without_namespace}"
147
197
  old_comment = rename_task name, namespace
148
198
 
199
+ databases = MultiAR::MultiAR::databases
200
+
149
201
  DSL.desc "Runs task #{name} for all selected databases"
150
202
  DSL.task name.to_sym do
151
- databases.each do |database_name|
203
+ databases.each do |database_name, migration_path|
152
204
  ::Rake::Task["#{name}:#{database_name}"].invoke
153
205
  end
154
206
  end
155
207
 
156
- databases.each do |database_name|
208
+ databases.each do |database_name, migration_path|
157
209
  DSL.desc old_comment
158
210
  DSL.task :"#{name}:#{database_name}" do
159
211
  yield database_name
@@ -1,4 +1,4 @@
1
1
 
2
2
  module MultiAR
3
- VERSION = "4.1.0"
3
+ VERSION = "5.0.0"
4
4
  end
data/lib/multi_ar.rb CHANGED
@@ -12,13 +12,12 @@ module MultiAR
12
12
  # Must be initialized before most actions works, that relies on MultiAR#app for getting configuration.
13
13
  class MultiAR
14
14
 
15
- attr_reader :databases
16
15
  attr_reader :db_config
17
16
  attr_reader :environment
18
17
 
19
18
  # @api private
20
19
  # This will always be overridden, when MultiAR is initialized. Don’t try to do any funny logic with this.
21
- #@@migration_dirs = []
20
+ @@__databases = {}
22
21
 
23
22
  class << self
24
23
  # Instance of MultiAR::MultiAR, automatically assigned by MultiAR::MultiAR#new.
@@ -28,7 +27,7 @@ module MultiAR
28
27
 
29
28
  # @param databases array of available databases
30
29
  # @todo config file is overriding parameters passed here... I think it should be other way around, but need more custom logic for that :/
31
- def initialize databases:, environment: "development", config: "config/settings.yaml", db_config: "config/database.yaml", migration_dirs: [], verbose: false
30
+ def initialize databases:, environment: "development", config: "config/settings.yaml", db_config: "config/database.yaml", verbose: false, migration_framework: true
32
31
 
33
32
  # first load config
34
33
  if not config.nil? and File.exist? config
@@ -36,6 +35,13 @@ module MultiAR
36
35
  config = Psych.load_file config
37
36
  b = binding
38
37
  config.each do |key, value|
38
+ if key == "databases"
39
+ out = {}
40
+ value.each do |database|
41
+ out[database["database"]] = database["migration_path"]
42
+ end
43
+ value = out
44
+ end
39
45
  b.local_variable_set key.to_sym, value
40
46
  end
41
47
  end
@@ -44,23 +50,26 @@ module MultiAR
44
50
  raise "#{db_config} is not valid path to a file. Try specifying --db-config <path> or configuring it in the configuration file." if db_config.nil? or !File.exist?(db_config)
45
51
  raise "databases is not responding to :each. Try passing passing --databases <database> or configuring it in the configuration file." unless databases.respond_to? :each
46
52
 
47
- @databases = databases
53
+ parse_databases_input databases
54
+
55
+ #@databases = databases
48
56
  @db_config = db_config
49
57
  @environment = environment
58
+ @migration_framework = migration_framework
50
59
  #@@migration_dirs = migration_dirs unless migration_dirs.empty? # This takes care of that it will only be overridden if there is any given values, making default configs work
51
- ActiveRecord::Tasks::DatabaseTasks.migrations_paths = migration_dirs
60
+ #ActiveRecord::Tasks::DatabaseTasks.migrations_paths = migration_dirs
52
61
 
53
62
  Database.initialize db_config: db_config
54
63
 
55
- ActiveRecord::Tasks::DatabaseTasks.class_eval { attr_accessor :sub_db_dir }
56
- ActiveRecord::Tasks::DatabaseTasks.sub_db_dir = databases.first # TODO: I don’t think this is how it should work
64
+ #ActiveRecord::Tasks::DatabaseTasks.class_eval { attr_accessor :sub_db_dir }
65
+ #ActiveRecord::Tasks::DatabaseTasks.sub_db_dir = databases.first # TODO: I don’t think this is how it should work
57
66
 
58
67
  @rake = ::Rake::Application.new
59
68
  ::Rake.application = @rake
60
69
  @rake.init
61
70
  ::Rake::TaskManager.record_task_metadata = true
62
71
 
63
- Rake::Tasks.databases = databases
72
+ #Rake::Tasks.databases = databases
64
73
  Rake::Tasks.environment = environment
65
74
  Rake::Tasks.define
66
75
 
@@ -69,19 +78,39 @@ module MultiAR
69
78
  MultiAR.app = self
70
79
  end
71
80
 
81
+ # A helper method to add migrations for multiple databases that reside in same location.
82
+ #
83
+ # Expects the given directory contain subdirectories that contain the actual migrations.
84
+ # For example, `db/migrate/_db_name_`, where `db/migrate` is dir given as an argument to this
85
+ # method and `_db_name_` is name of the database.
86
+ def self.add_migration_dir dir
87
+ raise "Directory #{dir} does not exist." unless Dir.exist? dir
88
+
89
+ Dir.chdir dir do
90
+ dbs = Dir.glob "*/"
91
+ dbs.each do |database|
92
+ add_database database, "#{dir}/#{database.chop}"
93
+ end
94
+ end
95
+ end
96
+
72
97
  # Array of paths to directories where migrations resides.
73
- # @see add_migration_dir
98
+ # @see add_database
74
99
  def self.migration_dirs
75
100
  ActiveRecord::Tasks::DatabaseTasks.migrations_paths
76
101
  end
77
102
 
103
+ def self.migration_dir_for database_name
104
+ ActiveRecord::Tasks::DatabaseTasks.migrations_paths
105
+ end
106
+
78
107
  # Outputs contents if verbose flag has been passed.
79
108
  def self.verb str
80
109
  return unless @@verbose
81
110
  puts str
82
111
  end
83
112
 
84
- # Add a path to a directory where migrations resides. For standard Rails setup, this would be “db/migrate”.
113
+ # Add a database and its migration path. For standard Rails setup, this would be "customdbname", “db/migrate”.
85
114
  #
86
115
  # The directory structure of how MultiAR uses the path is a bit different from traditional way: for each
87
116
  # database, there is directory inside the migration dir.
@@ -90,9 +119,12 @@ module MultiAR
90
119
  # migrations would be looked from path “my/migration/dir/messy_database”.
91
120
  #
92
121
  # @note often you want to add full path to this dir, `__dir__` is useful for this.
93
- def self.add_migration_dir path
94
- raise "Migration dir #{path} does not exist." unless Dir.exist? path
95
- ActiveRecord::Tasks::DatabaseTasks.migrations_paths << path
122
+ def self.add_database database_name, migration_path
123
+ if @migration_framework
124
+ raise "Migration dir #{migration_path} does not exist." unless Dir.exist? migration_path
125
+ ActiveRecord::Tasks::DatabaseTasks.migrations_paths << migration_path
126
+ end
127
+ @@__databases[database_name] = migration_path
96
128
  end
97
129
 
98
130
  # @todo this shows rake in start of the command, we want to show multi_ar instead.
@@ -107,9 +139,26 @@ module MultiAR
107
139
  def rake_task task_name
108
140
  @rake.invoke_task task_name
109
141
  end
110
- end
111
- end
112
142
 
113
- # For convenience, it may make shorter namespace.
114
- Mar = MultiAR # TODO: there is Mar gem, maybe we should avoid this to avoid conflicts?
115
- MultiAr = MultiAR
143
+ def self.databases
144
+ @@__databases
145
+ end
146
+
147
+ private
148
+
149
+ def parse_databases_input dbs
150
+ if dbs.kind_of? Array
151
+ dbs.each do |database|
152
+ ::MultiAR::MultiAR::add_database database, "db/migrate/#{database}"
153
+ end
154
+ return
155
+ end
156
+
157
+ raise "input databases needs to be either Hash or Array" unless dbs.kind_of? Hash
158
+
159
+ dbs.each do |database, migration_path|
160
+ ::MultiAR::MultiAR::add_database database, migration_path
161
+ end
162
+ end
163
+ end
164
+ end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multi_ar
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.0
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samu Voutilainen
@@ -29,7 +29,7 @@ cert_chain:
29
29
  w7Q+3AEK9ifd9ywHO2Ott0JdJEadxhU4N0cI6bQg+uJiSYmdBK0vEJN4lhNg1w37
30
30
  C6hgCMQL3/D3kq732F4KGypqykYwx1wRDGHLxDTBHY26sy/TXfHcj4zPuKA=
31
31
  -----END CERTIFICATE-----
32
- date: 2018-06-04 00:00:00.000000000 Z
32
+ date: 2018-07-04 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: trollop
@@ -195,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
195
  version: '0'
196
196
  requirements: []
197
197
  rubyforge_project:
198
- rubygems_version: 2.6.14
198
+ rubygems_version: 2.7.3
199
199
  signing_key:
200
200
  specification_version: 4
201
201
  summary: Multi database feature set for ActiveRecord
metadata.gz.sig CHANGED
Binary file