conventional_models 0.2.0 → 0.2.1

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/Gemfile CHANGED
@@ -1,8 +1,9 @@
1
1
  source :gemcutter
2
2
 
3
3
  group :features do
4
- gem "cucumber", "0.6.4"
5
- gem "aruba", "0.1.7"
4
+ gem "cucumber", "0.7.2"
5
+ gem "aruba"
6
+ gem "open4"
6
7
  end
7
8
 
8
9
  group :specs do
@@ -12,6 +13,7 @@ end
12
13
  group :development do
13
14
  gem "jeweler"
14
15
  gem "rake"
16
+ gem "ZenTest"
15
17
  end
16
18
 
17
19
  gem "activerecord", "2.3.5"
data/Gemfile.lock CHANGED
@@ -1,5 +1,9 @@
1
1
  ---
2
2
  dependencies:
3
+ ZenTest:
4
+ group:
5
+ - :development
6
+ version: ">= 0"
3
7
  activerecord:
4
8
  group:
5
9
  - :default
@@ -19,7 +23,7 @@ dependencies:
19
23
  aruba:
20
24
  group:
21
25
  - :features
22
- version: = 0.1.7
26
+ version: ">= 0"
23
27
  jeweler:
24
28
  group:
25
29
  - :development
@@ -27,43 +31,51 @@ dependencies:
27
31
  cucumber:
28
32
  group:
29
33
  - :features
30
- version: = 0.6.4
34
+ version: = 0.7.2
35
+ open4:
36
+ group:
37
+ - :features
38
+ version: ">= 0"
31
39
  specs:
32
40
  - rake:
33
41
  version: 0.8.7
42
+ - ZenTest:
43
+ version: 4.3.1
34
44
  - activesupport:
35
45
  version: 2.3.5
36
46
  - activerecord:
37
47
  version: 2.3.5
38
48
  - aruba:
39
- version: 0.1.7
49
+ version: 0.1.9
40
50
  - builder:
41
51
  version: 2.1.2
52
+ - bundler:
53
+ version: 0.9.24
42
54
  - diff-lcs:
43
55
  version: 1.1.2
56
+ - trollop:
57
+ version: 1.16.2
58
+ - gherkin:
59
+ version: 1.0.25
44
60
  - json_pure:
45
- version: 1.2.4
46
- - polyglot:
47
- version: 0.3.1
61
+ version: 1.4.3
48
62
  - term-ansicolor:
49
63
  version: 1.0.5
50
- - treetop:
51
- version: 1.4.5
52
64
  - cucumber:
53
- version: 0.6.4
65
+ version: 0.7.2
54
66
  - gemcutter:
55
67
  version: 0.5.0
56
68
  - git:
57
69
  version: 1.2.5
58
- - rubyforge:
59
- version: 2.0.4
60
70
  - jeweler:
61
71
  version: 1.4.0
72
+ - open4:
73
+ version: 1.0.1
62
74
  - rspec:
63
75
  version: 1.3.0
64
76
  - sqlite3-ruby:
65
77
  version: 1.2.5
66
- hash: e54d068ab5b54822142a3392faafd4850696a431
78
+ hash: 49b2ba6893f5940e80f19c400ec7f4a2d38964a5
67
79
  sources:
68
80
  - Rubygems:
69
81
  uri: http://gemcutter.org
@@ -9,7 +9,7 @@ Feature: Cmconsole
9
9
  """
10
10
  development:
11
11
  adapter: sqlite3
12
- database: test.sqlite
12
+ database: development.sqlite
13
13
  pool: 5
14
14
  timeout: 5000
15
15
 
@@ -26,8 +26,8 @@ Feature: Cmconsole
26
26
  timeout: 5000
27
27
  """
28
28
  And a table "pages"
29
- When I run "../../bin/cmconsole"
30
- Then I should see ">> "
29
+ When I run "../../bin/cmconsole" as child "irb"
30
+ Then I should see ">> " from child "irb"
31
31
 
32
32
 
33
33
 
