schema_plus_core 0.6.2 → 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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +8 -10
- data/gemfiles/activerecord-4.2/Gemfile.base +1 -1
- data/gemfiles/activerecord-4.2/Gemfile.mysql2 +2 -2
- data/lib/schema_plus/core/active_record/connection_adapters/postgresql_adapter.rb +18 -0
- data/lib/schema_plus/core/active_record/schema_dumper.rb +2 -2
- data/lib/schema_plus/core/schema_dump.rb +5 -21
- data/lib/schema_plus/core/version.rb +1 -1
- data/schema_plus_core.gemspec +1 -1
- data/spec/dumper_spec.rb +17 -8
- metadata +4 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 931e01737ac5749b51d990bfa8114372d6c2d136
         | 
| 4 | 
            +
              data.tar.gz: af03d82fa6dbd69359cd92a85ddb2d0f074a3ac5
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 39cdbc108fffe0448e25985532abe46ae8ba94297990fdd4a59893d3977c72227d479832136a3471785dc0b5713cb9ac29a0aeb58d6dc896e693a3c99d0156e5
         | 
| 7 | 
            +
              data.tar.gz: 57f38c4464a784504498225f021346e3aeb1226100e7e7deccef7d622d11f8015a504d0d94aa955991cdcc6d0d70958d29320052243a6d656f4ee2a8ed77d0d8
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -101,7 +101,7 @@ Stacks for general operations queries pertaining to the entire database schema: | |
| 101 101 | 
             
            * `Schema::Define`
         | 
| 102 102 |  | 
| 103 103 | 
             
              Wrapper around the `ActiveRecord::Schema.define` method loads a dumped schema file (`schema.rb`).
         | 
| 104 | 
            -
             | 
| 104 | 
            +
             | 
| 105 105 | 
             
                Env Field    | Description | Initial value
         | 
| 106 106 | 
             
                --- | --- | ---
         | 
| 107 107 | 
             
                `:info` | Schema information hash | *args*
         | 
| @@ -377,10 +377,8 @@ SchemaPlus::Core provides a state object and of callbacks to various phases of t | |
| 377 377 |  | 
| 378 378 | 
             
              * `column.name` - the column name
         | 
| 379 379 | 
             
              * `column.type` - the column type (i.e., what comes after `"t."`)
         | 
| 380 | 
            -
              * `column.options` -  | 
| 381 | 
            -
              * `column.comments` - an  | 
| 382 | 
            -
              * `column.add_option(option)` - adds an option to the current string, separating with a "," if the current set isn't blank
         | 
| 383 | 
            -
              * `column.add_comment(comment)` - adds an option to the current string, separating with a ";" if the current string isn't blank
         | 
| 380 | 
            +
              * `column.options` - a hash containing the options for the column
         | 
| 381 | 
            +
              * `column.comments` - an array of comment strings for the column
         | 
| 384 382 |  | 
| 385 383 | 
             
            * `Class SchemaPlus::Core::SchemaDump::Table::Index`
         | 
| 386 384 |  | 
| @@ -388,8 +386,7 @@ SchemaPlus::Core provides a state object and of callbacks to various phases of t | |
| 388 386 |  | 
| 389 387 | 
             
              * `index.name` - the index name
         | 
| 390 388 | 
             
              * `index.columns` - the columns that are in the index
         | 
| 391 | 
            -
              * `index.options` -  | 
| 392 | 
            -
              * `index.add_option(option)` - adds an option to the current string, separating with a "," if the current set isn't blank
         | 
| 389 | 
            +
              * `index.options` - a hash containing the options for the column
         | 
| 393 390 |  | 
| 394 391 | 
             
            #### Schema Dump Middleware stacks
         | 
| 395 392 |  | 
| @@ -450,14 +447,15 @@ SchemaPlus::Core provides a state object and of callbacks to various phases of t | |
| 450 447 | 
             
              The base method appends the collection of SchemaDump::Table::Index objects to `env.table.indexes`
         | 
| 451 448 |  | 
| 452 449 | 
             
            ## History
         | 
