mongify 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/CHANGELOG.rdoc +8 -0
  2. data/Gemfile.lock +1 -1
  3. data/README.rdoc +40 -16
  4. data/features/options.feature +3 -7
  5. data/features/print.feature +1 -1
  6. data/features/process.feature +0 -1
  7. data/features/support/env.rb +4 -1
  8. data/lib/mongify.rb +3 -1
  9. data/lib/mongify/cli.rb +0 -1
  10. data/lib/mongify/cli/application.rb +10 -1
  11. data/lib/mongify/cli/help_command.rb +1 -0
  12. data/lib/mongify/cli/options.rb +13 -14
  13. data/lib/mongify/cli/version_command.rb +1 -0
  14. data/lib/mongify/cli/worker_command.rb +15 -7
  15. data/lib/mongify/configuration.rb +14 -12
  16. data/lib/mongify/database.rb +2 -1
  17. data/lib/mongify/database/base_connection.rb +25 -15
  18. data/lib/mongify/database/column.rb +99 -21
  19. data/lib/mongify/database/data_row.rb +67 -0
  20. data/lib/mongify/database/no_sql_connection.rb +48 -10
  21. data/lib/mongify/database/sql_connection.rb +34 -4
  22. data/lib/mongify/database/table.rb +69 -7
  23. data/lib/mongify/exceptions.rb +7 -0
  24. data/lib/mongify/translation.rb +45 -2
  25. data/lib/mongify/translation/printer.rb +4 -3
  26. data/lib/mongify/translation/process.rb +11 -4
  27. data/lib/mongify/ui.rb +10 -1
  28. data/lib/mongify/version.rb +2 -1
  29. data/spec/mongify/cli/worker_command_spec.rb +3 -4
  30. data/spec/mongify/configuration_spec.rb +6 -12
  31. data/spec/mongify/database/base_connection_spec.rb +7 -3
  32. data/spec/mongify/database/column_spec.rb +171 -28
  33. data/spec/mongify/database/data_row_spec.rb +102 -0
  34. data/spec/mongify/database/no_sql_connection_spec.rb +4 -6
  35. data/spec/mongify/database/table_spec.rb +23 -2
  36. data/spec/mongify/translation/printer_spec.rb +3 -3
  37. data/spec/support/config_reader.rb +3 -1
  38. data/spec/support/generate_database.rb +7 -0
  39. metadata +7 -5
  40. data/lib/mongify/cli/report.rb +0 -11
@@ -1,3 +1,11 @@
1
+ == 0.1.0 / 21 Jan 2011
2
+ * Moved from Alpha to Beta! :)
3
+ * Improved internal RDocs
4
+ * Improved specs
5
+ * Refactored
6
+ * Renamed 'translate' command to 'translation'
7
+ * Added :auto_detect option to columns
8
+ * Added ability to do a before_save on the table.
1
9
  == 0.0.9 / 19 Jan 2011
2
10
  * Added ability to rename tables
3
11
  * Fixed bug 'pre_mogified_id' not being removed in all records
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mongify (0.0.9)
4
+ mongify (0.1.0)
5
5
  activerecord (>= 2.3.10)
6
6
  activesupport (>= 2.3.10)
7
7
  bson_ext (>= 1.1.5)
@@ -7,12 +7,10 @@ However, I've only tested it with MySql and SQLite
7
7
 
8
8
  Supports any version of MongoDB
9
9
 
10
- Learn more about mongoDB at: http://www.mongodb.org
10
+ Learn more about MongoDB at: http://www.mongodb.org
11
11
 
12
12
  == Install
13
13
 
14
- <b>WARNING: This gem is still in alpha</b>
15
-
16
14
  gem install mongify
17
15
 
18
16
  == Usage
@@ -33,7 +31,7 @@ Building a config file is as simple as this:
33
31
 
34
32
  mongodb_connection do
35
33
  host "localhost"
36
- database "my_collection"
34
+ database "my_database"
37
35
  end
38
36
 
39
37
  You can check your configuration by running
@@ -46,9 +44,9 @@ You can check your configuration by running
46
44
 