@@ -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 => 'test.sqlite', :adapter => 'sqlite3')
13
+ ActiveRecord::Base.establish_connection(:database => 'development.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 => 'test.sqlite', :adapter => 'sqlite3')
33
+ ActiveRecord::Base.establish_connection(:database => 'development.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 => 'test.sqlite', :adapter => 'sqlite3')
61
+ ActiveRecord::Base.establish_connection(:database => 'development.sqlite', :adapter => 'sqlite3')
62
62
  require 'conventional_models'
63
63
  ConventionalModels.configure do
64
64
  primary_key_name "Id"
@@ -0,0 +1,43 @@
1
+ Feature: Multiple database connection
2
+ In order to transfer data between databases
3
+ As a user
4
+ I want to be able to connect and generate models for multiple databases
5
+
6
+ Scenario: Connect to multiple database
7
+ Given a table "pages" in "development"
8
+ And a table "pages" in "test"
9
+ And a file named "my_script.rb" with:
10
+ """
11
+ $:.unshift("../../lib")
12
+ require 'rubygems'
13
+ require 'active_record'
14
+ ActiveRecord::Base.establish_connection(:database => 'development.sqlite', :adapter => 'sqlite3')
15
+ require 'conventional_models'
16
+ config = {
17
+ "development" => {
18
+ "database" => 'development.sqlite',
19
+ "adapter" => 'sqlite3'
20
+ },
21
+ "test" => {
22
+ "database" => 'test.sqlite',
23
+ "adapter" => 'sqlite3'
24
+ }
25
+ }
26
+ ConventionalModels.configure do
27
+ connection config["development"]
28
+ module_name "Development"
29
+ end
30
+ ConventionalModels.configure do
31
+ connection config["test"]
32
+ module_name "Test"
33
+ end
34
+ puts ConventionalModels.model_code
35
+ Development::Page.create!
36
+ Development::Page.create!
37
+ Test::Page.create!
38
+ puts "Number of development records: #{Development::Page.count}"
39
+ puts "Number of production records: #{Test::Page.count}"
40
+ """
41
+ When I run "ruby my_script.rb"
42
+ Then I should see "Number of development records: 2"
43
+ Then I should see "Number of production records: 1"
@@ -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 => 'test.sqlite', :adapter => 'sqlite3')
21
+ ActiveRecord::Base.establish_connection(:database => 'development.sqlite', :adapter => 'sqlite3')
22
22
  require 'conventional_models'
23
23
  ConventionalModels.configure do
24
24
  primary_key_name "Id"
@@ -0,0 +1,4 @@
1
+ Given /^a table "([^\"]*)" in "([^\"]*)"$/ do |name, connection|
2
+ ActiveRecord::Base.establish_connection(connection)
3
+ ActiveRecord::Base.connection.execute "CREATE TABLE \"#{name}\" (\"id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)"
4
+ end
@@ -9,6 +9,10 @@ require 'active_record'
9
9
  Before do
10
10
  config = {
11
11
  "development" => {
12
+ "database" => 'tmp/aruba/development.sqlite',
13
+ "adapter" => 'sqlite3'
14
+ },
15
+ "test" => {
12
16
  "database" => 'tmp/aruba/test.sqlite',
13
17
  "adapter" => 'sqlite3'
14
18
  }
@@ -18,6 +22,6 @@ Before do
18
22
 
19
23
  system "mkdir -p tmp"
20
24
  system "mkdir -p tmp/aruba"
21
- system 'rm -f tmp/aruba/test.sqlite'
25
+ system 'rm -f tmp/aruba/development.sqlite'
22
26
  ActiveRecord::Base.establish_connection(config["development"])
23
27
  end
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'active_record'
3
3
  require 'active_support'
4
4
  require 'conventional_models/version'
5
- require 'conventional_models/conventions'
5
+ require 'conventional_models/config'
6
6
  require 'conventional_models/database'
7
7
  require 'conventional_models/table'
8
8
  require 'conventional_models/column'
@@ -16,12 +16,9 @@ require 'irb/completion'
16
16
  module ConventionalModels
17
17
  @@database = nil
18
18
 
19
- def self.configure(&block)
20
- @@conventions = Conventions.new(&block)
21
- unless @@database.nil?
22
- remove(@@database)
23
- end
24
- @@database = Database.new(@@conventions)
19
+ def self.configure(config=nil, &block)
20
+ @@config = Config.new(&block)
21
+ @@database = Database.new(@@config)
25
22
  run_code @@database.code
26
23
  end
27
24
 
@@ -48,10 +45,4 @@ module ConventionalModels
48
45
  ActiveRecord::Base.configurations = config
49
46
  ActiveRecord::Base.establish_connection(config[environment])
50
47
  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
57
48
  end
@@ -1,12 +1,12 @@
1
1
  module ConventionalModels
2
- class Conventions
2
+ class Config
3
3
  def initialize(&block)
4
4
  builder = Builder.new(self)
5
5
  builder.instance_eval(&block) if block
6
6
  end
7
7
 
8
- attr_accessor :ignored_tables, :primary_key_name, :class_name,
9
- :belongs_to_matcher, :belongs_to_name
8
+ attr_accessor :ignored_tables, :primary_key_name, :class_name, :base_class,
9
+ :belongs_to_matcher, :belongs_to_name, :connection, :module_name
10
10
 
11
11
  class Builder
12
12
  def initialize(config)
@@ -16,6 +16,7 @@ module ConventionalModels
16
16
  primary_key_name "id"
17
17
  class_name {|table_name| table_name.singularize.camelize}
18
18
  ignore_tables "schema_migrations", "sqlite_sequence", "sysdiagrams"
19
+ base_class "::ActiveRecord::Base"
19
20
  end
20
21
 
21
22
  def ignore_tables(*tables)
@@ -37,6 +38,18 @@ module ConventionalModels
37
38
  def class_name(&block)
38
39
  @config.class_name = block
39
40
  end
41
+
42
+ def connection(conn)
43
+ @config.connection = conn
44
+ end
45
+
46
+ def module_name(name)
47
+ @config.module_name = name
48
+ end
49
+
50
+ def base_class(name)
51
+ @config.base_class = name
52
+ end
40
53
  end
41
54
  end
42
55
 
@@ -4,9 +4,25 @@ module ConventionalModels
4
4
  class Database
5
5
  attr_accessor :tables
6
6
 
7
- def initialize(conventions)
8
- @connection = ::ActiveRecord::Base.connection
9
- @conventions = conventions
7
+ def initialize(config)
8
+ if config.connection.nil?
9
+ @connection = ::ActiveRecord::Base.connection
10
+ else
11
+ base_class_code = []
12
+ base_class_code << "module ::#{config.module_name}"
13
+ base_class_code << " class Base < ActiveRecord::Base;"
14
+ base_class_code << " @abstract_class = true;"
15
+ base_class_code << " end;"
16
+ base_class_code << "end"
17
+ eval base_class_code.join
18
+ @base_class = "::#{config.module_name}::Base".constantize
19
+ @base_class.class_eval do
20
+ establish_connection config.connection
21
+ end
22
+ config.base_class = @base_class
23
+ @connection = @base_class.connection
24
+ end
25
+ @config = config
10
26
  @tables = []
11
27
  apply_conventions
12
28
  end
@@ -26,22 +42,22 @@ module ConventionalModels
26
42
 
27
43
  protected
28
44
  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)
45
+ @connection.tables.select{|table| !@config.ignored_tables.include? table}.each do |table|
46
+ @tables << Table.new(table, @connection.columns(table), @config)
31
47
  end
32
48
 
33
49
  @tables.each do |table|
34
50
  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
51
+ name = @config.belongs_to_name.call(belongs_to)
52
+ has_many_table = @tables.select{|t| t.class_name == @config.class_name.call(name)}.first
37
53
  if has_many_table
38
54
  unconventions = []
39
55
  unless table.conventional_name?
40
56
  unconventions << ":class_name => '#{table.class_name}'"
41
57
  unconventions << ":foreign_key => '#{belongs_to.name}'"
42
58
  end
43
- unless @conventions.primary_key_name == "id"
44
- unconventions << ":primary_key => '#{@conventions.primary_key_name}'"
59
+ unless @config.primary_key_name == "id"
60
+ unconventions << ":primary_key => '#{@config.primary_key_name}'"
45
61
  end
46
62
 
47
63
  has_many_table.lines << ["has_many :#{table.name.tableize}", "#{unconventions.join(", ")}"].select do |convention|
@@ -7,7 +7,7 @@ module ConventionalModels
7
7
  @columns = columns
8
8
  @lines = []
9
9
  @belongs_to_names = []
10
- @conventions = conventions
10
+ @config = conventions
11
11
 
12
12
  apply_conventions
13
13
  end
@@ -17,7 +17,7 @@ module ConventionalModels
17
17
  end
18
18
 
19
19
  def code
20
- "class ::#{@name.singularize.camelize} < ::ActiveRecord::Base\n#{@lines.map{|l| " #{l}"}.join("\n")}\nend"
20
+ "class ::#{@class_name} < #{@config.base_class}\n#{@lines.map{|l| " #{l}"}.join("\n")}\nend"
21
21
  end
22
22
 
23
23
  def conventional_name?
@@ -27,17 +27,21 @@ module ConventionalModels
27
27
  protected
28
28
 
29
29
  def apply_conventions
30
- @class_name = @conventions.class_name.call(@name)
31
-
32
- @lines << "set_primary_key \"#{@conventions.primary_key_name}\"" unless @conventions.primary_key_name == "id"
30
+ @class_name = @config.class_name.call(@name)
31
+
32
+ unless @config.module_name.nil?
33
+ @class_name = "#{@config.module_name}::#{@class_name}"
34
+ end
35
+
36
+ @lines << "set_primary_key \"#{@config.primary_key_name}\"" unless @config.primary_key_name == "id"
33
37
 
34
38
  @lines << "set_table_name \"#{@name}\"" unless @name.tableize == @name
35
39
 
36
40
  @columns.each do |column|
37
- if @conventions.belongs_to_matcher.call(column)
38
- name = @conventions.belongs_to_name.call(column)
41
+ if @config.belongs_to_matcher.call(column)
42
+ name = @config.belongs_to_name.call(column)
39
43
  @belongs_to_names << column
40
- @lines << "belongs_to :#{name.underscore}, :class_name => '#{@conventions.class_name.call(name)}'"
44
+ @lines << "belongs_to :#{name.underscore}, :class_name => '#{@config.class_name.call(name)}'"
41
45
  end
42
46
  end
43
47
  end
@@ -2,7 +2,7 @@ module ConventionalModels #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 2
5
- BUILD = 0
5
+ BUILD = 1
6
6
 
7
7
  STRING = [MAJOR, MINOR, BUILD].join('.')
8
8
  end
@@ -2,11 +2,11 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  module ConventionalModels
4
4
  describe CLI do
5
+ let(:option_parser) { mock(OptionParser, :options => @options) }
5
6
  before(:each) do
6
7
  @args = []
7
8
  @options = Options.new
8
- @option_parser = mock(OptionParser, :options => @options)
9
- OptionParser.stub(:new).and_return(@option_parser)
9
+ OptionParser.stub(:new).and_return(option_parser)
10
10
  File.stub(:exists?).with(@options.config).and_return(true)
11
11
  end
12
12
 
@@ -29,9 +29,9 @@ module ConventionalModels
29
29
  @cli.run
30
30
  end
31
31
 
32
- describe "with parsed options" do
32
+ context "with parsed options" do
33
33
  before(:each) do
34
- @option_parser.stub(:parsed_options?).and_return(true)
34
+ option_parser.stub(:parsed_options?).and_return(true)
35
35
  ConventionalModels.stub(:configure)
36
36
  ConventionalModels.stub(:model_code)
37
37
  ConventionalModels.stub(:configure_active_record)
@@ -43,7 +43,7 @@ module ConventionalModels
43
43
  run
44
44
  end
45
45
 
46
- describe "when config doesnt exist" do
46
+ context "when config doesnt exist" do
47
47
  before(:each) do
48
48
  File.stub(:exists?).with(@options.config).and_return(false)
49
49
  end
@@ -75,7 +75,7 @@ module ConventionalModels
75
75
  run
76
76
  end
77
77
 
78
- describe "with skip-configure option" do
78
+ context "with skip-configure option" do
79
79
  it "does not call configure" do
80
80
  @options.skip_configure = true
81
81
  ConventionalModels.should_not_receive(:configure)
@@ -83,7 +83,7 @@ module ConventionalModels
83
83
  end
84
84
  end
85
85
 
86
- describe "with help option" do
86
+ context "with help option" do
87
87
  it "outputs help" do
88
88
  RDoc.should_receive(:usage)
89
89
  @options.output_help = true
@@ -92,7 +92,7 @@ module ConventionalModels
92
92
  end
93
93
  end
94
94
 
95
- describe "with output version option" do
95
+ context "with output version option" do
96
96
  it "outputs the version" do
97
97
  @options.output_version = true
98
98
  ConventionalModels.should_not_receive(:configure_active_record)
@@ -102,10 +102,10 @@ module ConventionalModels
102
102
  end
103
103
  end
104
104
 
105
- describe "with invalid options" do
105
+ context "with invalid options" do
106
106
  it "prints usage" do
107
107
  RDoc.should_receive(:usage).with('usage')
108
- @option_parser.stub(:parsed_options?).and_return(false)
108
+ option_parser.stub(:parsed_options?).and_return(false)
109
109
  run
110
110
  end
111
111
  end