| 450 | 
            +
            * 1.0.0 Clean up `SchemaDump::Table::Column` and `SchemaDump::Table::Index` API:  `#options` is now a hash and `#comments` is now an array; no longer have `add_option` and `add_comment` methods.
         | 
| 453 451 | 
             
            * 0.6.2 Bug fix: don't choke on INHERITANCE in table definition (#7).  Thanks to [@ADone](https://github.com/ADone).
         | 
| 454 452 | 
             
            * 0.6.1 Make sure to require pathname (#5)
         | 
| 455 453 | 
             
            * 0.6.0 Added `table.alt` to dumper; Bug fix: Don't crash when AR fails to dump a table. Thanks to [@stenver](https://github.com/stenver) for tracking it down
         | 
| 456 | 
            -
            * 0.5.1 Bug fix: Don't choke on a quoted newline in a `CREATE TABLE` statement ([#3](https://github.com/SchemaPlus/schema_plus_core/pull/3)).  Thanks to [@mikeauclair](https://github.com/mikeauclair) | 
| 454 | 
            +
            * 0.5.1 Bug fix: Don't choke on a quoted newline in a `CREATE TABLE` statement ([#3](https://github.com/SchemaPlus/schema_plus_core/pull/3)).  Thanks to [@mikeauclair](https://github.com/mikeauclair)
         | 
| 457 455 | 
             
            * 0.5.0 Added `Migration::DropTable`
         | 
| 458 456 | 
             
            * 0.4.0 Added `implements_reference` to `Migration::Column` stack env
         | 
| 459 | 
            -
            * 0.3.1 Pass along (undocumented) return values from association declarations ([#2](https://github.com/SchemaPlus/schema_plus_core/pull/2)).  Thanks to [@lowjoel](https://github.com/lowjoel) | 
| 460 | 
            -
            * 0.3.0 Added `Model::Association::Declaration` ([#1](https://github.com/SchemaPlus/schema_plus_core/pull/1)).  Thanks to [@lowjoel](https://github.com/lowjoel). | 
| 457 | 
            +
            * 0.3.1 Pass along (undocumented) return values from association declarations ([#2](https://github.com/SchemaPlus/schema_plus_core/pull/2)).  Thanks to [@lowjoel](https://github.com/lowjoel)
         | 
| 458 | 
            +
            * 0.3.0 Added `Model::Association::Declaration` ([#1](https://github.com/SchemaPlus/schema_plus_core/pull/1)).  Thanks to [@lowjoel](https://github.com/lowjoel).
         | 
| 461 459 | 
             
            * 0.2.1 Added `Migration::CreateTable` and `Schema::Define`; removed dependency on (defunct) `schema_monkey_rails` gem.  [Oops, this should have been a minor version bump]
         | 
| 462 460 | 
             
            * 0.2.0 Added `Migration::DropTable`
         | 
| 463 461 | 
             
            * 0.1.0 Initial release
         | 
| @@ -4,6 +4,24 @@ module SchemaPlus | |
| 4 4 | 
             
                  module ConnectionAdapters
         | 
| 5 5 | 
             
                    module PostgresqlAdapter
         | 
| 6 6 |  | 
| 7 | 
            +
                      # quick hack fix quoting of column default functions to allow eval() when we
         | 
| 8 | 
            +
                      # capture the stream.
         | 
| 9 | 
            +
                      #
         | 
| 10 | 
            +
                      # AR's PostgresqlAdapter#prepare_column_options wraps the
         | 
| 11 | 
            +
                      # function in double quotes, which doesn't work because the
         | 
| 12 | 
            +
                      # function itself may have doublequotes in it which don't get
         | 
| 13 | 
            +
                      # escaped properly.  
         | 
| 14 | 
            +
                      #
         | 
| 15 | 
            +
                      # Arguably that's a bug in AR, but then again default function
         | 
| 16 | 
            +
                      # expressions don't work well in AR anyway.  (hence
         | 
| 17 | 
            +
                      # schema_plus_default_expr )
         | 
| 18 | 
            +
                      #
         | 
| 19 | 
            +
                      def prepare_column_options(column, types) # :nodoc:
         | 
| 20 | 
            +
                        spec = super
         | 
| 21 | 
            +
                        spec[:default] = "%q{#{column.default_function}}" if column.default_function
         | 
| 22 | 
            +
                        spec
         | 
| 23 | 
            +
                      end
         | 
| 24 | 
            +
             | 
| 7 25 | 
             
                      def change_column(table_name, name, type, options = {})
         | 
| 8 26 | 
             
                        SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :change, table_name: table_name, column_name: name, type: type, options: options.deep_dup) do |env|
         | 
| 9 27 | 
             
                          super env.table_name, env.column_name, env.type, env.options
         | 
| @@ -75,7 +75,7 @@ module SchemaPlus | |
| 75 75 | 
             
                              (?<options>.*)
         | 
| 76 76 | 
             
                            $
         | 
| 77 77 | 
             
                            }x
         | 
| 78 | 
            -
                            SchemaDump::Table::Column.new | 
| 78 | 
            +
                            SchemaDump::Table::Column.new name: m[:name], type: m[:type], options: eval("{" + m[:options] + "}"), comments: []
         | 
| 79 79 | 
             
                          }
         | 
| 80 80 | 
             
                        end
         | 
| 81 81 | 
             
                      end
         | 
| @@ -96,7 +96,7 @@ module SchemaPlus | |
| 96 96 | 
             
                            $
         | 
| 97 97 | 
             
                          }x
         | 
| 98 98 | 
             
                          columns = m[:columns].tr(%q{[]'":}, '').strip.split(/\s*,\s*/)
         | 
| 99 | 
            -
                          SchemaDump::Table::Index.new name: m[:name], columns: columns, options: m[:options]
         | 
| 99 | 
            +
                          SchemaDump::Table::Index.new name: m[:name], columns: columns, options: eval("{#{m[:options]}}")
         | 
| 100 100 | 
             
                        }
         | 
| 101 101 | 
             
                      end
         | 
| 102 102 | 
             
                    end
         | 
| @@ -85,41 +85,25 @@ module SchemaPlus | |
| 85 85 |  | 
| 86 86 | 
             
                    class Column < KeyStruct[:name, :type, :options, :comments]
         | 
| 87 87 |  | 
| 88 | 
            -
                      def add_option(option)
         | 
| 89 | 
            -
                        self.options = [options, option].reject(&:blank?).join(', ')
         | 
| 90 | 
            -
                      end
         | 
| 91 | 
            -
             | 
| 92 | 
            -
                      def add_comment(comment)
         | 
| 93 | 
            -
                        self.comments = [comments, comment].reject(&:blank?).join('; ')
         | 
| 94 | 
            -
                      end
         | 
| 95 | 
            -
             | 
| 96 88 | 
             
                      def assemble(stream, typelen, namelen)
         | 
| 97 89 | 
             
                        stream.write "t.%-#{typelen}s " % type
         | 
| 98 90 | 
             
                        if options.blank? && comments.blank?
         | 
| 99 91 | 
             
                          stream.write name.inspect
         | 
| 100 92 | 
             
                        else
         | 
| 101 93 | 
             
                          pr = name.inspect
         | 
| 102 | 
            -
                          pr +=  | 
| 94 | 
            +
                          pr += ',' unless options.blank?
         | 
| 103 95 | 
             
                          stream.write "%-#{namelen+3}s " % pr
         | 
| 104 96 | 
             
                        end
         | 
| 105 | 
            -
                        stream.write  | 
| 106 | 
            -
                        stream.write  | 
| 107 | 
            -
                        stream.write  | 
| 97 | 
            +
                        stream.write options.to_s.sub(/^{(.*)}$/, '\1') unless options.blank?
         | 
| 98 | 
            +
                        stream.write ' ' unless options.blank? or comments.blank?
         | 
| 99 | 
            +
                        stream.write '# ' + comments.join('; ') unless comments.blank?
         | 
| 108 100 | 
             
                      end
         | 
| 109 101 | 
             
                    end
         | 
| 110 102 |  | 
| 111 103 | 
             
                    class Index < KeyStruct[:name, :columns, :options]
         | 
| 112 104 |  | 
| 113 | 
            -
                      def add_option(option)
         | 
| 114 | 
            -
                        self.options = [options, option].reject(&:blank?).join(', ')
         | 
| 115 | 
            -
                      end
         | 
| 116 | 
            -
             | 
| 117 105 | 
             
                      def assemble(stream)
         | 
| 118 | 
            -
                        stream.write  | 
| 119 | 
            -
                          columns.inspect,
         | 
| 120 | 
            -
                          "name: #{name.inspect}",
         | 
| 121 | 
            -
                          options
         | 
| 122 | 
            -
                        ].reject(&:blank?).join(", ")
         | 
| 106 | 
            +
                        stream.write columns.inspect + ", " + {name: name}.merge(options).to_s.sub(/^{(.*)}$/, '\1')
         | 
| 123 107 | 
             
                      end
         | 
| 124 108 | 
             
                    end
         | 
| 125 109 | 
             
                  end
         | 
    
        data/schema_plus_core.gemspec
    CHANGED
    
    | @@ -25,7 +25,7 @@ Gem::Specification.new do |gem| | |
| 25 25 | 
             
              gem.add_development_dependency "rake", "~> 10.0"
         | 
| 26 26 | 
             
              gem.add_development_dependency "rspec", "~> 3.0.0"
         | 
| 27 27 | 
             
              gem.add_development_dependency "rspec-given"
         | 
| 28 | 
            -
              gem.add_development_dependency "schema_dev", "~> 3. | 
| 28 | 
            +
              gem.add_development_dependency "schema_dev", "~> 3.6"
         | 
| 29 29 | 
             
              gem.add_development_dependency "simplecov"
         | 
| 30 30 | 
             
              gem.add_development_dependency "simplecov-gem-profile"
         | 
| 31 31 | 
             
            end
         | 
    
        data/spec/dumper_spec.rb
    CHANGED
    
    | @@ -24,8 +24,8 @@ module TestDumper | |
| 24 24 | 
             
                    def after(env)
         | 
| 25 25 | 
             
                      return unless middleware = enabled_middleware(TestDumper, env)
         | 
| 26 26 | 
             
                      if column = env.table.columns.first
         | 
| 27 | 
            -
                        column. | 
| 28 | 
            -
                        column. | 
| 27 | 
            +
                        column.options[:option] = middleware.to_s
         | 
| 28 | 
            +
                        column.comments << "comment: #{middleware}"
         | 
| 29 29 | 
             
                      end
         | 
| 30 30 | 
             
                      env.table.statements << "statement: #{middleware}"
         | 
| 31 31 | 
             
                      env.table.trailer << "trailer: #{middleware}"
         | 
| @@ -36,7 +36,7 @@ module TestDumper | |
| 36 36 | 
             
                    def after(env)
         | 
| 37 37 | 
             
                      return unless env.table.indexes.any?
         | 
| 38 38 | 
             
                      return unless middleware = enabled_middleware(TestDumper, env)
         | 
| 39 | 
            -
                      env.table.indexes.first. | 
| 39 | 
            +
                      env.table.indexes.first.options[:option] = middleware.to_s
         | 
| 40 40 | 
             
                    end
         | 
| 41 41 | 
             
                  end
         | 
| 42 42 | 
             
                end
         | 
| @@ -72,6 +72,15 @@ describe SchemaMonkey::Middleware::Dumper do | |
| 72 72 | 
             
                migration.execute "CREATE TABLE custom_table ( my_column custom_type DEFAULT 'a'::custom_type NOT NULL)" if TestCustomType
         | 
| 73 73 | 
             
              end
         | 
| 74 74 |  | 
| 75 | 
            +
              context "column default expressions", postgresql: :only do
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                before(:each) do
         | 
| 78 | 
            +
                  migration.execute %Q{ALTER TABLE "things" ADD "defexpr" character varying DEFAULT substring((random())::text, 3, 6)}
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                Then { expect(dump use_middleware: false).to match(/\\"substring\\"\(\(random/) }
         | 
| 82 | 
            +
              end
         | 
| 83 | 
            +
             | 
| 75 84 | 
             
              context TestDumper::Middleware::Dumper::Initial do
         | 
| 76 85 | 
             
                Then { expect(dump).to match(/Schema[.]define.*do\s+#{middleware}/) }
         | 
| 77 86 | 
             
              end
         | 
| @@ -81,13 +90,13 @@ describe SchemaMonkey::Middleware::Dumper do | |
| 81 90 | 
             
              end
         | 
| 82 91 |  | 
| 83 92 | 
             
              context TestDumper::Middleware::Dumper::Table do
         | 
| 84 | 
            -
                Then { expect(dump).to match(/t[.]integer | 
| 93 | 
            +
                Then { expect(dump).to match(/t[.]integer.*:option=>"#{middleware}" \# comment: #{middleware}/) }
         | 
| 85 94 | 
             
                Then { expect(dump).to match(/statement: #{middleware}\s+end\s+(add_index.*)?\s+trailer: #{middleware}/) }
         | 
| 86 95 | 
             
                Then { expect(dump).to match(/could not dump table.*custom_table.*unknown type.*custom_type/mi) } if TestCustomType
         | 
| 87 96 | 
             
              end
         | 
| 88 97 |  | 
| 89 98 | 
             
              context TestDumper::Middleware::Dumper::Indexes do
         | 
| 90 | 
            -
                Then { expect(dump).to match(/add_index | 
| 99 | 
            +
                Then { expect(dump).to match(/add_index.*:option=>"#{middleware}"/) }
         | 
| 91 100 | 
             
              end
         | 
| 92 101 |  | 
| 93 102 |  | 
| @@ -97,14 +106,14 @@ describe SchemaMonkey::Middleware::Dumper do | |
| 97 106 | 
             
                described_class
         | 
| 98 107 | 
             
              end
         | 
| 99 108 |  | 
| 100 | 
            -
              def dump
         | 
| 109 | 
            +
              def dump(use_middleware: true)
         | 
| 101 110 | 
             
                begin
         | 
| 102 | 
            -
                  middleware.enable once:false
         | 
| 111 | 
            +
                  middleware.enable once:false if use_middleware
         | 
| 103 112 | 
             
                  stream = StringIO.new
         | 
| 104 113 | 
             
                  ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
         | 
| 105 114 | 
             
                  return stream.string
         | 
| 106 115 | 
             
                ensure
         | 
| 107 | 
            -
                  middleware.disable
         | 
| 116 | 
            +
                  middleware.disable if use_middleware
         | 
| 108 117 | 
             
                end
         | 
| 109 118 | 
             
              end
         | 
| 110 119 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: schema_plus_core
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 1.0.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - ronen barzel
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2016- | 
| 11 | 
            +
            date: 2016-03-24 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: activerecord
         | 
| @@ -100,14 +100,14 @@ dependencies: | |
| 100 100 | 
             
                requirements:
         | 
| 101 101 | 
             
                - - "~>"
         | 
| 102 102 | 
             
                  - !ruby/object:Gem::Version
         | 
| 103 | 
            -
                    version: '3. | 
| 103 | 
            +
                    version: '3.6'
         | 
| 104 104 | 
             
              type: :development
         | 
| 105 105 | 
             
              prerelease: false
         | 
| 106 106 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 107 107 | 
             
                requirements:
         | 
| 108 108 | 
             
                - - "~>"
         | 
| 109 109 | 
             
                  - !ruby/object:Gem::Version
         | 
| 110 | 
            -
                    version: '3. | 
| 110 | 
            +
                    version: '3.6'
         | 
| 111 111 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 112 112 | 
             
              name: simplecov
         | 
| 113 113 | 
             
              requirement: !ruby/object:Gem::Requirement
         |