47
45
  ==== Generating a translation
48
46
  If you're database is large and complex, it might be a bit too much to hand write the translation file, Mongify can help by running the translate command:
49
- mongify transalte -c database.config
47
+ mongify translation -c database.config
50
48
  Or pipe it right into a file by running
51
- mongify transalte -c database.config > translation_file.rb
49
+ mongify translation -c database.config > translation_file.rb
52
50
 
53
51
  ==== Creating a translation
54
52
  Creating a translation is pretty straight forward. It looks something like this:
@@ -89,6 +87,27 @@ Creating a translation is pretty straight forward. It looks something like this:
89
87
  Save the file as <tt>"translation_file.rb"</tt> and run the command:
90
88
 
91
89
  mongify process translation_file.rb -c database.config
90
+
91
+ === Commands
92
+
93
+ Usage: mongify command [database_translation.rb] [-c database.config]
94
+
95
+ Commands:
96
+ "check" or "ck" >> Checks connection for sql and no_sql databases [configuration_file]
97
+ "process" or "pr" >> Takes a translation and process it to mongodb [configuration_file, translation_file]
98
+ "translation" or "tr" >> Outputs a translation file from a sql connection [configuration_file]
99
+
100
+ Examples:
101
+
102
+ mongify translation -c datbase.config
103
+ mongify tr -c database.config
104
+ mongify check -c database.config
105
+ mongify process database_translation.rb -c database.config
106
+
107
+ Common options:
108
+ -h, --help Show this message
109
+ -v, --version Show version
110
+ -c, --config FILE Configuration File to use
92
111
 
93
112
  == Translation Layout and Options
94
113
 
@@ -115,12 +134,20 @@ Table Options are as follow:
115
134
  # This also assumes you have a user_id present in table_name
116
135
  <em>You can also specify both <b>:on</b> and <b>:as</b> options when embedding</em>
117
136
 
137
+ <b>NOTE: If you rename the owner_id column, make sure you update the :on to the new column name</b>
138
+
118
139
  table "table_name", :rename_to => 'my_table' # This will allow you to rename the table as it's getting process
119
140
  # Just remember that columns that use :reference need to
120
141
  # reference the new name.
121
142
 
122
143
  table "table_name", :ignore => true # This will ignore the whole table (like it doesn't exist)
123
144
  # This option is good for tables like: schema_migrations
145
+
146
+ table "table_name" do # A table can take a before_save block that will be called just
147
+ before_save do |row| # before the row is saved to the no sql database.
148
+ row.admin = row.delete('permission').to_i > 50 # This gives you the ability to do very powerful things like:
149
+ end # Moving records around, renaming records, changing values in row based on
150
+ end # some values! Checkout {Mongify::Database::DataRow} to learn more
124
151
 
125
152
  === Columns
126
153
 
@@ -142,9 +169,13 @@ Before we cover the options, you need to know what types of columns are supporte
142
169
  :decimal # Will be converted to a BigDecimal
143
170
  :string # Will be converted to a string
144
171
  :text # Will be converted to a string
145
- :datetime # Specifying a field as :datetime will convert it to Time format as it gets imported into MongoDB
172
+ :datetime # Will be converted to a Time format (DateTime is not currently supported in the Mongo ruby driver)
173
+ :date # Will be converted to a Time format (Date is not currently supported in the Mongo ruby driver)
174
+ :timestamps # Will be converted to a Time format
175
+ :time # Will be converted to a Time format (the date portion of the Time object will be 2000-01-01)
146
176
  :binary # Will be converted to a string
147
-
177
+ :boolean # Will be converted to a true or false values
178
+
148
179
  ==== Options
149
180
 
150
181
  column "post_id", :integer, :referneces => :posts # Referenced columns need to be marked as such, this will mean that they will be updated
@@ -155,9 +186,6 @@ Before we cover the options, you need to know what types of columns are supporte
155
186
 
156
187
  column "surname", :string, :rename_to => 'last_name'# Rename_to allows you to rename the column
157
188
 
158
- <em>**this is subject to change during the alpha (0.0.x release)**</em>
159
-
160
-
161
189
  == Notes
