mongify 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.yardopts +3 -0
- data/CHANGELOG.rdoc +5 -0
- data/Gemfile.lock +52 -6
- data/LICENSE +1 -1
- data/README.rdoc +29 -11
- data/Rakefile +37 -9
- data/features/options.feature +2 -0
- data/features/print.feature +1 -1
- data/features/process.feature +10 -1
- data/features/step_definitions/process_steps.rb +11 -1
- data/features/support/env.rb +1 -1
- data/lib/mongify/cli/application.rb +7 -7
- data/lib/mongify/cli/command/worker.rb +18 -14
- data/lib/mongify/cli/options.rb +2 -1
- data/lib/mongify/configuration.rb +5 -5
- data/lib/mongify/database/base_connection.rb +6 -6
- data/lib/mongify/database/column.rb +40 -40
- data/lib/mongify/database/data_row.rb +9 -9
- data/lib/mongify/database/no_sql_connection.rb +61 -35
- data/lib/mongify/database/sql_connection.rb +44 -15
- data/lib/mongify/database/table.rb +62 -46
- data/lib/mongify/exceptions.rb +5 -5
- data/lib/mongify/progressbar.rb +15 -15
- data/lib/mongify/status.rb +8 -8
- data/lib/mongify/translation.rb +19 -17
- data/lib/mongify/translation/process.rb +16 -123
- data/lib/mongify/translation/processor_common.rb +132 -0
- data/lib/mongify/translation/sync.rb +112 -0
- data/lib/mongify/ui.rb +9 -9
- data/lib/mongify/version.rb +1 -1
- data/mongify.gemspec +4 -2
- data/spec/files/deleting_fields_from_embedding_parent_translation.rb +19 -0
- data/spec/files/embedded_parent_translation.rb +1 -1
- data/spec/mongify/cli/application_spec.rb +1 -1
- data/spec/mongify/cli/options_spec.rb +1 -1
- data/spec/mongify/cli/worker_command_spec.rb +46 -17
- data/spec/mongify/database/column_spec.rb +21 -21
- data/spec/mongify/database/data_row_spec.rb +11 -11
- data/spec/mongify/database/no_sql_connection_spec.rb +61 -27
- data/spec/mongify/database/sql_connection_spec.rb +62 -2
- data/spec/mongify/database/table_spec.rb +53 -29
- data/spec/mongify/translation/printer_spec.rb +2 -2
- data/spec/mongify/translation/process_spec.rb +50 -34
- data/spec/mongify/translation/sync_spec.rb +184 -0
- data/spec/mongify/translation_spec.rb +8 -8
- data/spec/mongify/ui_spec.rb +12 -12
- data/spec/mongify_spec.rb +1 -1
- data/spec/spec_helper.rb +8 -1
- data/spec/support/config_reader.rb +2 -2
- data/spec/support/database_generator.rb +68 -25
- data/spec/support/database_output.txt +17 -0
- metadata +41 -6
@@ -3,9 +3,9 @@ module Mongify
|
|
3
3
|
#
|
4
4
|
# Sql connection configuration
|
5
5
|
#
|
6
|
-
#
|
6
|
+
#
|
7
7
|
# Basic format should look something like this:
|
8
|
-
#
|
8
|
+
#
|
9
9
|
# sql_connection do
|
10
10
|
# adapter "mysql"
|
11
11
|
# host "localhost"
|
@@ -14,7 +14,7 @@ module Mongify
|
|
14
14
|
# database "my_database"
|
15
15
|
# end
|
16
16
|
# Possible attributes:
|
17
|
-
#
|
17
|
+
#
|
18
18
|
# adapter
|
19
19
|
# host
|
20
20
|
# database
|
@@ -23,13 +23,15 @@ module Mongify
|
|
23
23
|
# port
|
24
24
|
# encoding
|
25
25
|
# socket
|
26
|
-
#
|
26
|
+
# batch_size
|
27
|
+
#
|
27
28
|
class SqlConnection < Mongify::Database::BaseConnection
|
28
|
-
|
29
|
+
|
29
30
|
# List of required fields to bulid a valid sql connection
|
30
31
|
REQUIRED_FIELDS = %w{host adapter database}
|
31
|
-
|
32
|
-
def initialize(options=
|
32
|
+
|
33
|
+
def initialize(options={})
|
34
|
+
options['batch_size'] ||= 10000
|
33
35
|
super(options)
|
34
36
|
end
|
35
37
|
|
@@ -37,7 +39,7 @@ module Mongify
|
|
37
39
|
def setup_connection_adapter
|
38
40
|
ActiveRecord::Base.establish_connection(self.to_hash)
|
39
41
|
end
|
40
|
-
|
42
|
+
|
41
43
|
# Returns true or false depending if the record is valid
|
42
44
|
def valid?
|
43
45
|
return false unless @adapter
|
@@ -48,20 +50,20 @@ module Mongify
|
|
48
50
|
end
|
49
51
|
false
|
50
52
|
end
|
51
|
-
|
53
|
+
|
52
54
|
# Returns true or false depending if the connction actually talks to the database server.
|
53
55
|
def has_connection?
|
54
56
|
setup_connection_adapter
|
55
57
|
connection.send(:connect) if ActiveRecord::Base.connection.respond_to?(:connect)
|
56
58
|
true
|
57
59
|
end
|
58
|
-
|
60
|
+
|
59
61
|
# Returns the active_record connection
|
60
62
|
def connection
|
61
63
|
return nil unless has_connection?
|
62
64
|
ActiveRecord::Base.connection
|
63
65
|
end
|
64
|
-
|
66
|
+
|
65
67
|
# Returns all the tables in the database server
|
66
68
|
def tables
|
67
69
|
return nil unless has_connection?
|
@@ -72,16 +74,43 @@ module Mongify
|
|
72
74
|
def columns_for(table_name)
|
73
75
|
self.connection.columns(table_name)
|
74
76
|
end
|
75
|
-
|
77
|
+
|
76
78
|
# Returns an array with hash values of all the records in a given table
|
77
|
-
def select_rows(table_name)
|
78
|
-
self.connection.select_all("SELECT * FROM #{table_name}")
|
79
|
+
def select_rows(table_name, &block)
|
80
|
+
return self.connection.select_all("SELECT * FROM #{table_name}") unless block_given?
|
81
|
+
|
82
|
+
row_count = count(table_name);
|
83
|
+
pages = (row_count.to_f/batch_size).ceil
|
84
|
+
(1..pages).each do |page|
|
85
|
+
rows = select_paged_rows(table_name, batch_size, page)
|
86
|
+
yield rows, page, pages
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
def select_paged_rows(table_name, batch_size, page)
|
92
|
+
connection.select_all("SELECT * FROM #{table_name} LIMIT #{batch_size} OFFSET #{(page - 1) * batch_size}")
|
93
|
+
end
|
94
|
+
|
95
|
+
# Returns an array with hash values of the records in a given table specified by a query
|
96
|
+
def select_by_query(query)
|
97
|
+
self.connection.select_all(query)
|
98
|
+
end
|
99
|
+
|
100
|
+
def count(table_name, where = nil)
|
101
|
+
q = "SELECT COUNT(*) FROM #{table_name}"
|
102
|
+
q = "#{q} WHERE #{where}" if where
|
103
|
+
self.connection.select_value(q).to_i
|
104
|
+
end
|
105
|
+
|
106
|
+
def execute(query)
|
107
|
+
self.connection.execute(query)
|
79
108
|
end
|
80
109
|
|
81
110
|
#######
|
82
111
|
private
|
83
112
|
#######
|
84
|
-
# Used to check if this is a sqlite connection
|
113
|
+
# Used to check if this is a sqlite connection
|
85
114
|
def sqlite_adapter?
|
86
115
|
@adapter && (@adapter.downcase == 'sqlite' || @adapter.downcase == 'sqlite3')
|
87
116
|
end
|
@@ -1,125 +1,130 @@
|
|
1
1
|
module Mongify
|
2
2
|
module Database
|
3
3
|
#
|
4
|
-
# A representation of a sql table and how it should map to a no_sql collection
|
4
|
+
# A representation of a sql table and how it should map to a no_sql collection
|
5
5
|
#
|
6
6
|
# ==== Structure
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# Structure for defining a table is as follows:
|
9
9
|
# table "table_name", {options} do
|
10
10
|
# # columns go here...
|
11
11
|
# end
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# ==== Options
|
14
|
-
#
|
14
|
+
#
|
15
15
|
# Table Options are as follow:
|
16
16
|
# table "table_name" # Does a straight copy of the table
|
17
17
|
# table "table_name", :embed_in => 'users' # Embeds table_name into users, assuming a user_id is present in table_name.
|
18
18
|
# # This will also assume you want the table embedded as an array.
|
19
|
-
#
|
19
|
+
#
|
20
20
|
# table "table_name", # Embeds table_name into users, linking it via a owner_id
|
21
21
|
# :embed_in => 'users', # This will also assume you want the table embedded as an array.
|
22
|
-
# :on => 'owner_id'
|
23
|
-
#
|
22
|
+
# :on => 'owner_id'
|
23
|
+
#
|
24
24
|
# table "table_name", # Embeds table_name into users as a one to one relationship
|
25
25
|
# :embed_in => 'users', # This also assumes you have a user_id present in table_name
|
26
26
|
# :on => 'owner_id', # You can also specify both :on and :as options when embedding
|
27
|
-
# :as => 'object' # NOTE: If you rename the owner_id column, make sure you
|
27
|
+
# :as => 'object' # NOTE: If you rename the owner_id column, make sure you
|
28
28
|
# # update the :on to the new column name
|
29
|
-
#
|
30
|
-
#
|
29
|
+
#
|
30
|
+
#
|
31
31
|
# table "table_name", :rename_to => 'my_table' # This will allow you to rename the table as it's getting process
|
32
32
|
# # Just remember that columns that use :reference need to
|
33
33
|
# # reference the new name.
|
34
|
-
#
|
34
|
+
#
|
35
35
|
# table "table_name", :ignore => true # This will ignore the whole table (like it doesn't exist)
|
36
36
|
# # This option is good for tables like: schema_migrations
|
37
|
-
#
|
37
|
+
#
|
38
38
|
# table "table_name", # This allows you to specify the table as being polymorphic
|
39
39
|
# :polymorphic => 'notable', # and provide the name of the polymorphic relationship.
|
40
40
|
# :embed_in => true # Setting embed_in => true allows the relationship to be
|
41
41
|
# # embedded directly into the parent class.
|
42
42
|
# # If you do not embed it, the polymorphic table will be copied in to
|
43
43
|
# # MongoDB and the notable_id will be updated to the new BSON::ObjectID
|
44
|
-
#
|
44
|
+
#
|
45
45
|
# table "table_name" do # A table can take a before_save block that will be called just
|
46
46
|
# before_save do |row| # before the row is saved to the no sql database.
|
47
47
|
# row.admin = row.delete('permission').to_i > 50 # This gives you the ability to do very powerful things like:
|
48
48
|
# end # Moving records around, renaming records, changing values in row based on
|
49
49
|
# end # some values! Checkout Mongify::Database::DataRow to learn more
|
50
|
-
#
|
51
|
-
#
|
50
|
+
#
|
51
|
+
#
|
52
52
|
# table "preferences", :embed_in => "users" do # As of version 0.2, embedded tables with a before_save will take an
|
53
53
|
# before_save do |pref_row, user_row| # extra argument which is the parent row of the embedded table.
|
54
54
|
# user_row.email_me = pref_row.delete('email_me') # This gives you the ability to move things from an embedded table row
|
55
55
|
# end # to the parent row.
|
56
56
|
# end
|
57
|
-
#
|
57
|
+
#
|
58
58
|
|
59
59
|
class Table
|
60
|
-
|
60
|
+
|
61
61
|
attr_accessor :name, :sql_name
|
62
62
|
attr_reader :options, :columns
|
63
|
-
|
63
|
+
|
64
64
|
def initialize(sql_name, options={}, &block)
|
65
65
|
@columns = []
|
66
66
|
@column_lookup = {}
|
67
67
|
@options = options.stringify_keys
|
68
68
|
self.sql_name = sql_name
|
69
|
-
|
69
|
+
|
70
70
|
self.instance_exec(&block) if block_given?
|
71
|
-
|
71
|
+
|
72
72
|
import_columns
|
73
|
-
|
73
|
+
|
74
74
|
self
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
# Returns the no_sql collection name
|
78
78
|
def name
|
79
79
|
@name ||= @options['rename_to']
|
80
80
|
@name ||= self.sql_name
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
# Returns true if table is ignored
|
84
84
|
def ignored?
|
85
85
|
@options['ignore']
|
86
86
|
end
|
87
|
-
|
87
|
+
|
88
88
|
# Returns true if table is marked as polymorphic
|
89
89
|
def polymorphic?
|
90
90
|
!!@options['polymorphic']
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
# Returns the name of the polymorphic association
|
94
94
|
def polymorphic_as
|
95
95
|
@options['polymorphic'].to_s
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
# Add a Database Column to the table
|
99
99
|
# This expects to get a {Mongify::Database::Column} or it will raise {Mongify::DatabaseColumnExpected} otherwise
|
100
100
|
def add_column(column)
|
101
101
|
raise Mongify::DatabaseColumnExpected, "Expected a Mongify::Database::Column" unless column.is_a?(Mongify::Database::Column)
|
102
102
|
add_and_index_column(column)
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
# Lets you build a column in the table
|
106
106
|
def column(name, type=nil, options={})
|
107
107
|
options, type = type, nil if type.is_a?(Hash)
|
108
108
|
type = type.to_sym if type
|
109
109
|
add_and_index_column(Mongify::Database::Column.new(name, type, options))
|
110
110
|
end
|
111
|
-
|
111
|
+
|
112
112
|
# Returns the column if found by the sql_name
|
113
113
|
def find_column(name)
|
114
114
|
return nil unless (index = @column_lookup[name.to_s.downcase.to_sym])
|
115
115
|
@columns[index]
|
116
116
|
end
|
117
|
-
|
117
|
+
|
118
118
|
# Returns a array of Columns which reference other columns
|
119
119
|
def reference_columns
|
120
|
-
@columns.reject{ |c| !c.referenced? }
|
120
|
+
@columns.reject{ |c| !c.referenced? }
|
121
|
+
end
|
122
|
+
|
123
|
+
# Returns the column of type :key
|
124
|
+
def key_column
|
125
|
+
@columns.find{ |c| c.type == :key }
|
121
126
|
end
|
122
|
-
|
127
|
+
|
123
128
|
# Returns a translated row
|
124
129
|
# Takes in a hash of values
|
125
130
|
def translate(row, parent=nil)
|
@@ -130,13 +135,13 @@ module Mongify
|
|
130
135
|
end
|
131
136
|
run_before_save(new_row, parent)
|
132
137
|
end
|
133
|
-
|
134
|
-
|
138
|
+
|
139
|
+
|
135
140
|
# Returns the name of the embed_in collection
|
136
141
|
def embed_in
|
137
142
|
@options['embed_in'].to_s unless @options['embed_in'].nil?
|
138
143
|
end
|
139
|
-
|
144
|
+
|
140
145
|
# Returns the type of embed it will be [object or array]
|
141
146
|
def embed_as
|
142
147
|
return nil unless embedded?
|
@@ -148,58 +153,69 @@ module Mongify
|
|
148
153
|
def embedded_as_object?
|
149
154
|
embed_as == 'object'
|
150
155
|
end
|
151
|
-
|
156
|
+
|
152
157
|
# Returns true if this is an embedded table
|
153
158
|
def embedded?
|
154
159
|
embed_in.present?
|
155
160
|
end
|
156
|
-
|
161
|
+
|
157
162
|
# Returns the name of the target column to embed on
|
158
163
|
def embed_on
|
159
164
|
return nil unless embedded?
|
160
165
|
(@options['on'] || "#{@options['embed_in'].to_s.singularize}_id").to_s
|
161
166
|
end
|
162
|
-
|
167
|
+
|
163
168
|
# Used to save a block to be ran after the row has been processed but before it's saved to the no sql database
|
164
169
|
def before_save(&block)
|
165
170
|
@before_save_callback = block
|
166
171
|
end
|
167
|
-
|
172
|
+
|
168
173
|
#Used to remove any before save filter
|
169
174
|
def remove_before_save_filter!
|
170
175
|
@before_save_callback = nil
|
171
176
|
end
|
172
|
-
|
177
|
+
|
173
178
|
#######
|
174
179
|
private
|
175
180
|
#######
|
176
|
-
|
181
|
+
|
177
182
|
# Runs the before save
|
178
183
|
# Returns: a new modified row
|
179
184
|
def run_before_save(row, parent=nil)
|
180
185
|
parentrow = Mongify::Database::DataRow.new(parent) unless parent.nil?
|
181
186
|
datarow = Mongify::Database::DataRow.new(row)
|
187
|
+
|
188
|
+
# don't allow deletion of pre_mongified_id, sync needs it!
|
189
|
+
pre_mongified_id = row['pre_mongified_id']
|
182
190
|
@before_save_callback.call(datarow, parentrow) unless @before_save_callback.nil?
|
183
|
-
|
184
|
-
|
191
|
+
new_row = datarow.to_hash
|
192
|
+
new_row['pre_mongified_id'] = pre_mongified_id if pre_mongified_id
|
193
|
+
|
194
|
+
if parentrow
|
195
|
+
parentrow_hash = parentrow.to_hash
|
196
|
+
unsets = parent.keys.inject({}) do |unset_keys, key|
|
197
|
+
unset_keys[key] = '1' unless parentrow_hash.has_key?(key)
|
198
|
+
unset_keys
|
199
|
+
end
|
200
|
+
[new_row, parentrow_hash, unsets]
|
185
201
|
else
|
186
|
-
|
202
|
+
new_row
|
187
203
|
end
|
188
204
|
end
|
189
|
-
|
205
|
+
|
190
206
|
# Indexes the column on the sql_name and adds column to the array
|
191
207
|
def add_and_index_column(column)
|
192
208
|
@column_lookup[column.sql_name.downcase.to_sym] = @columns.size
|
193
209
|
@columns << column
|
194
210
|
column
|
195
211
|
end
|
196
|
-
|
212
|
+
|
197
213
|
# Imports colunms that are sent in via the options['columns']
|
198
214
|
def import_columns
|
199
215
|
return unless import_columns = @options.delete('columns')
|
200
216
|
import_columns.each { |c| add_column(c) }
|
201
217
|
end
|
202
|
-
|
218
|
+
|
203
219
|
end
|
204
220
|
end
|
205
221
|
end
|
data/lib/mongify/exceptions.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
module Mongify
|
2
2
|
# Base Mongify Error
|
3
3
|
class MongifyError < RuntimeError; end
|
4
|
-
|
4
|
+
|
5
5
|
# Not Implemented Error from Mongify
|
6
6
|
class NotImplementedMongifyError < MongifyError; end
|
7
|
-
|
7
|
+
|
8
8
|
# File Not Found Exception
|
9
9
|
class FileNotFound < MongifyError; end
|
10
10
|
# Raise when configuration file is missing
|
11
11
|
class ConfigurationFileNotFound < FileNotFound; end
|
12
12
|
# Raised when Translation file is missing
|
13
13
|
class TranslationFileNotFound < FileNotFound; end
|
14
|
-
|
14
|
+
|
15
15
|
# Basic Configuration Error Exception
|
16
16
|
class ConfigurationError < MongifyError; end
|
17
17
|
# Raise when a sqlConnection is required but not given
|
@@ -22,13 +22,13 @@ module Mongify
|
|
22
22
|
class NoSqlConnectionRequired < ConfigurationError; end
|
23
23
|
# Raised when a NoSqlConfiguration is invalid?
|
24
24
|
class NoSqlConnectionInvalid < ConfigurationError; end
|
25
|
-
|
25
|
+
|
26
26
|
# Raised when a Mongify::Database::Column is expected but not given
|
27
27
|
class DatabaseColumnExpected < ConfigurationError; end
|
28
28
|
|
29
29
|
# Raised when application has no root folder set
|
30
30
|
class RootMissing < MongifyError; end
|
31
|
-
|
31
|
+
|
32
32
|
# Raised when an invalid option is passed via CLI
|
33
33
|
class InvalidOption < MongifyError; end
|
34
34
|
end
|
data/lib/mongify/progressbar.rb
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
# You can redistribute it and/or modify it under the terms
|
9
9
|
# of Ruby's license.
|
10
10
|
#
|
11
|
-
# This has been modified by
|
11
|
+
# This has been modified by
|
12
12
|
# Andrew Kalek
|
13
13
|
# Anlek Consulting
|
14
14
|
# http://anlek.com
|
@@ -48,8 +48,8 @@ module Mongify
|
|
48
48
|
# Formatting for the actual bar
|
49
49
|
def fmt_bar
|
50
50
|
bar_width = do_percentage * @terminal_width / 100
|
51
|
-
sprintf("|%s%s|",
|
52
|
-
@bar_mark * bar_width,
|
51
|
+
sprintf("|%s%s|",
|
52
|
+
@bar_mark * bar_width,
|
53
53
|
" " * (@terminal_width - bar_width))
|
54
54
|
end
|
55
55
|
|
@@ -65,9 +65,9 @@ module Mongify
|
|
65
65
|
|
66
66
|
# Formatting for file transfer
|
67
67
|
def fmt_stat_for_file_transfer
|
68
|
-
if @finished_p then
|
68
|
+
if @finished_p then
|
69
69
|
sprintf("%s %s %s", bytes, transfer_rate, elapsed)
|
70
|
-
else
|
70
|
+
else
|
71
71
|
sprintf("%s %s %s", bytes, transfer_rate, eta)
|
72
72
|
end
|
73
73
|
end
|
@@ -76,7 +76,7 @@ module Mongify
|
|
76
76
|
def fmt_title
|
77
77
|
@title[0,(@title_width - 1)] + ":"
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
# Formatting for count (x/y)
|
81
81
|
def fmt_count
|
82
82
|
sprintf('%15s', "(#{@current}/#{@total})")
|
@@ -106,7 +106,7 @@ module Mongify
|
|
106
106
|
def bytes
|
107
107
|
convert_bytes(@current)
|
108
108
|
end
|
109
|
-
|
109
|
+
|
110
110
|
# Gets formatting for time
|
111
111
|
def format_time (t)
|
112
112
|
t = t.to_i
|
@@ -126,19 +126,19 @@ module Mongify
|
|
126
126
|
sprintf("ETA: %s", format_time(eta))
|
127
127
|
end
|
128
128
|
end
|
129
|
-
|
129
|
+
|
130
130
|
# Returns elapsed time
|
131
131
|
def elapsed
|
132
132
|
elapsed = Time.now - @start_time
|
133
133
|
sprintf("Time: %s", format_time(elapsed))
|
134
134
|
end
|
135
|
-
|
135
|
+
|
136
136
|
# Returns end of line
|
137
137
|
# @return [String] "\n" or "\r"
|
138
138
|
def eol
|
139
139
|
if @finished_p then "\n" else "\r" end
|
140
140
|
end
|
141
|
-
|
141
|
+
|
142
142
|
# Calculates percentage
|
143
143
|
# @return [Number] the percentage
|
144
144
|
def do_percentage
|
@@ -148,7 +148,7 @@ module Mongify
|
|
148
148
|
@current * 100 / @total
|
149
149
|
end
|
150
150
|
end
|
151
|
-
|
151
|
+
|
152
152
|
# Gets the width of the terminal window
|
153
153
|
def get_width
|
154
154
|
UI.terminal_helper.output_cols
|
@@ -157,14 +157,14 @@ module Mongify
|
|
157
157
|
# Draws the bar
|
158
158
|
def show
|
159
159
|
return unless @out
|
160
|
-
arguments = @format_arguments.map {|method|
|
160
|
+
arguments = @format_arguments.map {|method|
|
161
161
|
method = sprintf("fmt_%s", method)
|
162
162
|
send(method)
|
163
163
|
}
|
164
164
|
line = sprintf(@format, *arguments)
|
165
165
|
|
166
166
|
width = get_width
|
167
|
-
if line.length == width - 1
|
167
|
+
if line.length == width - 1
|
168
168
|
@out.print(line + eol)
|
169
169
|
@out.flush
|
170
170
|
elsif line.length >= width
|
@@ -188,7 +188,7 @@ module Mongify
|
|
188
188
|
end
|
189
189
|
|
190
190
|
# Use "!=" instead of ">" to support negative changes
|
191
|
-
if cur_percentage != prev_percentage ||
|
191
|
+
if cur_percentage != prev_percentage ||
|
192
192
|
Time.now - @previous_time >= 1 || @finished_p
|
193
193
|
show
|
194
194
|
end
|
@@ -209,7 +209,7 @@ module Mongify
|
|
209
209
|
@finished_p = true
|
210
210
|
show
|
211
211
|
end
|
212
|
-
|
212
|
+
|
213
213
|
# Returns if the bar is finished
|
214
214
|
def finished?
|
215
215
|
@finished_p
|