conventional_models 0.1.2 → 0.2.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.
- data/README.rdoc +43 -1
- data/VERSION +1 -1
- data/bin/cmconsole +45 -0
- data/conventional_models.gemspec +17 -3
- data/features/cmconsole.feature +34 -0
- data/features/conventional_models.feature +3 -3
- data/features/output_model_code.feature +1 -1
- data/features/step_definitions/cmconsole_steps.rb +0 -0
- data/features/support/env.rb +6 -5
- data/lib/conventional_models.rb +29 -2
- data/lib/conventional_models/cli.rb +61 -0
- data/lib/conventional_models/database.rb +32 -20
- data/lib/conventional_models/option_parser.rb +50 -0
- data/lib/conventional_models/options.rb +16 -0
- data/lib/conventional_models/table.rb +24 -15
- data/lib/conventional_models/version.rb +2 -2
- data/spec/conventional_models/cli_spec.rb +114 -0
- data/spec/conventional_models/database_spec.rb +49 -28
- data/spec/conventional_models/option_parser_spec.rb +44 -0
- data/spec/conventional_models/options_spec.rb +35 -0
- data/spec/conventional_models/table_spec.rb +45 -17
- data/spec/conventional_models_spec.rb +34 -11
- data/spec/spec_helper.rb +0 -1
- metadata +18 -6
    
        data/README.rdoc
    CHANGED
    
    | @@ -48,11 +48,53 @@ Output: | |
| 48 48 | 
             
                belongs_to_matcher {|column| column.name.end_with? "_id"}
         | 
| 49 49 | 
             
                belongs_to_name {|column| column.name.gsub(/_id$/, "")}
         | 
| 50 50 | 
             
                primary_key_name "id"
         | 
| 51 | 
            -
                table_name {|name| name.pluralize}
         | 
| 52 51 | 
             
                class_name {|table_name| table_name.singularize.camelize}
         | 
| 53 52 | 
             
                ignore_tables "schema_migrations", "sqlite_sequence", "sysdiagrams"
         | 
| 54 53 | 
             
              end
         | 
| 55 54 |  | 
| 55 | 
            +
            == cmconsole command
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            Starts an IRB session and configures activerecord for you based on what is in config/database.yml.
         | 
| 58 | 
            +
             | 
| 59 | 
            +
            === Usage 
         | 
| 60 | 
            +
              cmconsole [options]
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              For help use: cmconsole -h
         | 
| 63 | 
            +
             | 
| 64 | 
            +
            === Options
         | 
| 65 | 
            +
              -h, --help            Displays help message
         | 
| 66 | 
            +
              -v, --version         Display the version, then exit
         | 
| 67 | 
            +
              -e, --environment     Specify the database env to use, default to development
         | 
| 68 | 
            +
              -c, --config          Where database.yml lives
         | 
| 69 | 
            +
              -s, --skip-configure  Don't configure ConventionalModels automatically
         | 
| 70 | 
            +
              -V, --verbose         Verbose
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            == Rake
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            You can use this from rake as follows:
         | 
| 75 | 
            +
             | 
| 76 | 
            +
              # Confiigure active_record as you would normally
         | 
| 77 | 
            +
              
         | 
| 78 | 
            +
              task :console do
         | 
| 79 | 
            +
                require 'irb'
         | 
| 80 | 
            +
                require 'conventional_models'
         | 
| 81 | 
            +
                ConventionalModels.configure do
         | 
| 82 | 
            +
                  primary_key_name "Id"
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
                puts ConventionalModels.model_code
         | 
| 85 | 
            +
                IRB.start
         | 
| 86 | 
            +
              end
         | 
| 87 | 
            +
              
         | 
| 88 | 
            +
             | 
| 89 | 
            +
            == Why?
         | 
| 90 | 
            +
             | 
| 91 | 
            +
            I use this for data migrations or quick scripting tasks on databases that don't follow rails 
         | 
| 92 | 
            +
            conventions.
         | 
| 93 | 
            +
             | 
| 94 | 
            +
            == TODO
         | 
| 95 | 
            +
             | 
| 96 | 
            +
             | 
| 97 | 
            +
             | 
| 56 98 | 
             
            == Note on Patches/Pull Requests
         | 
| 57 99 |  | 
| 58 100 | 
             
            * Fork the project.
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0. | 
| 1 | 
            +
            0.2.0
         | 
    
        data/bin/cmconsole
    ADDED
    
    | @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # == Synopsis 
         | 
| 4 | 
            +
            #   cmconsole starts an IRB session and configures activerecord for you 
         | 
| 5 | 
            +
            #   based on what is in config/database.yml.
         | 
| 6 | 
            +
            #
         | 
| 7 | 
            +
            # == Examples
         | 
| 8 | 
            +
            #   Default options when you run cmconsosole are:
         | 
| 9 | 
            +
            #     cmconsole --config config/database.yml -e development
         | 
| 10 | 
            +
            #
         | 
| 11 | 
            +
            #   Other examples:
         | 
| 12 | 
            +
            #     cmconsole --skip-configure
         | 
| 13 | 
            +
            #
         | 
| 14 | 
            +
            # == Usage 
         | 
| 15 | 
            +
            #   cmconsole [options]
         | 
| 16 | 
            +
            #
         | 
| 17 | 
            +
            #   For help use: cmconsole -h
         | 
| 18 | 
            +
            #
         | 
| 19 | 
            +
            # == Options
         | 
| 20 | 
            +
            #   -h, --help            Displays help message
         | 
| 21 | 
            +
            #   -v, --version         Display the version, then exit
         | 
| 22 | 
            +
            #   -e, --environment     Specify the database env to use
         | 
| 23 | 
            +
            #   -c, --config          Where database.yml lives
         | 
| 24 | 
            +
            #   -s, --skip-configure  Don't configure ConventionalModels automatically
         | 
| 25 | 
            +
            #   -V, --verbose         Verbose
         | 
| 26 | 
            +
            #
         | 
| 27 | 
            +
            # == Author
         | 
| 28 | 
            +
            #   Steve Hodgkiss
         | 
| 29 | 
            +
            #
         | 
| 30 | 
            +
            # == Copyright
         | 
| 31 | 
            +
            #   Copyright (c) 2007 Steve Hodgkiss. Licensed under the MIT License:
         | 
| 32 | 
            +
            #   http://www.opensource.org/licenses/mit-license.php
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
         | 
| 35 | 
            +
            begin
         | 
| 36 | 
            +
              require 'conventional_models'
         | 
| 37 | 
            +
            rescue LoadError
         | 
| 38 | 
            +
              if File.symlink? __FILE__
         | 
| 39 | 
            +
                require File.dirname(File.readlink(__FILE__)) + '/../lib/conventional_models'
         | 
| 40 | 
            +
              else
         | 
| 41 | 
            +
                require File.dirname(__FILE__) + '/../lib/conventional_models'
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
            end
         | 
| 44 | 
            +
            cli = ConventionalModels::CLI.new(ARGV)
         | 
| 45 | 
            +
            cli.run
         | 
    
        data/conventional_models.gemspec
    CHANGED
    
    | @@ -5,13 +5,15 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.name = %q{conventional_models}
         | 
| 8 | 
            -
              s.version = "0. | 
| 8 | 
            +
              s.version = "0.2.0"
         | 
| 9 9 |  | 
| 10 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = ["Steve Hodgkiss"]
         | 
