unschema 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 01ed70f4c6013133bd2b75219bad66d570bc5d78
4
- data.tar.gz: 0ada28339c5538bccde776ddf5c7017db209f65e
3
+ metadata.gz: 4243d394a3ed056790202261451bc521418c20aa
4
+ data.tar.gz: ad8f5409d7b724f00c0d9aead913859260cbdc10
5
5
  SHA512:
6
- metadata.gz: 6245c40160baf94f84f8736e4aceb0a1d27b5beed15aaa356efdf58cd4acbb38a5c224b0e2097e321b93e41eb341883b6ee72058a51c6943ebcbb0621c37923c
7
- data.tar.gz: 888c0f5114435aec00325a6beac2227ed198fdf9433bc73c6d2a81f994409aaa48bfdf04eeecf0a19f29172530557c55bec81db01134ca41e628c0f37b0a459f
6
+ metadata.gz: 7e27fa30ad4f8a21f290ff0214b50dccb8c6cdb6751db48317a6e7410016365fcf27fee5110eda9c448af5ec2217b2eaec8a3c6b2c83aacf73cab37fcf28531b
7
+ data.tar.gz: 657a908a1433219e1e1b30f4cdd73be2f90c7780e897234d0a723922dc7851dbb5dff5bac5ebc39507b12369b7774c8c1760439b49cab77c59f5bfb9865d91a3
data/.travis.yml CHANGED
@@ -1,6 +1,12 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - "1.9.3"
4
- - "2.0.0"
4
+ - "2.0"
5
+ - "2.1"
5
6
  - jruby-19mode
6
- - rbx-19mode
7
+ matrix:
8
+ fast_finish: true
9
+ allow_failures:
10
+ - jruby-head
11
+ - ruby-head
12
+ - rbx-head
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Unschema - rebase your schema.rb
2
2
 
