squasher 0.5.2 → 0.6.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: 1d4dc03c57562e0746d36aebe4a6a8634197d8c9
4
- data.tar.gz: a83619cd0c416384c4a818a71350d0c589b13c57
3
+ metadata.gz: 70564980ec4cb7bc4cad405cd0d173c46bc99f2f
4
+ data.tar.gz: '051554966cd007618ab03295579a2a1669c449b5'
5
5
  SHA512:
6
- metadata.gz: 5fd8a985155c33c59d532510fe31a3986cad7aaa98584d41afecd17b4b74d0e0ce4c7f7749939a87e0e1b4c9ffc68ab5c64ec44d29e1b9953833b42c2eac091a
7
- data.tar.gz: 6516143788c78bb5b959467282bc126981c6065fb4fab37270da8c8c274fb74a3e04d36ed2acdda6b5c5782f5296254fabc7d2ff6cbd88cc8012e5d06b90c715
6
+ metadata.gz: 34ebbe7ee512b65417099403b27085cb9ea5c8e329f674fec89dfe644edcce9cd82b915a2cacbef6ff516afb368e26b957abe4a9a59dd66aee5c1ce4c52cad30
7
+ data.tar.gz: 1a1ce4239174e3b871d45a1a5ad7d3997bfa48da3e540418bdcce852208f8f099711a0ecbb586a22beb18dba2c7b58e5dcc48efb02547015f62d21c05e7af54c
@@ -0,0 +1,27 @@
1
+ - 0.6.0
2
+ - Support apps with sql schema ([@mpospelov](https://github.com/mpospelov))
3
+ - 0.5.1
4
+ - Fix work on Windows machines ([@tobmatth](https://github.com/tobmatth))
5
+ - 0.5.0
6
+ - Rework command line integration. Fix clean process with Rails 5
7
+ - 0.4.0
8
+ - Support rails versioned migrations which were introduced in Rails 5
9
+ - 0.3.1
10
+ - fix init migration generation
11
+ - 0.3.0
12
+ - **rails engines support** ([@JakeTheSnake3p0](https://github.com/JakeTheSnake3p0))
13
+ - move messages from JSON file to YAML
14
+ - allow to use a db config with a "soft" parsing errors
15
+ - 0.2.2
16
+ - strip white spaces in init migrations
17
+ - 0.2.1
18
+ - support rails 5
19
+ - 0.2.0
20
+ - add **dry** mode and ability to reuse the previous squasher database
21
+ - improve database config processing
22
+ - raise the minimum supported version of Ruby
23
+ - 0.1.7
24
+ - a regression fix of the log output ([@lime](https://github.com/lime))
25
+ - improve a multi-platform support ([@johncarney](https://github.com/johncarney))
26
+ - 0.1.6
27
+ - support multiple database settings ([@ppworks](https://github.com/ppworks))
data/README.md CHANGED
@@ -59,51 +59,20 @@ You can tell `squasher` a more detailed date, for example:
59
59
 
60
60
  ### Options
61
61
 
62
- `-d/--dry` - execute in **dry** mode - test a squashing process without deleting old migrations. The final output will be
63
- printed in the console.
62
+ Run `squasher -h` or just `squasher` to see how you can use squasher:
64
63
 
65
- `-r/--reuse` - reuse a database from previous squashing process. The option can be used in the next cases:
66
- - you've run squasher in **dry** mode before and there were no errors
67
- - you're squashing migrations gradually. For example, you want to squash migrations from 2013 till 2015, but the
68
- process breaks in a migration from 2014. In this situation you squash till 2014, save the squasher's
69
- database at the end, make a patch in the broken migration and run again the suite with `-r` option. As the result
70
- squasher will not need to create the db schema and all data from the previous migrations will be there.
71
-
72
- `-e/--engine` - tell squasher that you are squashing a Rails engine. To squash migrations you need to configure a dummy app. If your dummy app located outside the engine's folder provide path to it as the next argument `squasher --engine ../my-engine-app 2016`
73
-
74
- `-m/--migration` - for correct work with Rails 5 specify a migration version like `squasher -m 5.0 ...`
64
+ - in sql schema rails app
65
+ - in rails 5+ app
66
+ - inside an engine
67
+ - in "dry" mode
68
+ - in "reuse" mode
75
69
 
76
70
  ## Requirements
77
71
 
78
- It works and was tested on Ruby 2.0+ and Rails 3.1+. It also requires a valid development configuration in `config/database.yml` and using Ruby format in `db/schema.rb` (default Rails use-case).
72
+ It works and was tested on Ruby 2.0+ and Rails 3.1+. It also requires a valid development configuration in `config/database.yml`.
79
73
  If an old migration inserted data (created ActiveRecord model records) you will lose this code in the squashed migration, **BUT** `squasher` will ask you to leave a tmp database which will have all data that was inserted while migrating. Using this database you could add that data as another migration, or into `config/seed.rb` (the expected place for this stuff).
80
74
 
81
- ## Changelog
82
- - 0.5.1
83
- - Fix work on Windows machines ([@tobmatth](https://github.com/tobmatth))
84
- - 0.5.0
85
- - Rework command line integration. Fix clean process with Rails 5
86
- - 0.4.0
87
- - Support rails versioned migrations which were introduced in Rails 5
88
- - 0.3.1
89
- - fix init migration generation
90
- - 0.3.0
91
- - **rails engines support** ([@JakeTheSnake3p0](https://github.com/JakeTheSnake3p0))
92
- - move messages from JSON file to YAML
93
- - allow to use a db config with a "soft" parsing errors
94
- - 0.2.2
95
- - strip white spaces in init migrations
96
- - 0.2.1
97
- - support rails 5
98
- - 0.2.0
99
- - add **dry** mode and ability to reuse the previous squasher database
100
- - improve database config processing
101
- - raise the minimum supported version of Ruby
102
- - 0.1.7
103
- - a regression fix of the log output ([@lime](https://github.com/lime))
104
- - improve a multi-platform support ([@johncarney](https://github.com/johncarney))
105
- - 0.1.6
106
- - support multiple database settings ([@ppworks](https://github.com/ppworks))
75
+ ## (Changelog)[CHANGELOG.md]
107
76
 
108
77
  ## Contributing
109
78
 
@@ -6,27 +6,33 @@ require 'squasher'
6
6
 
7
7
  options = {}
8
8
  parser = OptionParser.new do |config|
9
- config.on('-v', '--version', '-h', '--help')
9
+ config.banner = 'Supported options:'
10
10
 
11
- config.on('-d', '--dry') do
11
+ config.on('-d', '--dry', 'execute in "dry" mode(a test squashing without removing old migrations)') do
12
12
  options[:dry] = true
13
13
  end
14
14
 
15
- config.on('-r', '--reuse') do
15
+ config.on('-s', '--sql', 'run squasher in the app with sql schema') do
16
+ options[:sql] = true
17
+ end
18
+
19
+ config.on('-m', '--migration', '=VERSION', 'define the rails migration version(since Rails 5)') do |value|
20
+ options[:migration] = value
21
+ end
22
+
23
+ config.on('-r', '--reuse', 'reuse the database from a previous squashing') do
16
24
  options[:reuse] = true
17
25
  end
18
26
 
19
- config.on('-e') do
27
+ config.on('-e', 'run squasher in the engine(requires the dummy app inside)') do
20
28
  options[:engine] = nil
21
29
  end
22
30
 
23
- config.on('--engine=PATH') do |value|
31
+ config.on('--engine=PATH', 'run squasher in the engine with a custom path to the dummy app') do |value|
24
32
  options[:engine] = value
25
33
  end
26
34
 
27
- config.on('-m', '--migration', '=VERSION') do |value|
28
- options[:migration] = value
29
- end
35
+ config.on('-v', '--version', '-h', '--help', 'show this message')
30
36
  end
31
37
  parser.parse!
32
38
 
@@ -36,4 +42,6 @@ when /\A\d{4}/ then Squasher.squash(ARGV.first)
36
42
  when 'clean' then Squasher.clean
37
43
  else
38
44
  Squasher.tell(:usage, version: Squasher::VERSION)
45
+ puts ''
46
+ puts parser
39
47
  end
@@ -57,6 +57,9 @@ module Squasher
57
57
  elsif key == :migration
58
58
  Squasher.error(:invalid_migration_version, value: value) unless value.to_s =~ /\A\d.\d\z/
59
59
  @migration_version = "[#{value}]"
60
+ elsif key == :sql
61
+ @schema_file = File.join(@app_path, 'db', 'structure.sql')
62
+ @flags << key
60
63
  else
61
64
  @flags << key
62
65
  end
@@ -18,14 +18,9 @@ usage:
18
18
  - "Squasher %{version}"
19
19
  - ""
20
20
  - "Examples of usage:"
21
- - " :green<squasher> [options] :yellow<year[/month][/day]> => squash migrations prior to a specified date"
22
- - " :green<squasher> :yellow<clean> => generate or update a cleaning migration and apply it"
23
- - " :green<squasher> :yellow<info> => show the message\n"
24
- - "Options:"
25
- - " :yellow<-d> => execute in :blue<`dry`> mode - test a squashing process without removing old migrations"
26
- - " :yellow<-r> => reuse a database from the previous squashing"
27
- - " :yellow<-e> [dummy-root] => execute in :blue<`engine`> mode - requires a dummy app"
28
- - " :yellow<-m> 5.0 => specify the rails migration version (added in Rails 5)"
21
+ - " :green<squasher> [options] :yellow<year[/month][/day]> squash migrations prior to a specified date"
22
+ - " :green<squasher> [options] :yellow<clean> generate or update a cleaning migration and apply it"
23
+
29
24
  wrong_option: "You provided a wrong option :red<%{arg}>\n\n"
30
25
  invalid_param: "You provided a wrong param :red<%{arg}>\n\n"
31
26
  dry_mode_finished: "The `dry` mode is finished. Below the init schema's content:"
@@ -17,23 +17,49 @@ module Squasher
17
17
  ERB.new(template("#{ name }.rb"), nil, '-').result(binding)
18
18
  end
19
19
 
20
- def each_schema_line
20
+ def each_schema_line(&block)
21
21
  File.open(config.schema_file, 'r') do |stream|
22
- inside_schema = false
23
- stream.each_line do |line|
24
- if inside_schema
25
- # reach the end of schema
26
- break if line.index("end") == 0
27
- yield line.gsub(/\A\s{,2}(.*)\s+\z/, '\1')
28
- else
29
- inside_schema = true if line.include?("ActiveRecord::Schema")
30
- end
22
+ if @config.set?(:sql)
23
+ stream_structure(stream, &block)
24
+ else
25
+ stream_schema(stream, &block)
31
26
  end
32
27
  end
33
28
  end
34
29
 
35
30
  private
36
31
 
32
+ def stream_structure(stream)
33
+ yield 'execute <<-SQL'
34
+ skip_mode = false
35
+ ignored_table = ['ar_internal_metadata', 'schema_migrations']
36
+ stream.each_line do |line|
37
+ skip_mode = true if ignored_table.any? { |t| line.include?(t) }
38
+
39
+ if skip_mode
40
+ skip_mode = false if line.include?(';')
41
+ next
42
+ end
43
+
44
+ yield line.gsub(/\A\s{,2}(.*)\s+\z/, '\1')
45
+ end
46
+ yield 'SQL'
47
+ end
48
+
49
+ def stream_schema(stream)
50
+ inside_schema = false
51
+
52
+ stream.each_line do |line|
53
+ if inside_schema
54
+ # reach the end of schema
55
+ break if line.index("end") == 0
56
+ yield line.gsub(/\A\s{,2}(.*)\s+\z/, '\1')
57
+ else
58
+ inside_schema = true if line.include?("ActiveRecord::Schema")
59
+ end
60
+ end
61
+ end
62
+
37
63
  def template(name)
38
64
  path = File.join(File.dirname(__FILE__), "templates/#{ name }.erb")
39
65
  template = File.open(path, "rb")
@@ -1,7 +1,8 @@
1
1
  class InitSchema < ActiveRecord::Migration<%= @config.migration_version %>
2
2
  def up
3
3
  <%- each_schema_line do |line| -%>
4
- <%= line.strip.empty? ? '' : " #{line}" %>
4
+ <%- next if line.strip.empty? -%>
5
+ <%= " #{line}" %>
5
6
  <%- end -%>
6
7
  end
7
8
 
@@ -1,3 +1,3 @@
1
1
  module Squasher
2
- VERSION = "0.5.2"
2
+ VERSION = "0.6.0"
3
3
  end
@@ -0,0 +1,48 @@
1
+ CREATE TABLE cities (
2
+ id integer NOT NULL,
3
+ name character varying,
4
+ created_at timestamp without time zone NOT NULL,
5
+ updated_at timestamp without time zone NOT NULL,
6
+ );
7
+
8
+ CREATE TABLE managers (
9
+ id integer NOT NULL,
10
+ email character varying,
11
+ password_digest character varying,
12
+ created_at timestamp without time zone NOT NULL,
13
+ updated_at timestamp without time zone NOT NULL
14
+ );
15
+
16
+ CREATE TABLE offices (
17
+ id integer NOT NULL,
18
+ name character varying,
19
+ address character varying,
20
+ phone character varying,
21
+ description text,
22
+ capacity integer,
23
+ manager_id integer,
24
+ city_id integer,
25
+ created_at timestamp without time zone NOT NULL,
26
+ updated_at timestamp without time zone NOT NULL
27
+ );
28
+
29
+ CREATE TABLE ar_internal_metadata (
30
+ key character varying NOT NULL,
31
+ value character varying,
32
+ created_at timestamp without time zone NOT NULL,
33
+ updated_at timestamp without time zone NOT NULL
34
+ );
35
+
36
+ CREATE TABLE schema_migrations (
37
+ version character varying NOT NULL
38
+ );
39
+
40
+ ALTER TABLE ONLY ar_internal_metadata
41
+ ADD CONSTRAINT ar_internal_metadata_pkey PRIMARY KEY (key);
42
+
43
+ ALTER TABLE ONLY schema_migrations
44
+ ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version);
45
+
46
+ INSERT INTO "schema_migrations" (version) VALUES
47
+ ('20170831152134'),
48
+ ('20170907145259');
@@ -55,6 +55,64 @@ describe Squasher::Worker do
55
55
  Squasher.instance_variable_set(:@config, Squasher::Config.new)
56
56
  end
57
57
 
58
+ specify 'the sql mode' do
59
+ Squasher.config.set(:sql, true)
60
+ worker = described_class.new(Time.new(2014))
61
+ allow(worker).to receive(:under_squash_env).and_yield.and_return(true)
62
+ new_migration_path = File.join(Dir.tmpdir, 'init_schema.rb')
63
+ allow_any_instance_of(Squasher::Config).to receive(:migration_file).with('20131213090719', :init_schema).and_return(new_migration_path)
64
+ expect(FileUtils).to receive(:rm).with(File.join(fake_root, 'db', 'migrate', '20131205160936_first_migration.rb'))
65
+ expect(FileUtils).to receive(:rm).with(File.join(fake_root, 'db', 'migrate', '20131213090719_second_migration.rb'))
66
+
67
+ expect(Squasher).to receive(:ask).with(:keep_database).and_return(false)
68
+ expect(Squasher).to receive(:rake).with("db:drop")
69
+ expect(Squasher).to receive(:ask).with(:apply_clean).and_return(false)
70
+ worker.process
71
+
72
+ expect(File.exists?(new_migration_path)).to be_truthy
73
+ File.open(new_migration_path) do |stream|
74
+ content = stream.read
75
+ expect(content).to eq(<<-RUBY
76
+ class InitSchema < ActiveRecord::Migration
77
+ def up
78
+ execute <<-SQL
79
+ CREATE TABLE cities (
80
+ id integer NOT NULL,
81
+ name character varying,
82
+ created_at timestamp without time zone NOT NULL,
83
+ updated_at timestamp without time zone NOT NULL,
84
+ );
85
+ CREATE TABLE managers (
86
+ id integer NOT NULL,
87
+ email character varying,
88
+ password_digest character varying,
89
+ created_at timestamp without time zone NOT NULL,
90
+ updated_at timestamp without time zone NOT NULL
91
+ );
92
+ CREATE TABLE offices (
93
+ id integer NOT NULL,
94
+ name character varying,
95
+ address character varying,
96
+ phone character varying,
97
+ description text,
98
+ capacity integer,
99
+ manager_id integer,
100
+ city_id integer,
101
+ created_at timestamp without time zone NOT NULL,
102
+ updated_at timestamp without time zone NOT NULL
103
+ );
104
+ SQL
105
+ end
106
+
107
+ def down
108
+ raise ActiveRecord::IrreversibleMigration, "The initial migration is not revertable"
109
+ end
110
+ end
111
+ RUBY
112
+ )
113
+ end
114
+ end
115
+
58
116
  specify 'the dry mode' do
59
117
  Squasher.config.set(:dry, nil)
60
118
  worker = described_class.new(Time.new(2014))
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: squasher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Pchelintsev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-05 00:00:00.000000000 Z
11
+ date: 2017-09-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -62,6 +62,7 @@ extra_rdoc_files: []
62
62
  files:
63
63
  - ".gitignore"
64
64
  - ".travis.yml"
65
+ - CHANGELOG.md
65
66
  - Gemfile
66
67
  - LICENSE.txt
67
68
  - README.md
@@ -84,6 +85,7 @@ files:
84
85
  - spec/fake_app/db/migrate/20140101010101_squasher_clean.rb
85
86
  - spec/fake_app/db/migrate/20140103124257_third_migration.rb
86
87
  - spec/fake_app/db/schema.rb
88
+ - spec/fake_app/db/structure.sql
87
89
  - spec/lib/cleaner_spec.rb
88
90
  - spec/lib/config_spec.rb
89
91
  - spec/lib/squasher_spec.rb
@@ -123,6 +125,7 @@ test_files:
123
125
  - spec/fake_app/db/migrate/20140101010101_squasher_clean.rb
124
126
  - spec/fake_app/db/migrate/20140103124257_third_migration.rb
125
127
  - spec/fake_app/db/schema.rb
128
+ - spec/fake_app/db/structure.sql
126
129
  - spec/lib/cleaner_spec.rb
127
130
  - spec/lib/config_spec.rb
128
131
  - spec/lib/squasher_spec.rb