| 12 | 
            -
              s.date = %q{2010-04- | 
| 12 | 
            +
              s.date = %q{2010-04-11}
         | 
| 13 | 
            +
              s.default_executable = %q{cmconsole}
         | 
| 13 14 | 
             
              s.description = %q{Generate ActiveRecord models automatically with basic relationships based on conventions.}
         | 
| 14 15 | 
             
              s.email = %q{steve@hodgkiss.me.uk}
         | 
| 16 | 
            +
              s.executables = ["cmconsole"]
         | 
| 15 17 | 
             
              s.extra_rdoc_files = [
         | 
| 16 18 | 
             
                "LICENSE",
         | 
| 17 19 | 
             
                 "README.rdoc"
         | 
| @@ -25,21 +27,30 @@ Gem::Specification.new do |s| | |
| 25 27 | 
             
                 "README.rdoc",
         | 
| 26 28 | 
             
                 "Rakefile",
         | 
| 27 29 | 
             
                 "VERSION",
         | 
| 30 | 
            +
                 "bin/cmconsole",
         | 
| 28 31 | 
             
                 "conventional_models.gemspec",
         | 
| 32 | 
            +
                 "features/cmconsole.feature",
         | 
| 29 33 | 
             
                 "features/conventional_models.feature",
         | 
| 30 34 | 
             
                 "features/output_model_code.feature",
         | 
| 35 | 
            +
                 "features/step_definitions/cmconsole_steps.rb",
         | 
| 31 36 | 
             
                 "features/step_definitions/conventional_models_steps.rb",
         | 
| 32 37 | 
             
                 "features/step_definitions/output_model_code_steps.rb",
         | 
| 33 38 | 
             
                 "features/support/env.rb",
         | 
| 34 39 | 
             
                 "lib/conventional_models.rb",
         | 
| 35 40 | 
             
                 "lib/conventional_models/active_record_base_model_for.rb",
         | 
| 41 | 
            +
                 "lib/conventional_models/cli.rb",
         | 
| 36 42 | 
             
                 "lib/conventional_models/column.rb",
         | 
| 37 43 | 
             
                 "lib/conventional_models/conventions.rb",
         | 
| 38 44 | 
             
                 "lib/conventional_models/database.rb",
         | 
| 45 | 
            +
                 "lib/conventional_models/option_parser.rb",
         | 
| 46 | 
            +
                 "lib/conventional_models/options.rb",
         | 
| 39 47 | 
             
                 "lib/conventional_models/table.rb",
         | 
| 40 48 | 
             
                 "lib/conventional_models/version.rb",
         | 
| 49 | 
            +
                 "spec/conventional_models/cli_spec.rb",
         | 
| 41 50 | 
             
                 "spec/conventional_models/conventions_spec.rb",
         | 
| 42 51 | 
             
                 "spec/conventional_models/database_spec.rb",
         | 
| 52 | 
            +
                 "spec/conventional_models/option_parser_spec.rb",
         | 
| 53 | 
            +
                 "spec/conventional_models/options_spec.rb",
         | 
| 43 54 | 
             
                 "spec/conventional_models/table_spec.rb",
         | 
| 44 55 | 
             
                 "spec/conventional_models_spec.rb",
         | 
| 45 56 | 
             
                 "spec/spec.opts",
         | 
| @@ -51,8 +62,11 @@ Gem::Specification.new do |s| | |
| 51 62 | 
             
              s.rubygems_version = %q{1.3.6}
         | 
| 52 63 | 
             
              s.summary = %q{Generate ActiveRecord models. For lazy people.}
         | 
| 53 64 | 
             
              s.test_files = [
         | 
| 54 | 
            -
                "spec/conventional_models/ | 
| 65 | 
            +
                "spec/conventional_models/cli_spec.rb",
         | 
| 66 | 
            +
                 "spec/conventional_models/conventions_spec.rb",
         | 
| 55 67 | 
             
                 "spec/conventional_models/database_spec.rb",
         | 
| 68 | 
            +
                 "spec/conventional_models/option_parser_spec.rb",
         | 
| 69 | 
            +
                 "spec/conventional_models/options_spec.rb",
         | 
| 56 70 | 
             
                 "spec/conventional_models/table_spec.rb",
         | 
| 57 71 | 
             
                 "spec/conventional_models_spec.rb",
         | 
| 58 72 | 
             
                 "spec/spec_helper.rb"
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            @wip
         | 
| 2 | 
            +
            Feature: Cmconsole
         | 
| 3 | 
            +
              In order to play with models generated against other projects with ease
         | 
| 4 | 
            +
              As a user
         | 
| 5 | 
            +
              I want a cmconsole command to find my database config, configure activerecord and start an IRB session for me
         | 
| 6 | 
            +
              
         | 
| 7 | 
            +
              Scenario: Typing cmconsole when a valid config/database.yml exists
         | 
| 8 | 
            +
                Given a file named "config/database.yml" with:
         | 
| 9 | 
            +
                  """
         | 
| 10 | 
            +
                  development:
         | 
| 11 | 
            +
                    adapter: sqlite3
         | 
| 12 | 
            +
                    database: test.sqlite
         | 
| 13 | 
            +
                    pool: 5
         | 
| 14 | 
            +
                    timeout: 5000
         | 
| 15 | 
            +
                    
         | 
| 16 | 
            +
                  test:
         | 
| 17 | 
            +
                    adapter: sqlite3
         | 
| 18 | 
            +
                    database: test.sqlite
         | 
| 19 | 
            +
                    pool: 5
         | 
| 20 | 
            +
                    timeout: 5000
         | 
| 21 | 
            +
                    
         | 
| 22 | 
            +
                  production:
         | 
| 23 | 
            +
                    adapter: sqlite3
         | 
| 24 | 
            +
                    database: production.sqlite
         | 
| 25 | 
            +
                    pool: 5
         | 
| 26 | 
            +
                    timeout: 5000
         | 
| 27 | 
            +
                  """
         | 
| 28 | 
            +
                And a table "pages"
         | 
| 29 | 
            +
                When I run "../../bin/cmconsole"
         | 
| 30 | 
            +
                Then I should see ">> "
         | 
| 31 | 
            +
              
         | 
| 32 | 
            +
              
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              
         | 
| @@ -10,7 +10,7 @@ Feature: ConventionalModels | |
| 10 10 | 
             
                  $:.unshift("../../lib")
         | 
| 11 11 | 
             
                  require 'rubygems'
         | 
| 12 12 | 
             
                  require 'active_record'
         | 
| 13 | 
            -
                  ActiveRecord::Base.establish_connection(:database => ' | 
| 13 | 
            +
                  ActiveRecord::Base.establish_connection(:database => 'test.sqlite', :adapter => 'sqlite3')
         | 
| 14 14 | 
             
                  require 'conventional_models'
         | 
| 15 15 | 
             
                  ConventionalModels.configure
         | 
| 16 16 | 
             
                  puts "Number of records: #{<model_name>.count}"
         | 
| @@ -30,7 +30,7 @@ Feature: ConventionalModels | |
| 30 30 | 
             
                  $:.unshift("../../lib")
         | 
| 31 31 | 
             
                  require 'rubygems'
         | 
| 32 32 | 
             
                  require 'active_record'
         | 
| 33 | 
            -
                  ActiveRecord::Base.establish_connection(:database => ' | 
| 33 | 
            +
                  ActiveRecord::Base.establish_connection(:database => 'test.sqlite', :adapter => 'sqlite3')
         | 
| 34 34 | 
             
                  require 'conventional_models'
         | 
| 35 35 | 
             
                  ConventionalModels.configure
         | 
| 36 36 | 
             
                  puts "Number of records: #{<model_name>.count}"
         | 
| @@ -58,7 +58,7 @@ Feature: ConventionalModels | |
| 58 58 | 
             
                  $:.unshift("../../lib")
         | 
| 59 59 | 
             
                  require 'rubygems'
         | 
| 60 60 | 
             
                  require 'active_record'
         | 
| 61 | 
            -
                  ActiveRecord::Base.establish_connection(:database => ' | 
| 61 | 
            +
                  ActiveRecord::Base.establish_connection(:database => 'test.sqlite', :adapter => 'sqlite3')
         | 
| 62 62 | 
             
                  require 'conventional_models'
         | 
| 63 63 | 
             
                  ConventionalModels.configure do
         | 
| 64 64 | 
             
                    primary_key_name "Id"
         | 
| @@ -18,7 +18,7 @@ Feature: Output model code | |
| 18 18 | 
             
                  $:.unshift("../../lib")
         | 
| 19 19 | 
             
                  require 'rubygems'
         | 
| 20 20 | 
             
                  require 'active_record'
         | 
| 21 | 
            -
                  ActiveRecord::Base.establish_connection(:database => ' | 
| 21 | 
            +
                  ActiveRecord::Base.establish_connection(:database => 'test.sqlite', :adapter => 'sqlite3')
         | 
| 22 22 | 
             
                  require 'conventional_models'
         | 
| 23 23 | 
             
                  ConventionalModels.configure do
         | 
| 24 24 | 
             
                    primary_key_name "Id"
         | 
| 
            File without changes
         | 
    
        data/features/support/env.rb
    CHANGED
    
    | @@ -8,15 +8,16 @@ require 'active_record' | |
| 8 8 |  | 
| 9 9 | 
             
            Before do
         | 
| 10 10 | 
             
              config = {
         | 
| 11 | 
            -
                 | 
| 12 | 
            -
                   | 
| 13 | 
            -
                   | 
| 11 | 
            +
                "development" => {
         | 
| 12 | 
            +
                  "database" => 'tmp/aruba/test.sqlite',
         | 
| 13 | 
            +
                  "adapter" => 'sqlite3'
         | 
| 14 14 | 
             
                }
         | 
| 15 15 | 
             
              }
         | 
| 16 16 |  | 
| 17 17 | 
             
              ActiveRecord::Base.configurations = config
         | 
| 18 18 |  | 
| 19 19 | 
             
              system "mkdir -p tmp"
         | 
| 20 | 
            -
              system  | 
| 21 | 
            -
               | 
| 20 | 
            +
              system "mkdir -p tmp/aruba"
         | 
| 21 | 
            +
              system 'rm -f tmp/aruba/test.sqlite'
         | 
| 22 | 
            +
              ActiveRecord::Base.establish_connection(config["development"])
         | 
| 22 23 | 
             
            end
         | 
    
        data/lib/conventional_models.rb
    CHANGED
    
    | @@ -7,12 +7,21 @@ require 'conventional_models/database' | |
| 7 7 | 
             
            require 'conventional_models/table'
         | 
| 8 8 | 
             
            require 'conventional_models/column'
         | 
| 9 9 | 
             
            require 'conventional_models/active_record_base_model_for'
         | 
| 10 | 
            +
            require 'conventional_models/options'
         | 
| 11 | 
            +
            require 'conventional_models/option_parser'
         | 
| 12 | 
            +
            require 'conventional_models/cli'
         | 
| 13 | 
            +
            require 'irb';
         | 
| 14 | 
            +
            require 'irb/completion'
         | 
| 10 15 |  | 
| 11 16 | 
             
            module ConventionalModels
         | 
| 17 | 
            +
              @@database = nil
         | 
| 18 | 
            +
              
         | 
| 12 19 | 
             
              def self.configure(&block)
         | 
| 13 20 | 
             
                @@conventions = Conventions.new(&block)
         | 
| 14 | 
            -
                @@database | 
| 15 | 
            -
             | 
| 21 | 
            +
                unless @@database.nil?
         | 
| 22 | 
            +
                  remove(@@database)
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
                @@database = Database.new(@@conventions)
         | 
| 16 25 | 
             
                run_code @@database.code
         | 
| 17 26 | 
             
              end
         | 
| 18 27 |  | 
| @@ -27,4 +36,22 @@ module ConventionalModels | |
| 27 36 | 
             
              def self.model_code_for(table)
         | 
| 28 37 | 
             
                @@database.code_for(table)
         | 
| 29 38 | 
             
              end
         | 
| 39 | 
            +
              
         | 
| 40 | 
            +
              def self.run_console!
         | 
| 41 | 
            +
                configure_active_record
         | 
| 42 | 
            +
                configure
         | 
| 43 | 
            +
                IRB.start
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
              
         | 
| 46 | 
            +
              def self.configure_active_record(config='config/database.yml', environment='development')
         | 
| 47 | 
            +
                config = YAML::load(IO.read(config))
         | 
| 48 | 
            +
                ActiveRecord::Base.configurations = config
         | 
| 49 | 
            +
                ActiveRecord::Base.establish_connection(config[environment])
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
              
         | 
| 52 | 
            +
              def self.remove(database)
         | 
| 53 | 
            +
                database.tables.map{|t| t.class_name.to_sym}.each do |class_sym|
         | 
| 54 | 
            +
                  Object.send(:remove_const, class_sym)
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
              end
         | 
| 30 57 | 
             
            end
         | 
| @@ -0,0 +1,61 @@ | |
| 1 | 
            +
            require 'optparse'
         | 
| 2 | 
            +
            require 'rdoc/usage'
         | 
| 3 | 
            +
            require 'ostruct'
         | 
| 4 | 
            +
            require 'date'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module ConventionalModels
         | 
| 7 | 
            +
              class CLI
         | 
| 8 | 
            +
                attr_reader :options
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def initialize(arguments)
         | 
| 11 | 
            +
                  @arguments = arguments
         | 
| 12 | 
            +
                  @option_parser = OptionParser.new(arguments)
         | 
| 13 | 
            +
                  @options = @option_parser.options
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
                
         | 
| 16 | 
            +
                def run
         | 
| 17 | 
            +
                  if @option_parser.parsed_options?
         | 
| 18 | 
            +
                    return output_help if @options.output_help
         | 
| 19 | 
            +
                    return output_version if @options.output_version
         | 
| 20 | 
            +
                    output_options if @options.verbose
         | 
| 21 | 
            +
                    run_console
         | 
| 22 | 
            +
                  else
         | 
| 23 | 
            +
                    output_usage
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
                
         | 
| 27 | 
            +
                protected
         | 
| 28 | 
            +
                  
         | 
| 29 | 
            +
                  def run_console
         | 
| 30 | 
            +
                    unless File.exists?(@options.config)
         | 
| 31 | 
            +
                      puts "Config #{@options.config} doesn't exist!"
         | 
| 32 | 
            +
                      return
         | 
| 33 | 
            +
                    end
         | 
| 34 | 
            +
                    ConventionalModels.configure_active_record(@options.config, @options.environment)
         | 
| 35 | 
            +
                    ConventionalModels.configure unless @options.skip_configure
         | 
| 36 | 
            +
                    puts ConventionalModels.model_code
         | 
| 37 | 
            +
                    IRB.start
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                  
         | 
| 40 | 
            +
                  def output_options
         | 
| 41 | 
            +
                    puts "Options:\n"
         | 
| 42 | 
            +
                  
         | 
| 43 | 
            +
                    @options.marshal_dump.each do |name, val|
         | 
| 44 | 
            +
                      puts "  #{name} = #{val}"
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                
         | 
| 48 | 
            +
                  def output_help
         | 
| 49 | 
            +
                    output_version
         | 
| 50 | 
            +
                    RDoc::usage()
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
                
         | 
| 53 | 
            +
                  def output_usage
         | 
| 54 | 
            +
                    RDoc::usage('usage')
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
                
         | 
| 57 | 
            +
                  def output_version
         | 
| 58 | 
            +
                    puts "ConventionalModels version #{ConventionalModels::VERSION::STRING}"
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
            end
         | 
| @@ -4,27 +4,11 @@ module ConventionalModels | |
| 4 4 | 
             
              class Database
         | 
| 5 5 | 
             
                attr_accessor :tables
         | 
| 6 6 |  | 
| 7 | 
            -
                def initialize( | 
| 8 | 
            -
                  @connection = connection
         | 
| 7 | 
            +
                def initialize(conventions)
         | 
| 8 | 
            +
                  @connection = ::ActiveRecord::Base.connection
         | 
| 9 | 
            +
                  @conventions = conventions
         | 
| 9 10 | 
             
                  @tables = []
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                
         | 
| 12 | 
            -
                def apply_conventions(conventions)
         | 
| 13 | 
            -
                  @connection.tables.select{|table| !conventions.ignored_tables.include? table}.each do |table|
         | 
| 14 | 
            -
                    @tables << Table.new(table, @connection.columns(table))
         | 
| 15 | 
            -
                  end
         | 
| 16 | 
            -
                  
         | 
| 17 | 
            -
                  @tables.each{|table| table.apply_conventions(conventions)}
         | 
| 18 | 
            -
                  
         | 
| 19 | 
            -
                  @tables.each do |table|
         | 
| 20 | 
            -
                    table.belongs_to_names.each do |belongs_to|
         | 
| 21 | 
            -
                      name = conventions.belongs_to_name.call(belongs_to)
         | 
| 22 | 
            -
                      has_many_table = @tables.select{|t| t.class_name == conventions.class_name.call(name)}.first
         | 
| 23 | 
            -
                      if has_many_table
         | 
| 24 | 
            -
                        has_many_table.lines << "has_many :#{table.name.tableize}, :class_name => '#{table.class_name}', :primary_key => '#{conventions.primary_key_name}', :foreign_key => '#{belongs_to.name}'"
         | 
| 25 | 
            -
                      end
         | 
| 26 | 
            -
                    end
         | 
| 27 | 
            -
                  end
         | 
| 11 | 
            +
                  apply_conventions
         | 
| 28 12 | 
             
                end
         | 
| 29 13 |  | 
| 30 14 | 
             
                def code
         | 
| @@ -39,5 +23,33 @@ module ConventionalModels | |
| 39 23 | 
             
                    "#{table_name} not found"
         | 
| 40 24 | 
             
                  end
         | 
| 41 25 | 
             
                end
         | 
| 26 | 
            +
                
         | 
| 27 | 
            +
                protected
         | 
| 28 | 
            +
                  def apply_conventions
         | 
| 29 | 
            +
                    @connection.tables.select{|table| !@conventions.ignored_tables.include? table}.each do |table|
         | 
| 30 | 
            +
                      @tables << Table.new(table, @connection.columns(table), @conventions)
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    @tables.each do |table|
         | 
| 34 | 
            +
                      table.belongs_to_names.each do |belongs_to|
         | 
| 35 | 
            +
                        name = @conventions.belongs_to_name.call(belongs_to)
         | 
| 36 | 
            +
                        has_many_table = @tables.select{|t| t.class_name == @conventions.class_name.call(name)}.first
         | 
| 37 | 
            +
                        if has_many_table
         | 
| 38 | 
            +
                          unconventions = []
         | 
| 39 | 
            +
                          unless table.conventional_name?
         | 
| 40 | 
            +
                            unconventions << ":class_name => '#{table.class_name}'"
         | 
| 41 | 
            +
                            unconventions << ":foreign_key => '#{belongs_to.name}'"
         | 
| 42 | 
            +
                          end
         | 
| 43 | 
            +
                          unless @conventions.primary_key_name == "id"
         | 
| 44 | 
            +
                            unconventions << ":primary_key => '#{@conventions.primary_key_name}'"
         | 
| 45 | 
            +
                          end
         | 
| 46 | 
            +
                          
         | 
| 47 | 
            +
                          has_many_table.lines << ["has_many :#{table.name.tableize}", "#{unconventions.join(", ")}"].select do |convention|
         | 
| 48 | 
            +
                            !convention.empty?
         | 
| 49 | 
            +
                          end.join(", ")
         | 
| 50 | 
            +
                        end
         | 
| 51 | 
            +
                      end
         | 
| 52 | 
            +
                    end
         | 
| 53 | 
            +
                  end
         | 
| 42 54 | 
             
              end
         | 
| 43 55 | 
             
            end
         | 
| @@ -0,0 +1,50 @@ | |
| 1 | 
            +
            require 'optparse'
         | 
| 2 | 
            +
            require 'rdoc/usage'
         | 
| 3 | 
            +
            require 'ostruct'
         | 
| 4 | 
            +
            require 'date'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module ConventionalModels
         | 
| 7 | 
            +
              class OptionParser
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
                attr_reader :options
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                def initialize(arguments)
         | 
| 12 | 
            +
                  @arguments = arguments
         | 
| 13 | 
            +
                  
         | 
| 14 | 
            +
                  @options = Options.new
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  @parsed_options = true
         | 
| 17 | 
            +
                  parse
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              
         | 
| 20 | 
            +
                def parsed_options?
         | 
| 21 | 
            +
                  @parsed_options
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
                
         | 
| 24 | 
            +
                def parse
         | 
| 25 | 
            +
                  opts = ::OptionParser.new
         | 
| 26 | 
            +
                  opts.on('-v', '--version')    { @options.output_version = true }
         | 
| 27 | 
            +
                  opts.on('-h', '--help')       { @options.output_help = true }
         | 
| 28 | 
            +
                  opts.on('-s', '--skip-configure')    { @options.skip_configure = true }  
         | 
| 29 | 
            +
                  opts.on('-c', '--config FILE')      { |file| @options.config = file }
         | 
| 30 | 
            +
                  opts.on('-e', '--environment ENV')      { |env| @options.environment = env }
         | 
| 31 | 
            +
                  opts.on('-V', '--verbose')      { |env| @options.verbose = true }
         | 
| 32 | 
            +
                  
         | 
| 33 | 
            +
                  opts.parse!(@arguments) rescue @parsed_options = false
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
                  
         | 
| 36 | 
            +
                protected
         | 
| 37 | 
            +
                  def output_help
         | 
| 38 | 
            +
                    output_version
         | 
| 39 | 
            +
                    RDoc::usage()
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
                
         | 
| 42 | 
            +
                  def output_usage
         | 
| 43 | 
            +
                    RDoc::usage('usage')
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
                
         | 
| 46 | 
            +
                  def output_version
         | 
| 47 | 
            +
                    puts "ConventionalModels version #{ConventionalModels::VERSION}"
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
            end
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            module ConventionalModels
         | 
| 2 | 
            +
              class Options
         | 
| 3 | 
            +
                attr_accessor :skip_configure, :config, :environment, :verbose, :output_version, :output_help
         | 
| 4 | 
            +
                
         | 
| 5 | 
            +
                def initialize
         | 
| 6 | 
            +
                  @skip_configure = false
         | 
| 7 | 
            +
                  @config = "config/database.yml"
         | 
| 8 | 
            +
                  @environment = "development"
         | 
| 9 | 
            +
                  @verbose = false
         | 
| 10 | 
            +
                  @output_version = false
         | 
| 11 | 
            +
                  @output_help = false
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
                
         | 
| 14 | 
            +
                
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -2,35 +2,44 @@ module ConventionalModels | |
| 2 2 | 
             
              class Table
         | 
| 3 3 | 
             
                attr_accessor :name, :columns, :lines, :belongs_to_names, :class_name
         | 
| 4 4 |  | 
| 5 | 
            -
                def initialize(name, columns)
         | 
| 5 | 
            +
                def initialize(name, columns, conventions)
         | 
| 6 6 | 
             
                  @name = name
         | 
| 7 7 | 
             
                  @columns = columns
         | 
| 8 8 | 
             
                  @lines = []
         | 
| 9 9 | 
             
                  @belongs_to_names = []
         | 
| 10 | 
            +
                  @conventions = conventions
         | 
| 11 | 
            +
                  
         | 
| 12 | 
            +
                  apply_conventions
         | 
| 10 13 | 
             
                end
         | 
| 11 14 |  | 
| 12 15 | 
             
                def ==(other)
         | 
| 13 16 | 
             
                  @name == other.name
         | 
| 14 17 | 
             
                end
         | 
| 15 18 |  | 
| 16 | 
            -
                def  | 
| 17 | 
            -
                  @ | 
| 19 | 
            +
                def code
         | 
| 20 | 
            +
                  "class ::#{@name.singularize.camelize} < ::ActiveRecord::Base\n#{@lines.map{|l| "  #{l}"}.join("\n")}\nend"
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
                
         | 
| 23 | 
            +
                def conventional_name?
         | 
| 24 | 
            +
                  @name.tableize == @name
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
                
         | 
| 27 | 
            +
                protected
         | 
| 28 | 
            +
                
         | 
| 29 | 
            +
                  def apply_conventions
         | 
| 30 | 
            +
                    @class_name = @conventions.class_name.call(@name)
         | 
| 18 31 |  | 
| 19 | 
            -
             | 
| 32 | 
            +
                    @lines << "set_primary_key \"#{@conventions.primary_key_name}\"" unless @conventions.primary_key_name == "id"
         | 
| 20 33 |  | 
| 21 | 
            -
             | 
| 34 | 
            +
                    @lines << "set_table_name \"#{@name}\"" unless @name.tableize == @name
         | 
| 22 35 |  | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 36 | 
            +
                    @columns.each do |column|
         | 
| 37 | 
            +
                      if @conventions.belongs_to_matcher.call(column)
         | 
| 38 | 
            +
                        name = @conventions.belongs_to_name.call(column)
         | 
| 39 | 
            +
                        @belongs_to_names << column
         | 
| 40 | 
            +
                        @lines << "belongs_to :#{name.underscore}, :class_name => '#{@conventions.class_name.call(name)}'"
         | 
| 41 | 
            +
                      end
         | 
| 28 42 | 
             
                    end
         | 
| 29 43 | 
             
                  end
         | 
| 30 | 
            -
                end
         | 
| 31 | 
            -
                
         | 
| 32 | 
            -
                def code
         | 
| 33 | 
            -
                  "class ::#{@name.singularize.camelize} < ::ActiveRecord::Base\n#{@lines.map{|l| "  #{l}"}.join("\n")}\nend"
         | 
| 34 | 
            -
                end
         | 
| 35 44 | 
             
              end
         | 
| 36 45 | 
             
            end
         | 
| @@ -0,0 +1,114 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module ConventionalModels
         | 
| 4 | 
            +
              describe CLI do
         | 
| 5 | 
            +
                before(:each) do
         | 
| 6 | 
            +
                  @args = []
         | 
| 7 | 
            +
                  @options = Options.new
         | 
| 8 | 
            +
                  @option_parser = mock(OptionParser, :options => @options)
         | 
| 9 | 
            +
                  OptionParser.stub(:new).and_return(@option_parser)
         | 
| 10 | 
            +
                  File.stub(:exists?).with(@options.config).and_return(true)
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
                
         | 
| 13 | 
            +
                it "should create a new option parser with args" do
         | 
| 14 | 
            +
                  OptionParser.should_receive(:new).with(@args)
         | 
| 15 | 
            +
                  CLI.new(@args)
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
                
         | 
| 18 | 
            +
                describe "run" do
         | 
| 19 | 
            +
                  before(:each) do
         | 
| 20 | 
            +
                    @stdout_orig = $stdout
         | 
| 21 | 
            +
                    $stdout = StringIO.new
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                  after(:each) do
         | 
| 24 | 
            +
                    $stdout = @stdout_orig
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                  
         | 
| 27 | 
            +
                  def run
         | 
| 28 | 
            +
                    @cli = CLI.new(@args)
         | 
| 29 | 
            +
                    @cli.run
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                  
         | 
| 32 | 
            +
                  describe "with parsed options" do
         | 
| 33 | 
            +
                    before(:each) do
         | 
| 34 | 
            +
                      @option_parser.stub(:parsed_options?).and_return(true)
         | 
| 35 | 
            +
                      ConventionalModels.stub(:configure)
         | 
| 36 | 
            +
                      ConventionalModels.stub(:model_code)
         | 
| 37 | 
            +
                      ConventionalModels.stub(:configure_active_record)
         | 
| 38 | 
            +
                      IRB.stub(:start)
         | 
| 39 | 
            +
                    end
         | 
| 40 | 
            +
                    
         | 
| 41 | 
            +
                    it "configures activerecord with config and environment options" do
         | 
| 42 | 
            +
                      ConventionalModels.should_receive(:configure_active_record).with(@options.config, @options.environment)
         | 
| 43 | 
            +
                      run
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
                    
         | 
| 46 | 
            +
                    describe "when config doesnt exist" do
         | 
| 47 | 
            +
                      before(:each) do
         | 
| 48 | 
            +
                        File.stub(:exists?).with(@options.config).and_return(false)
         | 
| 49 | 
            +
                      end
         | 
| 50 | 
            +
                      
         | 
| 51 | 
            +
                      it "complains" do
         | 
| 52 | 
            +
                        run
         | 
| 53 | 
            +
                        $stdout.string.should include("doesn't exist")
         | 
| 54 | 
            +
                      end
         | 
| 55 | 
            +
                      
         | 
| 56 | 
            +
                      it "does not call configure_active_record" do
         | 
| 57 | 
            +
                        run
         | 
| 58 | 
            +
                        ConventionalModels.should_not_receive(:configure_active_record)
         | 
| 59 | 
            +
                      end
         | 
| 60 | 
            +
                    end
         | 
| 61 | 
            +
                    
         | 
| 62 | 
            +
                    it "calls configure" do
         | 
| 63 | 
            +
                      ConventionalModels.should_receive(:configure)
         | 
| 64 | 
            +
                      run
         | 
| 65 | 
            +
                    end
         | 
| 66 | 
            +
                    
         | 
| 67 | 
            +
                    it "puts the model code" do
         | 
| 68 | 
            +
                      ConventionalModels.should_receive(:model_code).and_return("TEST")
         | 
| 69 | 
            +
                      run
         | 
| 70 | 
            +
                      $stdout.string.should == "TEST\n"
         | 
| 71 | 
            +
                    end
         | 
| 72 | 
            +
                    
         | 
| 73 | 
            +
                    it "start IRB" do
         | 
| 74 | 
            +
                      IRB.should_receive(:start)
         | 
| 75 | 
            +
                      run
         | 
| 76 | 
            +
                    end
         | 
| 77 | 
            +
                    
         | 
| 78 | 
            +
                    describe "with skip-configure option" do
         | 
| 79 | 
            +
                      it "does not call configure" do
         | 
| 80 | 
            +
                        @options.skip_configure = true
         | 
| 81 | 
            +
                        ConventionalModels.should_not_receive(:configure)
         | 
| 82 | 
            +
                        run
         | 
| 83 | 
            +
                      end
         | 
| 84 | 
            +
                    end
         | 
| 85 | 
            +
                    
         | 
| 86 | 
            +
                    describe "with help option" do
         | 
| 87 | 
            +
                      it "outputs help" do
         | 
| 88 | 
            +
                        RDoc.should_receive(:usage)
         | 
| 89 | 
            +
                        @options.output_help = true
         | 
| 90 | 
            +
                        ConventionalModels.should_not_receive(:configure_active_record)
         | 
| 91 | 
            +
                        run
         | 
| 92 | 
            +
                      end
         | 
| 93 | 
            +
                    end
         | 
| 94 | 
            +
                    
         | 
| 95 | 
            +
                    describe "with output version option" do
         | 
| 96 | 
            +
                      it "outputs the version" do
         | 
| 97 | 
            +
                        @options.output_version = true
         | 
| 98 | 
            +
                        ConventionalModels.should_not_receive(:configure_active_record)
         | 
| 99 | 
            +
                        run
         | 
| 100 | 
            +
                        $stdout.string.should =~ /#{VERSION::STRING}/
         | 
| 101 | 
            +
                      end
         | 
| 102 | 
            +
                    end
         | 
| 103 | 
            +
                  end
         | 
| 104 | 
            +
                  
         | 
| 105 | 
            +
                  describe "with invalid options" do
         | 
| 106 | 
            +
                    it "prints usage" do
         | 
| 107 | 
            +
                      RDoc.should_receive(:usage).with('usage')
         | 
| 108 | 
            +
                      @option_parser.stub(:parsed_options?).and_return(false)
         | 
| 109 | 
            +
                      run
         | 
| 110 | 
            +
                    end
         | 
| 111 | 
            +
                  end
         | 
| 112 | 
            +
                end
         | 
| 113 | 
            +
              end
         | 
| 114 | 
            +
            end
         | 
| @@ -9,6 +9,8 @@ module ConventionalModels | |
| 9 9 | 
             
                  @connection = mock(::ActiveRecord::ConnectionAdapters::AbstractAdapter)
         | 
| 10 10 | 
             
                  @columns = [mock(Column)]
         | 
| 11 11 |  | 
| 12 | 
            +
                  ::ActiveRecord::Base.stub(:connection).and_return(@connection)
         | 
| 13 | 
            +
                  
         | 
| 12 14 | 
             
                  @connection.stub(:tables).and_return(["Test"])
         | 
| 13 15 | 
             
                  @connection.stub(:columns).with("Test").and_return(@columns)
         | 
| 14 16 |  | 
| @@ -19,39 +21,57 @@ module ConventionalModels | |
| 19 21 | 
             
                  Table.stub(:new => @table)
         | 
| 20 22 | 
             
                end
         | 
| 21 23 |  | 
| 22 | 
            -
                describe " | 
| 23 | 
            -
                   | 
| 24 | 
            -
                    @ | 
| 25 | 
            -
             | 
| 26 | 
            -
                  
         | 
| 27 | 
            -
                  it "creates a table with the table name and the column definitions" do
         | 
| 28 | 
            -
                    Table.should_receive(:new).with("Test", @columns).and_return(@table)
         | 
| 29 | 
            -
                    @database.apply_conventions(@conventions)
         | 
| 24 | 
            +
                describe ".new" do
         | 
| 25 | 
            +
                  it "creates a table with the table name, column definitions and conventions" do
         | 
| 26 | 
            +
                    Table.should_receive(:new).with("Test", @columns, @conventions).and_return(@table)
         | 
| 27 | 
            +
                    @database = Database.new(@conventions)
         | 
| 30 28 | 
             
                    @database.tables.first.should == @table
         | 
| 31 29 | 
             
                  end
         | 
| 32 30 |  | 
| 33 | 
            -
                  it "applies conventions to each table" do
         | 
| 34 | 
            -
                    @table.should_receive(:apply_conventions).with(@conventions)
         | 
| 35 | 
            -
                    @database.apply_conventions(@conventions)
         | 
| 36 | 
            -
                  end
         | 
| 37 | 
            -
                  
         | 
| 38 31 | 
             
                  describe "has many relationships" do
         | 
| 39 | 
            -
                     | 
| 40 | 
            -
             | 
| 32 | 
            +
                    
         | 
| 33 | 
            +
                    describe "conventional" do
         | 
| 34 | 
            +
                      before(:each) do
         | 
| 35 | 
            +
                        @connection.stub(:tables).and_return(["sites", "pages"])
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                        Table.unstub!(:new)
         | 
| 38 | 
            +
                        @site_columns = [Column.new("name", nil, "string")]
         | 
| 39 | 
            +
                        @pages_columns = [Column.new("site_id", nil, "integer")]
         | 
| 40 | 
            +
                        @connection.stub(:columns).with("sites").and_return(@site_columns)
         | 
| 41 | 
            +
                        @connection.stub(:columns).with("pages").and_return(@pages_columns)
         | 
| 42 | 
            +
                        @database = Database.new(Conventions.new)
         | 
| 43 | 
            +
                      end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                      it "sets the table name" do
         | 
| 46 | 
            +
                        @database.tables.first.name.should == "sites"
         | 
| 47 | 
            +
                      end
         | 
| 41 48 |  | 
| 42 | 
            -
                       | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 49 | 
            +
                      it "sets site to have many pages" do
         | 
| 50 | 
            +
                        @database.tables.first.lines.last.should == "has_many :pages"
         | 
| 51 | 
            +
                        # , :class_name => 'Page', :primary_key => 'id', :foreign_key => 'site_id'
         | 
| 52 | 
            +
                      end
         | 
| 53 | 
            +
                    end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                    describe "unconventional" do
         | 
| 56 | 
            +
                      before(:each) do
         | 
| 57 | 
            +
                        @connection.stub(:tables).and_return(["Site", "Page"])
         | 
| 58 | 
            +
                        Table.unstub!(:new)
         | 
| 59 | 
            +
                        @site_columns = [Column.new("Name", nil, "string")]
         | 
| 60 | 
            +
                        @pages_columns = [Column.new("Site_id", nil, "integer")]
         | 
| 61 | 
            +
                        @connection.stub(:columns).with("Site").and_return(@site_columns)
         | 
| 62 | 
            +
                        @connection.stub(:columns).with("Page").and_return(@pages_columns)
         | 
| 63 | 
            +
                        @database = Database.new(Conventions.new{ primary_key_name "ID" })
         | 
| 64 | 
            +
                      end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                      it "sets the table name" do
         | 
| 67 | 
            +
                        @database.tables.first.name.should == "Site"
         | 
| 68 | 
            +
                      end
         | 
| 45 69 |  | 
| 46 | 
            -
                       | 
| 47 | 
            -
             | 
| 70 | 
            +
                      it "sets site to have many pages" do
         | 
| 71 | 
            +
                        @database.tables.first.lines.last.should == "has_many :pages, :class_name => 'Page', :foreign_key => 'Site_id', :primary_key => 'ID'"
         | 
| 72 | 
            +
                      end
         | 
| 48 73 | 
             
                    end
         | 
| 49 74 |  | 
| 50 | 
            -
                    it "sets site to have many pages" do
         | 
| 51 | 
            -
                      @database.apply_conventions(Conventions.new)
         | 
| 52 | 
            -
                      @database.tables.first.name.should == "sites"
         | 
| 53 | 
            -
                      @database.tables.first.lines.last.should == "has_many :pages, :class_name => 'Page', :primary_key => 'id', :foreign_key => 'site_id'"
         | 
| 54 | 
            -
                    end
         | 
| 55 75 | 
             
                  end
         | 
| 56 76 |  | 
| 57 77 | 
             
                  it "ignores tables" do
         | 
| @@ -59,19 +79,18 @@ module ConventionalModels | |
| 59 79 | 
             
                      ignore_tables "Test"
         | 
| 60 80 | 
             
                    end
         | 
| 61 81 | 
             
                    @table.should_not_receive(:apply_conventions)
         | 
| 62 | 
            -
                    @database. | 
| 82 | 
            +
                    @database = Database.new(@conventions)
         | 
| 63 83 | 
             
                  end
         | 
| 64 84 | 
             
                end
         | 
| 65 85 |  | 
| 66 86 | 
             
                describe "code outputting" do
         | 
| 67 87 | 
             
                  before(:each) do
         | 
| 68 88 | 
             
                    @table.stub(:name).and_return("Test")
         | 
| 69 | 
            -
                    @database = Database.new(@connection)
         | 
| 70 | 
            -
                    @database.apply_conventions(@conventions)
         | 
| 71 89 | 
             
                  end
         | 
| 72 90 | 
             
                  describe "#code" do
         | 
| 73 91 | 
             
                    it "should return the code for each table" do
         | 
| 74 92 | 
             
                      @table.should_receive(:code).and_return("test")
         | 
| 93 | 
            +
                      @database = Database.new(@conventions)
         | 
| 75 94 | 
             
                      @database.code.should == "test"
         | 
| 76 95 | 
             
                    end
         | 
| 77 96 | 
             
                  end
         | 
| @@ -79,9 +98,11 @@ module ConventionalModels | |
| 79 98 | 
             
                  describe "#code_for" do
         | 
| 80 99 | 
             
                    it "should return the model code for a specific table" do
         | 
| 81 100 | 
             
                      @table.should_receive(:code).and_return("test")
         | 
| 101 | 
            +
                      @database = Database.new(@conventions)
         | 
| 82 102 | 
             
                      @database.code_for("Test").should == "test"
         | 
| 83 103 | 
             
                    end
         | 
| 84 104 | 
             
                    it "should return not found for unknown tables" do
         | 
| 105 | 
            +
                    @database = Database.new(@conventions)
         | 
| 85 106 | 
             
                      @database.code_for("SomeTable").should == "SomeTable not found"
         | 
| 86 107 | 
             
                    end
         | 
| 87 108 | 
             
                  end
         | 
| @@ -0,0 +1,44 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module ConventionalModels
         | 
| 4 | 
            +
              describe OptionParser do
         | 
| 5 | 
            +
                def options_for(args)
         | 
| 6 | 
            +
                  @option_parser = OptionParser.new(args)
         | 
| 7 | 
            +
                  @option_parser.options
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
                
         | 
| 10 | 
            +
                describe "parsing" do
         | 
| 11 | 
            +
                  it "accepts a database config file" do
         | 
| 12 | 
            +
                    options_for(["-c", "config/db.yml"]).config.should == "config/db.yml"
         | 
| 13 | 
            +
                    options_for(["--config", "config/db.yml"]).config.should == "config/db.yml"
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                  
         | 
| 16 | 
            +
                  it "accepts an environment flag" do
         | 
| 17 | 
            +
                    options_for(["-e", "production"]).environment.should == "production"
         | 
| 18 | 
            +
                    options_for(["--environment", "production"]).environment.should == "production"
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                  
         | 
| 21 | 
            +
                  it "accepts a skip configure flag" do
         | 
| 22 | 
            +
                    options_for(["-s"]).skip_configure.should == true
         | 
| 23 | 
            +
                    options_for(["--skip-configure"]).skip_configure.should == true
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                  
         | 
| 26 | 
            +
                  it "accepts an output version flag" do
         | 
| 27 | 
            +
                    options_for(["-v"]).output_version.should == true
         | 
| 28 | 
            +
                    options_for(["--version"]).output_version.should == true
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
                  
         | 
| 31 | 
            +
                  it "accepts an output help flag" do
         | 
| 32 | 
            +
                    options_for(["-h"]).output_help.should == true
         | 
| 33 | 
            +
                    options_for(["--help"]).output_help.should == true
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
                
         | 
| 37 | 
            +
                describe "invalid arguments" do
         | 
| 38 | 
            +
                  it "should set parsed_options? to false" do
         | 
| 39 | 
            +
                    options_for(["--boobs"])
         | 
| 40 | 
            +
                    @option_parser.parsed_options?.should == false
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
            end
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module ConventionalModels
         | 
| 4 | 
            +
              describe Options do
         | 
| 5 | 
            +
                before(:each) do
         | 
| 6 | 
            +
                  @options = Options.new
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
                
         | 
| 9 | 
            +
                describe "default options" do
         | 
| 10 | 
            +
                  it "should use rails location for default database.yml" do
         | 
| 11 | 
            +
                    @options.config.should == "config/database.yml"
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  it "should configure" do
         | 
| 15 | 
            +
                    @options.skip_configure.should be_false
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                  
         | 
| 18 | 
            +
                  it "should default to development environment" do
         | 
| 19 | 
            +
                    @options.environment.should == "development"
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                  
         | 
| 22 | 
            +
                  it "should not be verbose" do
         | 
| 23 | 
            +
                    @options.verbose.should be_false
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                  
         | 
| 26 | 
            +
                  it "should not output version" do
         | 
| 27 | 
            +
                    @options.output_version.should be_false
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                  
         | 
| 30 | 
            +
                  it "should not output help" do
         | 
| 31 | 
            +
                    @options.output_help.should be_false
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| @@ -4,36 +4,66 @@ module ConventionalModels | |
| 4 4 | 
             
              describe Table do
         | 
| 5 5 | 
             
                before(:each) do
         | 
| 6 6 | 
             
                  @columns = [mock(Column, :name => "test")]
         | 
| 7 | 
            +
                  @conventions = Conventions.new
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
                
         | 
| 10 | 
            +
                def has_item?(array, expected)
         | 
| 11 | 
            +
                  @found = false
         | 
| 12 | 
            +
                  array.each do |line|
         | 
| 13 | 
            +
                    @found = true if line == expected
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                  @found
         | 
| 7 16 | 
             
                end
         | 
| 8 17 |  | 
| 9 18 | 
             
                describe ".new" do
         | 
| 10 19 | 
             
                  it "sets the name" do
         | 
| 11 | 
            -
                    Table.new("test", @columns).name.should == "test"
         | 
| 20 | 
            +
                    Table.new("test", @columns, @conventions).name.should == "test"
         | 
| 12 21 | 
             
                  end
         | 
| 13 22 |  | 
| 14 23 | 
             
                  it "sets the columns" do
         | 
| 15 | 
            -
                    Table.new("test", @columns).columns.should == @columns
         | 
| 24 | 
            +
                    Table.new("test", @columns, @conventions).columns.should == @columns
         | 
| 16 25 | 
             
                  end
         | 
| 17 26 | 
             
                end
         | 
| 18 27 |  | 
| 19 28 | 
             
                describe "#==" do
         | 
| 20 29 | 
             
                  it "is true for tables with the same name" do
         | 
| 21 | 
            -
                    Table.new("Page", @columns).should == Table.new("Page", @columns)
         | 
| 30 | 
            +
                    Table.new("Page", @columns, @conventions).should == Table.new("Page", @columns, @conventions)
         | 
| 22 31 | 
             
                  end
         | 
| 23 32 |  | 
| 24 33 | 
             
                  it "is false for tables with different names" do
         | 
| 25 | 
            -
                    Table.new("Page", @columns).should_not == Table.new("Bar", @columns)
         | 
| 34 | 
            +
                    Table.new("Page", @columns, @conventions).should_not == Table.new("Bar", @columns, @conventions)
         | 
| 26 35 | 
             
                  end
         | 
| 27 36 | 
             
                end
         | 
| 28 37 |  | 
| 29 | 
            -
                describe "# | 
| 38 | 
            +
                describe "#conventional_name?" do
         | 
| 39 | 
            +
                  it "is true for tables that have a name that matches rails conventions" do
         | 
| 40 | 
            +
                    Table.new("Page", @columns, @conventions).conventional_name?.should be_false
         | 
| 41 | 
            +
                    Table.new("pages", @columns, @conventions).conventional_name?.should be_true
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
                
         | 
| 45 | 
            +
                describe ".new" do
         | 
| 30 46 | 
             
                  it "sets the primary key" do
         | 
| 31 47 | 
             
                    @conventions = Conventions.new do
         | 
| 32 48 | 
             
                      primary_key_name "ID"
         | 
| 33 49 | 
             
                    end
         | 
| 34 | 
            -
                    @table = Table.new("Page", @columns)
         | 
| 35 | 
            -
                    @table. | 
| 36 | 
            -
             | 
| 50 | 
            +
                    @table = Table.new("Page", @columns, @conventions)
         | 
| 51 | 
            +
                    has_item?(@table.lines, "set_primary_key \"ID\"").should be_true
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
                  
         | 
| 54 | 
            +
                  it "doesn't set the primary key when it is the rails default" do
         | 
| 55 | 
            +
                    @table = Table.new("Page", @columns, @conventions)
         | 
| 56 | 
            +
                    has_item?(@table.lines, "set_primary_key \"id\"").should_not == be_true
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
                  
         | 
| 59 | 
            +
                  it "sets the table name" do
         | 
| 60 | 
            +
                    @table = Table.new("Page", @columns, @conventions)
         | 
| 61 | 
            +
                    has_item?(@table.lines, "set_table_name \"Page\"").should be_true
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
                  
         | 
| 64 | 
            +
                  it "doesn't set the table name if it is the rails default" do
         | 
| 65 | 
            +
                    @table = Table.new("pages", @columns, @conventions)
         | 
| 66 | 
            +
                    has_item?(@table.lines, "set_table_name \"pages\"").should be_false
         | 
| 37 67 | 
             
                  end
         | 
| 38 68 |  | 
| 39 69 | 
             
                  it "sets the class name" do
         | 
| @@ -42,17 +72,15 @@ module ConventionalModels | |
| 42 72 | 
             
                        "BOO"
         | 
| 43 73 | 
             
                      end
         | 
| 44 74 | 
             
                    end
         | 
| 45 | 
            -
                    @table = Table.new("Page", @columns)
         | 
| 46 | 
            -
                    @table.apply_conventions(@conventions)
         | 
| 75 | 
            +
                    @table = Table.new("Page", @columns, @conventions)
         | 
| 47 76 | 
             
                    @table.class_name.should == "BOO"
         | 
| 48 77 | 
             
                  end
         | 
| 49 78 |  | 
| 50 79 | 
             
                  it "sets belongs to columns" do
         | 
| 51 80 | 
             
                    @conventions = Conventions.new
         | 
| 52 81 | 
             
                    @columns = [Column.new("Site_id", nil, "integer")]
         | 
| 53 | 
            -
                    @table = Table.new("Page", @columns)
         | 
| 54 | 
            -
                    @table. | 
| 55 | 
            -
                    @table.lines[2].should == "belongs_to :site, :class_name => 'Site'"
         | 
| 82 | 
            +
                    @table = Table.new("Page", @columns, @conventions)
         | 
| 83 | 
            +
                    has_item?(@table.lines, "belongs_to :site, :class_name => 'Site'").should be_true
         | 
| 56 84 | 
             
                    @table.belongs_to_names.first.name.should == "Site_id"
         | 
| 57 85 | 
             
                  end
         | 
| 58 86 |  | 
| @@ -60,18 +88,18 @@ module ConventionalModels | |
| 60 88 |  | 
| 61 89 | 
             
                describe "#code" do
         | 
| 62 90 | 
             
                  before(:each) do
         | 
| 63 | 
            -
                    @table = Table.new("pages", @columns)
         | 
| 91 | 
            +
                    @table = Table.new("pages", @columns, @conventions)
         | 
| 64 92 | 
             
                  end
         | 
| 65 93 |  | 
| 66 | 
            -
                  it "returns an  | 
| 94 | 
            +
                  it "returns an activerecord class" do
         | 
| 67 95 | 
             
                    @model_code = @table.code
         | 
| 68 | 
            -
                    @model_code. | 
| 96 | 
            +
                    @model_code.starts_with?(%Q{class ::Page < ::ActiveRecord::Base}).should be_true
         | 
| 69 97 | 
             
                  end
         | 
| 70 98 |  | 
| 71 99 | 
             
                  it "returns lines in the model definition" do
         | 
| 72 100 | 
             
                    @table.lines << "test"
         | 
| 73 101 | 
             
                    @model_code = @table.code
         | 
| 74 | 
            -
                    @model_code.split("\n") | 
| 102 | 
            +
                    has_item?(@model_code.split("\n"), "  test").should be_true
         | 
| 75 103 | 
             
                  end
         | 
| 76 104 | 
             
                end
         | 
| 77 105 | 
             
              end
         | 
| @@ -8,24 +8,18 @@ module ConventionalModels | |
| 8 8 |  | 
| 9 9 | 
             
                  ConventionalModels.stub(:run_code)
         | 
| 10 10 |  | 
| 11 | 
            -
                  @connection = mock(Column)
         | 
| 12 | 
            -
                  ::ActiveRecord::Base.stub(:connection).and_return(@connection)
         | 
| 13 | 
            -
                  
         | 
| 14 11 | 
             
                  @generated_code = mock(String)
         | 
| 15 12 | 
             
                  @database = mock(Database, :code => @generated_code)
         | 
| 16 13 | 
             
                  @database.stub(:apply_conventions).with(@conventions)
         | 
| 17 14 | 
             
                  Database.stub(:new => @database)
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  ConventionalModels.stub(:remove)
         | 
| 18 17 | 
             
                end
         | 
| 19 18 |  | 
| 20 19 | 
             
                describe ".configure" do
         | 
| 21 | 
            -
                  describe "with no args" do | 
| 22 | 
            -
                    it "creates a database object with the  | 
| 23 | 
            -
                      Database.should_receive(:new).with(@ | 
| 24 | 
            -
                      ConventionalModels.configure
         | 
| 25 | 
            -
                    end
         | 
| 26 | 
            -
                    
         | 
| 27 | 
            -
                    it "called apply_conventions on the database object" do
         | 
| 28 | 
            -
                      @database.should_receive(:apply_conventions).with(@conventions)
         | 
| 20 | 
            +
                  describe "with no args" do
         | 
| 21 | 
            +
                    it "creates a database object with the conventions" do
         | 
| 22 | 
            +
                      Database.should_receive(:new).with(@conventions).and_return(@database)
         | 
| 29 23 | 
             
                      ConventionalModels.configure
         | 
| 30 24 | 
             
                    end
         | 
| 31 25 |  | 
| @@ -34,6 +28,13 @@ module ConventionalModels | |
| 34 28 | 
             
                      ConventionalModels.configure
         | 
| 35 29 | 
             
                    end
         | 
| 36 30 | 
             
                  end
         | 
| 31 | 
            +
                  describe "second call" do
         | 
| 32 | 
            +
                    it "should call remove if a database has already been configured" do
         | 
| 33 | 
            +
                      ConventionalModels.should_receive(:remove).with(@database)
         | 
| 34 | 
            +
                      ConventionalModels.configure
         | 
| 35 | 
            +
                      ConventionalModels.configure
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
                  end
         | 
| 37 38 | 
             
                end
         | 
| 38 39 |  | 
| 39 40 | 
             
                describe ".run_code" do
         | 
| @@ -58,5 +59,27 @@ module ConventionalModels | |
| 58 59 | 
             
                    ConventionalModels.model_code_for("Test").should == "test"
         | 
| 59 60 | 
             
                  end
         | 
| 60 61 | 
             
                end
         | 
| 62 | 
            +
                
         | 
| 63 | 
            +
                describe ".run_console!" do
         | 
| 64 | 
            +
                  it "starts an IRB session" do
         | 
| 65 | 
            +
                    IRB.should_receive(:start)
         | 
| 66 | 
            +
                    ConventionalModels.should_receive(:configure_active_record)
         | 
| 67 | 
            +
                    ConventionalModels.should_receive(:configure)
         | 
| 68 | 
            +
                    ConventionalModels.run_console!
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
                
         | 
| 72 | 
            +
                describe ".remove" do
         | 
| 73 | 
            +
                  before(:each) do
         | 
| 74 | 
            +
                    ConventionalModels.unstub(:remove)
         | 
| 75 | 
            +
                    table = mock(Table, :class_name => "TestTable")
         | 
| 76 | 
            +
                    @database.should_receive(:tables).and_return([table])
         | 
| 77 | 
            +
                    Object.should_receive(:send).with(:remove_const, :TestTable)
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
                  
         | 
| 80 | 
            +
                  it "removes the table constants from the environment" do
         | 
| 81 | 
            +
                    ConventionalModels.remove(@database)
         | 
| 82 | 
            +
                  end
         | 
| 83 | 
            +
                end
         | 
| 61 84 | 
             
              end  
         | 
| 62 85 | 
             
            end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version | |
| 4 4 | 
             
              prerelease: false
         | 
| 5 5 | 
             
              segments: 
         | 
| 6 6 | 
             
              - 0
         | 
| 7 | 
            -
              - 1
         | 
| 8 7 | 
             
              - 2
         | 
| 9 | 
            -
               | 
| 8 | 
            +
              - 0
         | 
| 9 | 
            +
              version: 0.2.0
         | 
| 10 10 | 
             
            platform: ruby
         | 
| 11 11 | 
             
            authors: 
         | 
| 12 12 | 
             
            - Steve Hodgkiss
         | 
| @@ -14,8 +14,8 @@ autorequire: | |
| 14 14 | 
             
            bindir: bin
         | 
| 15 15 | 
             
            cert_chain: []
         | 
| 16 16 |  | 
| 17 | 
            -
            date: 2010-04- | 
| 18 | 
            -
            default_executable: 
         | 
| 17 | 
            +
            date: 2010-04-11 00:00:00 +01:00
         | 
| 18 | 
            +
            default_executable: cmconsole
         | 
| 19 19 | 
             
            dependencies: 
         | 
| 20 20 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 21 21 | 
             
              name: rspec
         | 
| @@ -75,8 +75,8 @@ dependencies: | |
| 75 75 | 
             
              requirement: *id004
         | 
| 76 76 | 
             
            description: Generate ActiveRecord models automatically with basic relationships based on conventions.
         | 
| 77 77 | 
             
            email: steve@hodgkiss.me.uk
         | 
| 78 | 
            -
            executables:  | 
| 79 | 
            -
             | 
| 78 | 
            +
            executables: 
         | 
| 79 | 
            +
            - cmconsole
         | 
| 80 80 | 
             
            extensions: []
         | 
| 81 81 |  | 
| 82 82 | 
             
            extra_rdoc_files: 
         | 
| @@ -91,21 +91,30 @@ files: | |
| 91 91 | 
             
            - README.rdoc
         | 
| 92 92 | 
             
            - Rakefile
         | 
| 93 93 | 
             
            - VERSION
         | 
| 94 | 
            +
            - bin/cmconsole
         | 
| 94 95 | 
             
            - conventional_models.gemspec
         | 
| 96 | 
            +
            - features/cmconsole.feature
         | 
| 95 97 | 
             
            - features/conventional_models.feature
         | 
| 96 98 | 
             
            - features/output_model_code.feature
         | 
| 99 | 
            +
            - features/step_definitions/cmconsole_steps.rb
         | 
| 97 100 | 
             
            - features/step_definitions/conventional_models_steps.rb
         | 
| 98 101 | 
             
            - features/step_definitions/output_model_code_steps.rb
         | 
| 99 102 | 
             
            - features/support/env.rb
         | 
| 100 103 | 
             
            - lib/conventional_models.rb
         | 
| 101 104 | 
             
            - lib/conventional_models/active_record_base_model_for.rb
         | 
| 105 | 
            +
            - lib/conventional_models/cli.rb
         | 
| 102 106 | 
             
            - lib/conventional_models/column.rb
         | 
| 103 107 | 
             
            - lib/conventional_models/conventions.rb
         | 
| 104 108 | 
             
            - lib/conventional_models/database.rb
         | 
| 109 | 
            +
            - lib/conventional_models/option_parser.rb
         | 
| 110 | 
            +
            - lib/conventional_models/options.rb
         | 
| 105 111 | 
             
            - lib/conventional_models/table.rb
         | 
| 106 112 | 
             
            - lib/conventional_models/version.rb
         | 
| 113 | 
            +
            - spec/conventional_models/cli_spec.rb
         | 
| 107 114 | 
             
            - spec/conventional_models/conventions_spec.rb
         | 
| 108 115 | 
             
            - spec/conventional_models/database_spec.rb
         | 
| 116 | 
            +
            - spec/conventional_models/option_parser_spec.rb
         | 
| 117 | 
            +
            - spec/conventional_models/options_spec.rb
         | 
| 109 118 | 
             
            - spec/conventional_models/table_spec.rb
         | 
| 110 119 | 
             
            - spec/conventional_models_spec.rb
         | 
| 111 120 | 
             
            - spec/spec.opts
         | 
| @@ -141,8 +150,11 @@ signing_key: | |
| 141 150 | 
             
            specification_version: 3
         | 
| 142 151 | 
             
            summary: Generate ActiveRecord models. For lazy people.
         | 
| 143 152 | 
             
            test_files: 
         | 
| 153 | 
            +
            - spec/conventional_models/cli_spec.rb
         | 
| 144 154 | 
             
            - spec/conventional_models/conventions_spec.rb
         | 
| 145 155 | 
             
            - spec/conventional_models/database_spec.rb
         | 
| 156 | 
            +
            - spec/conventional_models/option_parser_spec.rb
         | 
| 157 | 
            +
            - spec/conventional_models/options_spec.rb
         | 
| 146 158 | 
             
            - spec/conventional_models/table_spec.rb
         | 
| 147 159 | 
             
            - spec/conventional_models_spec.rb
         | 
| 148 160 | 
             
            - spec/spec_helper.rb
         |