mongify 0.0.9 → 0.1.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.
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