3
- [![Build Status](https://travis-ci.org/neopoly/unschema.png?branch=master)](https://travis-ci.org/neopoly/unschema) [![Gem Version](https://badge.fury.io/rb/unschema.png)](http://badge.fury.io/rb/unschema) [![Code Climate](https://codeclimate.com/github/neopoly/unschema.png)](https://codeclimate.com/github/neopoly/unschema)
3
+ [![Build Status](http://img.shields.io/travis/neopoly/unschema.svg?branch=master)](https://travis-ci.org/neopoly/unschema) [![Gem Version](http://img.shields.io/gem/v/unschema.svg)](https://rubygems.org/gems/unschema) [![Code Climate](http://img.shields.io/codeclimate/github/neopoly/unschema.svg)](https://codeclimate.com/github/neopoly/unschema) [![Inline docs](http://inch-ci.org/github/neopoly/unschema.svg?branch=master)](http://inch-ci.org/github/neopoly/unschema)
4
4
 
5
5
  Splits your schema.rb into separate migrations per table.
6
6
 
data/lib/unschema.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "unschema/version"
2
2
  require "unschema/base"
3
+ require "unschema/migration_dumper"
3
4
  require "unschema/schema_intermediator"
4
5
  require "unschema/fake_schema"
data/lib/unschema/base.rb CHANGED
@@ -34,42 +34,14 @@ module Unschema
34
34
  private
35
35
 
36
36
  def dump_table_calls(table_name, calls)
37
- File.open(File.join(migrations_path, "#{next_migration}_create_#{table_name}.rb"), "w") do |f|
38
- f << "class Create#{table_name.gsub(/^(\w)/){|s| s.upcase }.gsub(/(_\w)/){|s| s[-1, 1].upcase} } < ActiveRecord::Migration\n"
39
-
40
- f << " def change\n"
41
-
42
- calls.each do |call|
43
- str = " #{call.name} #{stringify_args call.args}"
44
-
45
- if call.block
46
- receiver = call.block.name
47
- str += " do |#{receiver}|\n"
48
-
49
- call.block.calls.each do |block_call|
50
- str += " #{receiver}.#{block_call.name} #{stringify_args block_call.args}\n"
51
- end
52
-
53
- str += " end\n"
54
- else
55
- str += "\n"
56
- end
57
-
58
-
59
- f << str
60
- end
61
-
62
- f << " end\nend"
37
+ file = File.join(migrations_path, "#{next_migration}_create_#{table_name}.rb")
38
+ File.open(file, "w") do |f|
39
+ MigrationDumper.new(table_name, calls).dump_to(f)
63
40
  end
64
41
  end
65
42
 
66
- def stringify_args(args)
67
- args.inspect.gsub(/^\[|\]$/,"")
68
- end
69
-
70
43
  def next_migration
71
44
  @version += 1
72
45
  end
73
-
74
46
  end
75
47
  end
@@ -0,0 +1,58 @@
1
+ module Unschema
2
+ class MigrationDumper
3
+ def initialize(table_name, calls)
4
+ @table_name = table_name
5
+ @calls = calls
6
+ end
7
+
8
+ def dump_to(f)
9
+ f << "class Create#{table_name_camelcased} < ActiveRecord::Migration\n"
10
+ f << " def change\n"
11
+
12
+ @calls.each do |call|
13
+ f << dump_call(call)
14
+ end
15
+
16
+ f << " end\n"
17
+ f << "end"
18
+ end
19
+
20
+ private
21
+
22
+ def dump_call(call)
23
+ str = " #{call.name} #{stringify_call call}"
24
+
25
+ if call.block
26
+ receiver = call.block.name
27
+ str << " do |#{receiver}|\n"
28
+
29
+ call.block.calls.each do |block_call|
30
+ str << " #{receiver}.#{block_call.name} #{stringify_call block_call}\n"
31
+ end
32
+
33
+ str << " end"
34
+ end
35
+
36
+ str << "\n"
37
+ str
38
+ end
39
+
40
+ def table_name_camelcased
41
+ @table_name.gsub(/^(\w)/){|s| s.upcase }.gsub(/(_\w)/) { |s| s[-1, 1].upcase }
42
+ end
43
+
44
+ def stringify_call(call)
45
+ args = stringify_args(call.args)
46
+ options = stringify_options(call.options) unless call.options.empty?
47
+ [ args, options ].compact.join(", ")
48
+ end
49
+
50
+ def stringify_args(args)
51
+ args.inspect.gsub(/^\[|\]$/,"")
52
+ end
53
+
54
+ def stringify_options(options)
55
+ options.map { |key, value| "#{key.inspect} => #{value.inspect}" }.join(", ")
56
+ end
57
+ end
58
+ end
@@ -1,6 +1,6 @@
1
1
  module Unschema
2
2
  class SchemaIntermediator
3
- attr_reader :root, :version
3
+ attr_reader :version
4
4
 
5
5
  def process(options, &block)
6
6
  @version = options[:version] || 0
@@ -9,15 +9,17 @@ module Unschema
9
9
  end
10
10
 
11
11
  def calls
12
- root.calls
12
+ @root.calls
13
13
  end
14
14
 
15
15
  class Call
16
- attr_reader :name, :args, :block, :calls
16
+ attr_reader :name, :args, :options, :block, :calls
17
+
17
18
  def initialize(name, *args, &block)
18
- @name = name
19
- @args = args
20
- @calls = []
19
+ @name = name
20
+ @args = args
21
+ @options = Hash === args.last ? args.pop : {}
22
+ @calls = []
21
23
 
22
24
  process_block!(block) if block
23
25
  end
@@ -27,6 +29,7 @@ module Unschema
27
29
  end
28
30
 
29
31
  private
32
+
30
33
  def process_block!(block)
31
34
  @block = self.class.new("t")
32
35
  block.call(@block)
@@ -1,3 +1,3 @@
1
1
  module Unschema
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
data/test/helper.rb CHANGED
@@ -2,13 +2,27 @@ require 'minitest/autorun'
2
2
 
3
3
  require 'unschema'
4
4
 
5
- class TestCase < MiniTest::Unit::TestCase
5
+ class TestCase < Minitest::Test
6
+ def assert_string(actual, expect)
7
+ assert_equal expect.unindent.chomp, actual.unindent
8
+ end
6
9
  end
7
10
 
8
11
  class String
9
12
  def unindent
10
- matched = %r{^\s*}.match self.split("\n").first
11
- indent = matched.end(0)
12
- self.gsub(%r{^\s{#{indent}}}, '')
13
+ gsub(%r{^\s{#{indentation}}}, '')
14
+ end
15
+
16
+ def indentation
17
+ first_line = split("\n").first
18
+ if match = %r{^\s*}.match(first_line)
19
+ match.end(0)
20
+ else
21
+ 0
22
+ end
23
+ end
24
+
25
+ def indent(level)
26
+ gsub(%r{^}, " " * level)
13
27
  end
14
28
  end
@@ -25,14 +25,14 @@ class EndToEndTest < TestCase
25
25
  assert_migration "20130222131357_create_table1.rb", <<-MIGRATION
26
26
  class CreateTable1 < ActiveRecord::Migration
27
27
  def change
28
- create_table "table1", {:force=>true} do |t|
28
+ create_table "table1", :force => true do |t|
29
29
  t.string "str"
30
30
  t.integer "int"
31
31
  t.datetime "created_at"
32
32
  t.datetime "updated_at"
33
33
  end
34
- add_index "table1", ["id"], {:name=>"the_index_1", :unique=>true}
35
- add_index "table1", ["doesnt_make_sende"], {:name=>"the_index_2", :unique=>true, :wrong_attr=>1}
34
+ add_index "table1", ["id"], :name => "the_index_1", :unique => true
35
+ add_index "table1", ["doesnt_make_sende"], :name => "the_index_2", :unique => true, :wrong_attr => 1
36
36
  end
37
37
  end
38
38
  MIGRATION
@@ -40,11 +40,11 @@ class EndToEndTest < TestCase
40
40
  assert_migration "20130222131358_create_the_table2.rb", <<-MIGRATION
41
41
  class CreateTheTable2 < ActiveRecord::Migration
42
42
  def change
43
- create_table "the_table2", {:force=>true} do |t|
43
+ create_table "the_table2", :force => true do |t|
44
44
  t.date "date"
45
- t.integer "max_online", {:default=>0}
45
+ t.integer "max_online", :default => 0
46
46
  end
47
- add_index "the_table2", ["date"], {:name=>"index_statistics_on_date_and"}
47
+ add_index "the_table2", ["date"], :name => "index_statistics_on_date_and"
48
48
  end
49
49
  end
50
50
  MIGRATION
@@ -55,7 +55,7 @@ class EndToEndTest < TestCase
55
55
  def assert_migration(path, expect)
56
56
  actual = File.read(migrations_path.join path)
57
57
 
58
- assert_equal expect.unindent.chomp, actual.unindent
58
+ assert_string actual, expect
59
59
  end
60
60
 
61
61
  def schema_file
@@ -0,0 +1,38 @@
1
+ require 'helper'
2
+
3
+ class HelperTest < TestCase
4
+ def test_unindent
5
+ expect = <<-STR
6
+ foo
7
+ bar
8
+ STR
9
+ actual = <<-STR
10
+ foo
11
+ bar
12
+ STR
13
+
14
+ assert_equal expect, actual.unindent
15
+ end
16
+
17
+ def test_identatition
18
+ assert_equal 0, "".indentation
19
+ assert_equal 1, " ".indentation
20
+ assert_equal 2, <<-STR.indentation
21
+ foo
22
+ bar
23
+ STR
24
+ end
25
+
26
+ def test_indent
27
+ expect = <<-STR
28
+ foo
29
+ bar
30
+ STR
31
+ actual = <<-STR
32
+ foo
33
+ bar
34
+ STR
35
+
36
+ assert_equal expect, actual.indent(2)
37
+ end
38
+ end
@@ -0,0 +1,71 @@
1
+ require 'stringio'
2
+ require 'helper'
3
+
4
+ class MigrationDumperTest < TestCase
5
+ def test_without_calls
6
+ create_dumper
7
+
8
+ assert_change <<-STR
9
+ STR
10
+ end
11
+
12
+ def test_create_table_call
13
+ create_dumper \
14
+ create_call(:create_table, "table", :force => true) { |t|
15
+ t.string "uid", :limit => 32, :unique => true
16
+ t.integer "amount"
17
+ }
18
+
19
+ assert_change <<-STR
20
+ create_table "table", :force => true do |t|
21
+ t.string "uid", :limit => 32, :unique => true
22
+ t.integer "amount"
23
+ end
24
+ STR
25
+ end
26
+
27
+ def test_index_call
28
+ create_dumper \
29
+ create_call(:add_index, "table", "uid", :unique => true),
30
+ create_call(:add_index, "table", %w[composite index])
31
+
32
+ assert_change <<-STR
33
+ add_index "table", "uid", :unique => true
34
+ add_index "table", ["composite", "index"]
35
+ STR
36
+ end
37
+
38
+ private
39
+
40
+ def create_dumper(*calls)
41
+ @dumper = Unschema::MigrationDumper.new("foo_bar", calls)
42
+ end
43
+
44
+ def create_call(name, *args, &block)
45
+ Unschema::SchemaIntermediator::Call.new(name, *args, &block)
46
+ end
47
+
48
+ def assert_change(inner)
49
+ expect = <<-STR
50
+ class CreateFooBar < ActiveRecord::Migration
51
+ def change
52
+ STR
53
+
54
+ unless inner.empty?
55
+ expect << inner.unindent.indent(expect.indentation + 4)
56
+ end
57
+
58
+ expect << <<-STR
59
+ end
60
+ end
61
+ STR
62
+
63
+ assert_dump expect
64
+ end
65
+
66
+ def assert_dump(expect)
67
+ io = StringIO.new
68
+ @dumper.dump_to(io)
69
+ assert_string io.string, expect
70
+ end
71
+ end
data/unschema.gemspec CHANGED
@@ -18,4 +18,5 @@ Gem::Specification.new do |gem|
18
18
  gem.require_paths = ["lib"]
19
19
 
20
20
  gem.add_development_dependency 'rake'
21
+ gem.add_development_dependency 'minitest', '~> 5.3.5'
21
22
  end
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unschema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jakob Holderbaum
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-12 00:00:00.000000000 Z
11
+ date: 2014-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 5.3.5
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 5.3.5
27
41
  description: Splits your current schema.rb into per-table migrations. Think of it
28
42
  as >rebase< for your migrations.
29
43
  email:
@@ -33,8 +47,8 @@ executables:
33
47
  extensions: []
34
48
  extra_rdoc_files: []
35
49
  files:
36
- - .gitignore
37
- - .travis.yml
50
+ - ".gitignore"
51
+ - ".travis.yml"
38
52
  - Gemfile
39
53
  - LICENSE.txt
40
54
  - README.md
@@ -43,12 +57,15 @@ files:
43
57
  - lib/unschema.rb
44
58
  - lib/unschema/base.rb
45
59
  - lib/unschema/fake_schema.rb
60
+ - lib/unschema/migration_dumper.rb
46
61
  - lib/unschema/schema_intermediator.rb
47
62
  - lib/unschema/version.rb
48
63
  - test/helper.rb
49
64
  - test/integration/end_to_end_test.rb
50
65
  - test/integration/fixtures/schema.rb
51
66
  - test/integration/target/.keep
67
+ - test/unit/helper_test.rb
68
+ - test/unit/migration_dumper_test.rb
52
69
  - unschema.gemspec
53
70
  homepage: https://github.com/neopoly/unschema
54
71
  licenses: []
@@ -59,17 +76,17 @@ require_paths:
59
76
  - lib
60
77
  required_ruby_version: !ruby/object:Gem::Requirement
61
78
  requirements:
62
- - - '>='
79
+ - - ">="
63
80
  - !ruby/object:Gem::Version
64
81
  version: '0'
65
82
  required_rubygems_version: !ruby/object:Gem::Requirement
66
83
  requirements:
67
- - - '>='
84
+ - - ">="
68
85
  - !ruby/object:Gem::Version
69
86
  version: '0'
70
87
  requirements: []
71
88
  rubyforge_project:
72
- rubygems_version: 2.0.3
89
+ rubygems_version: 2.2.2
73
90
  signing_key:
74
91
  specification_version: 4
75
92
  summary: Splits your current schema.rb into per-table migrations
@@ -78,3 +95,5 @@ test_files:
78
95
  - test/integration/end_to_end_test.rb
79
96
  - test/integration/fixtures/schema.rb
80
97
  - test/integration/target/.keep
98
+ - test/unit/helper_test.rb
99
+ - test/unit/migration_dumper_test.rb