162
190
 
163
191
  I have currently only tested this in Ruby 1.8.7-p330
@@ -168,13 +196,9 @@ More testing will be done once the basic functionality is done
168
196
  == TODO
169
197
 
170
198
  * Allow you to set a :force => true for mongodb_connection, so that it drops existing database before importing
171
-
172
- === while processing
173
-
174
199
  * Work with polymorphic tables
175
- * Allow running a proc on column value
176
200
  * Update user on what is being processed
177
-
201
+ * Improve RDoc
178
202
 
179
203
  == Development
180
204
 
@@ -24,13 +24,12 @@ Feature: Mongify can be controlled using command-line options
24
24
  Commands:
25
25
  "check" or "ck" >> Checks connection for sql and no_sql databases [configuration_file]
26
26
  "process" or "pr" >> Takes a translation and process it to mongodb [configuration_file, translation_file]
27
- "translate" or "tr" >> Spits out translation from a sql connection [configuration_file]
27
+ "translation" or "tr" >> Outputs a translation file from a sql connection [configuration_file]
28
28
 
29
29
  Examples:
30
30
 
31
- mongify translate -c datbase.config
32
- mongify tr -c database.config
33
- mongify check -c database.config
31
+ mongify check -c database.config
32
+ mongify translation -c datbase.config > database_translation.rb
34
33
  mongify process database_translation.rb -c database.config
35
34
 
36
35
  See http://github.com/anlek/mongify for more details
@@ -40,7 +39,4 @@ Feature: Mongify can be controlled using command-line options
40
39
  -v, --version Show version
41
40
  -c, --config FILE Configuration File to use
42
41
 
43
- Report formatting:
44
- -q, --[no-]quiet Suppress extra output
45
-
46
42
  """
@@ -5,6 +5,6 @@ Feature: Database Translation Output
5
5
 
6
6
  Scenario: Translation Output request
7
7
  Given a database exists
8
- When I run mongify translate -c spec/files/base_configuration.rb
8
+ When I run mongify translation -c spec/files/base_configuration.rb
9
9
  Then it succeeds
10
10
  And it should print out the database schema
@@ -3,7 +3,6 @@ Feature: Processing a translation
3
3
  As a user
4
4
  I want to be able to process a translation and move my data to mongodb!
5
5
 
6
- @wip
7
6
  Scenario: Process
8
7
  Given a database exists
9
8
  And a blank mongodb
@@ -11,7 +11,9 @@ require 'spec/support/config_reader'
11
11
  ::CONNECTION_CONFIG = ConfigReader.new(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__)))) + '/spec/support/database.yml')
12
12
  ::DATABASE_PRINT = File.read(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__)))) + '/spec/support/database_output.txt')
13
13
 
14
+ # Used to run mongify command
14
15
  module MongifyWorld
16
+ # Executes command and tracks results
15
17
  def run(cmd)
16
18
  stderr_file = Tempfile.new('mongify-world')
17
19
  stderr_file.close
@@ -19,7 +21,8 @@ module MongifyWorld
19
21
  @last_exit_status = $?.exitstatus
20
22
  @last_stderr = IO.read(stderr_file.path)
21
23
  end
22
-
24
+
25
+ # Executes mongify command with arguments
23
26
  def mongify(args)
24
27
  run("ruby -Ilib -rubygems bin/mongify #{args}")
25
28
  end
@@ -10,11 +10,13 @@ require 'mongify/translation'
10
10
  require 'mongify/configuration'
11
11
  require 'mongify/database'
12
12
 
13
- module Mongify
13
+ module Mongify # Namespace for Mongify
14
14
  class << self
15
+ # Handles setting root for the application
15
16
  def root=(value)
16
17
  @root = value
17
18
  end
19
+ #Raises RootMissing if you attempt to call root without setting it
18
20
  def root
19
21
  raise RootMissing, "Root not configured" if @root.nil?
20
22
  @root
@@ -1,7 +1,6 @@
1
1
  require 'mongify'
2
2
 
3
3
  require 'mongify/cli/options'
4
- require 'mongify/cli/report'
5
4
  require 'mongify/cli/version_command'
6
5
  require 'mongify/cli/help_command'
7
6
  require 'mongify/cli/worker_command'
@@ -1,4 +1,5 @@
1
1
  module Mongify
2
+ # The Command Line Interface module
2
3
  module CLI
3
4
  #
4
5
  # Represents an instance of a Mongify application.
@@ -7,16 +8,20 @@ module Mongify
7
8
  #
8
9
  class Application
9
10
 
11
+ # Successful execution exit code
10
12
  STATUS_SUCCESS = 0
13
+ # Failed execution exit code
11
14
  STATUS_ERROR = 1
12
15
 
13
- def initialize(arguments=["--help"], stdin=$stdin, stdout=$stdout)
16
+ def initialize(arguments=[], stdin=$stdin, stdout=$stdout)
17
+ arguments = ['-h'] if arguments.empty?
14
18
  @options = Options.new(arguments)
15
19
  @status = STATUS_SUCCESS
16
20
  Mongify::Configuration.in_stream = stdin
17
21
  Mongify::Configuration.out_stream = stdout
18
22
  end
19
23
 
24
+ # Runs the application
20
25
  def execute!
21
26
  begin
22
27
  cmd = @options.parse
@@ -28,13 +33,17 @@ module Mongify
28
33
  return @status
29
34
  end
30
35
 
36
+ # Sends output to the UI
31
37
  def output(message)
32
38
  UI.puts(message)
33
39
  end
34
40
 
41
+ # Sets status code as successful
35
42
  def report_success
36
43
  @status = STATUS_SUCCESS
37
44
  end
45
+
46
+ # Sets status code as failure (or error)
38
47
  def report_error
39
48
  @status = STATUS_ERROR
40
49
  end
@@ -7,6 +7,7 @@ module Mongify
7
7
  def initialize(parser)
8
8
  @parser = parser
9
9
  end
10
+ #Executes the help command
10
11
  def execute(view)
11
12
  view.output(@parser.to_s)
12
13
  view.report_success
@@ -9,12 +9,12 @@ module Mongify
9
9
  @parsed = false
10
10
  @argv = argv
11
11
  @parser = OptionParser.new
12
- @report_class = VerboseReport
13
12
  #@command_class = ReekCommand
14
13
  set_options
15
14
 
16
15
  end
17
16
 
17
+ # Banner for help output
18
18
  def banner
19
19
  progname = @parser.program_name
20
20
  return <<EOB
@@ -25,9 +25,8 @@ Commands:
25
25
 
26
26
  Examples:
27
27
 
28
- #{progname} translate -c datbase.config
29
- #{progname} tr -c database.config
30
28
  #{progname} check -c database.config
29
+ #{progname} translation -c datbase.config > database_translation.rb
31
30
  #{progname} process database_translation.rb -c database.config
32
31
 
33
32
  See http://github.com/anlek/mongify for more details
@@ -35,7 +34,8 @@ See http://github.com/anlek/mongify for more details
35
34
  EOB
36
35
  end
37
36
 
38
-
37
+ # Sets the options for CLI
38
+ # Also used for help output
39
39
  def set_options
40
40
  @parser.banner = banner
41
41
  @parser.separator "Common options:"
@@ -48,13 +48,9 @@ EOB
48
48
  @parser.on('-c', '--config FILE', "Configuration File to use") do |file|
49
49
  @config_file = file
50
50
  end
51
-
52
- @parser.separator "\nReport formatting:"
53
- @parser.on("-q", "--[no-]quiet", "Suppress extra output") do |opt|
54
- @report_class = opt ? QuietReport : VerboseReport
55
- end
56
51
  end
57
-
52
+
53
+ # Parses CLI passed attributes and figures out what command user is trying to run
58
54
  def parse
59
55
  parse_options
60
56
 
@@ -71,24 +67,27 @@ EOB
71
67
  end
72
68
  end
73
69
 
70
+ #######
74
71
  private
72
+ #######
75
73
 
74
+ # Returns the translation_file or nil
76
75
  def translation_file(argv=@argv)
77
76
  parse_options
78
77
  return nil if argv.length < 2
79
78
  argv[1]
80
79
  end
81
80
 
81
+ # Returns action (command) user is calling or ''
82
82
  def action(argv=@argv)
83
83
  parse_options
84
84
  @argv.try(:[],0) || ''
85
85
  end
86
-
86
+
87
+ # option parser, ensuring parse_options is only called once
87
88
  def parse_options
88
89
  @parsed = true && @parser.parse!(@argv) unless @parsed
89
- end
90
-
91
-
90
+ end
92
91
  end
93
92
  end
94
93
  end
@@ -9,6 +9,7 @@ module Mongify
9
9
  def initialize(progname)
10
10
  @progname = progname
11
11
  end
12
+ #Executes version command
12
13
  def execute(view)
13
14
  view.output("#{@progname} #{Mongify::VERSION}\n")
14
15
  view.report_success
@@ -7,11 +7,15 @@ module Mongify
7
7
  class WorkerCommand
8
8
  attr_accessor :view
9
9
 
10
+ # A hash of available commands
11
+ # Including description, additional shortcuts to run the commands and requirements to run the command
10
12
  AVAILABLE_COMMANDS = {
11
13
  :check => {:commands => ['check', 'ck'], :description => "Checks connection for sql and no_sql databases", :required => [:configuration_file]},
12
- :translate => {:commands => ['translate', 'tr'], :description => "Spits out translation from a sql connection", :required => [:configuration_file]},
14
+ :translation => {:commands => ['translation', 'tr'], :description => "Outputs a translation file from a sql connection", :required => [:configuration_file]},
13
15
  :process => {:commands => ['process', 'pr'], :description => "Takes a translation and process it to mongodb", :required => [:configuration_file, :translation_file]}
14
16
  }
17
+
18
+ # Prints out a nice display of the list of commands
15
19
  def self.list_commands
16
20
  [].tap do |commands|
17
21
  AVAILABLE_COMMANDS.each do |key, obj|
@@ -19,7 +23,8 @@ module Mongify
19
23
  end
20
24
  end.sort
21
25
  end
22
-
26
+
27
+ # Finds a command array by any of the shortcut commands
23
28
  def self.find_command(command)
24
29
  AVAILABLE_COMMANDS.each do |key, options|
25
30
  return [key, options] if(options[:commands].include?(command.to_s.downcase))
@@ -34,6 +39,7 @@ module Mongify
34
39
  @parser = parser
35
40
  end
36
41
 
42
+ #Executes the worked based on a given command
37
43
  def execute(view)
38
44
  self.view = view
39
45
 
@@ -50,7 +56,7 @@ module Mongify
50
56
  end
51
57
 
52
58
  case current_command
53
- when :translate
59
+ when :translation
54
60
  check_connections
55
61
  view.output(Mongify::Translation.load(@config.sql_connection).print)
56
62
  when :check
@@ -67,6 +73,7 @@ module Mongify
67
73
  view.report_success
68
74
  end
69
75
 
76
+ # Passes find command to parent class
70
77
  def find_command(command=@command)
71
78
  self.class.find_command(command)
72
79
  end
@@ -75,19 +82,20 @@ module Mongify
75
82
  private
76
83
  #######
77
84
 
78
- def check_connections(sql_only = false)
79
- check_sql_connection && (sql_only || check_nosql_connection)
85
+ # Checks both sql and no sql connection
86
+ def check_connections
87
+ check_sql_connection && check_nosql_connection
80
88
  end
81
89
 
90
+ # Checks sql connection if it's valid and has_connection?
82
91
  def check_sql_connection
83
92
  @config.sql_connection.valid? && @config.sql_connection.has_connection?
84
93
  end
85
94
 
95
+ # Checks no sql connection if it's valid and has_connection?
86
96
  def check_nosql_connection
87
97
  @config.no_sql_connection.valid? && @config.no_sql_connection.has_connection?
88
98
  end
89
-
90
-
91
99
  end
92
100
  end
93
101
  end