themigrator 0.1.12 → 0.1.14
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Rakefile +5 -5
- data/bin/console +3 -3
- data/bin/testui +20 -0
- data/exe/themigrator +1 -6
- data/how_to_run_it +1 -0
- data/lib/themigrator/cli.rb +11 -16
- data/lib/themigrator/logger.rb +8 -10
- data/lib/themigrator/migration.rb +13 -19
- data/lib/themigrator/migration_progress.rb +69 -59
- data/lib/themigrator/migrator.rb +24 -29
- data/lib/themigrator/progress_window.rb +20 -0
- data/lib/themigrator/script.rb +29 -32
- data/lib/themigrator/script_pool.rb +18 -22
- data/lib/themigrator/ui/getchar.rb +40 -0
- data/lib/themigrator/ui/log_area.rb +173 -0
- data/lib/themigrator/ui/progress_window.rb +52 -0
- data/lib/themigrator/ui/title_bar.rb +31 -0
- data/lib/themigrator/ui.rb +128 -118
- data/lib/themigrator/version.rb +1 -1
- data/lib/themigrator.rb +8 -10
- data/themigrator.gemspec +15 -14
- metadata +23 -2
data/lib/themigrator/ui.rb
CHANGED
@@ -1,56 +1,156 @@
|
|
1
1
|
require 'curses'
|
2
2
|
|
3
|
+
require 'themigrator/ui/log_area'
|
4
|
+
require 'themigrator/ui/title_bar'
|
5
|
+
require 'themigrator/ui/progress_window'
|
6
|
+
require 'themigrator/ui/getchar'
|
7
|
+
require 'thread'
|
8
|
+
|
9
|
+
Thread.abort_on_exception = true
|
10
|
+
|
11
|
+
UILOG = Logger.new('ui.log')
|
12
|
+
UILOG.formatter = proc { |_severity, _datetime, _progname, msg|
|
13
|
+
msg + "\n"
|
14
|
+
}
|
15
|
+
UILOGMUTEX = Mutex.new
|
16
|
+
def ui_log(*args)
|
17
|
+
UILOGMUTEX.synchronize do
|
18
|
+
UILOG << args.join("\n\r") + "\n"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def ui_log_exception(e)
|
23
|
+
ui_log ''
|
24
|
+
ui_log e.inspect
|
25
|
+
ui_log e.backtrace
|
26
|
+
end
|
27
|
+
|
3
28
|
module Themigrator
|
4
29
|
class UI
|
5
30
|
include Curses
|
6
31
|
include Logger
|
32
|
+
include LogArea
|
33
|
+
include TitleBar
|
34
|
+
include ProgressWindow
|
35
|
+
include Getchar
|
7
36
|
|
8
37
|
def initialize(progress_monitor)
|
9
38
|
@pm = progress_monitor
|
10
39
|
@roles = []
|
40
|
+
@current_action = ''
|
11
41
|
end
|
12
42
|
|
13
43
|
def start
|
14
44
|
init_progress_monitor
|
15
45
|
init_screen
|
16
|
-
Thread.new {@pm.start}
|
17
|
-
Thread.new {render_loop}
|
18
|
-
input_loop
|
46
|
+
Thread.new { @pm.start }
|
47
|
+
Thread.new { render_loop }
|
48
|
+
input_loop
|
19
49
|
end
|
20
50
|
|
21
51
|
private
|
22
52
|
|
23
53
|
def render_loop
|
24
54
|
loop do
|
25
|
-
|
26
|
-
|
55
|
+
sleep ENV['SLEEP'] ? ENV['SLEEP'].to_f : 0.2
|
56
|
+
render
|
27
57
|
end
|
28
58
|
end
|
29
59
|
|
30
60
|
def input_loop
|
61
|
+
scripts = Themigrator::Migration::SCRIPTS
|
62
|
+
keys = []
|
31
63
|
loop do
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
64
|
+
case e = getchar
|
65
|
+
when :left
|
66
|
+
previous_action
|
67
|
+
when :right
|
68
|
+
next_action
|
69
|
+
when :c_c, 'q'
|
70
|
+
exit 0
|
71
|
+
when :npage
|
72
|
+
la_npage
|
73
|
+
say 'next_page'
|
74
|
+
when :ppage
|
75
|
+
la_ppage
|
76
|
+
say 'previous_page'
|
77
|
+
else
|
78
|
+
keys.unshift(e)
|
79
|
+
say keys.map(&:inspect).join(' ')
|
80
|
+
end
|
38
81
|
end
|
39
82
|
end
|
40
83
|
|
84
|
+
def next_action
|
85
|
+
scripts = Themigrator::Migration::SCRIPTS
|
86
|
+
current_index = scripts.index(@current_action)
|
87
|
+
if current_index.nil?
|
88
|
+
switch_action(scripts.first)
|
89
|
+
return
|
90
|
+
end
|
91
|
+
return if current_index >= scripts.size - 1
|
92
|
+
current_index += 1
|
93
|
+
next_action_name = scripts[current_index]
|
94
|
+
switch_action(next_action_name)
|
95
|
+
end
|
96
|
+
|
97
|
+
def previous_action
|
98
|
+
scripts = Themigrator::Migration::SCRIPTS
|
99
|
+
current_index = scripts.index(@current_action)
|
100
|
+
if current_index.nil?
|
101
|
+
switch_action(scripts.first)
|
102
|
+
return
|
103
|
+
end
|
104
|
+
return if current_index.zero?
|
105
|
+
current_index -= 1
|
106
|
+
next_action_name = scripts[current_index]
|
107
|
+
switch_action(next_action_name)
|
108
|
+
end
|
41
109
|
|
42
110
|
def init_progress_monitor
|
43
111
|
@pm.cbks = {
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
112
|
+
start_action: method(:start_action),
|
113
|
+
start_role_action: method(:start_role_action),
|
114
|
+
end_action: method(:end_action),
|
115
|
+
has_roles: method(:has_roles),
|
116
|
+
# new_line: proc { sleep 0.3234242 }
|
48
117
|
}
|
49
118
|
end
|
50
119
|
|
120
|
+
def has_roles(roles)
|
121
|
+
@roles = roles.sort
|
122
|
+
initialize_log_area(@roles)
|
123
|
+
end
|
124
|
+
|
125
|
+
def start_role_action(role, action)
|
126
|
+
Thread.new do
|
127
|
+
log_file = @pm.log_file(role, action)
|
128
|
+
|
129
|
+
begin
|
130
|
+
File.open(log_file, 'r') do |f|
|
131
|
+
loop do
|
132
|
+
la_append(action, role, f.read)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
rescue => e
|
136
|
+
ui_log_exception(e)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
51
140
|
|
52
141
|
def start_action(action)
|
142
|
+
switch_action(action.to_s)
|
143
|
+
end
|
144
|
+
|
145
|
+
def switch_action(action)
|
146
|
+
action = action.to_s
|
147
|
+
return if @current_action == action
|
148
|
+
UILOG.debug("switch action from #{@current_index} to #{action}")
|
149
|
+
la_switch_action(action)
|
150
|
+
pg_set_action(action)
|
53
151
|
@current_action = action
|
152
|
+
rescue => e
|
153
|
+
ui_log_exception(e)
|
54
154
|
end
|
55
155
|
|
56
156
|
def end_action
|
@@ -58,121 +158,31 @@ module Themigrator
|
|
58
158
|
|
59
159
|
def init_screen
|
60
160
|
super
|
61
|
-
crmode
|
161
|
+
# crmode
|
162
|
+
# cbreak
|
163
|
+
raw
|
164
|
+
stdscr.timeout = 100
|
165
|
+
noecho
|
62
166
|
curs_set(0)
|
63
|
-
ObjectSpace.define_finalizer(self, proc
|
64
|
-
|
65
|
-
|
167
|
+
ObjectSpace.define_finalizer(self, proc do
|
168
|
+
# close_screen
|
169
|
+
end)
|
66
170
|
end
|
67
171
|
|
68
|
-
|
69
|
-
|
70
172
|
def render
|
71
173
|
@cols = cols
|
72
174
|
@lines = lines
|
73
|
-
|
175
|
+
la_render if la_initialize?
|
74
176
|
render_title
|
75
|
-
render_columns
|
76
177
|
render_progress
|
178
|
+
rescue => e
|
179
|
+
ui_log_exception(e)
|
77
180
|
end
|
78
181
|
|
79
182
|
private
|
80
|
-
def render_title
|
81
|
-
|
82
|
-
title_window.setpos(0,0)
|
83
|
-
title_window.addstr("The migrator")
|
84
|
-
title_window.refresh
|
85
|
-
now_str = Time.now.strftime("%d %b - %H:%M.%S")
|
86
|
-
time_window.setpos(0,0)
|
87
|
-
time_window.addstr(now_str)
|
88
|
-
time_window.refresh
|
89
|
-
end
|
90
183
|
|
91
|
-
def
|
92
|
-
|
93
|
-
w.attrset(A_BOLD)
|
94
|
-
end
|
184
|
+
def fuck(*args)
|
185
|
+
File.open('fucking-log.log', 'a') { |f| f.write(args.join(' ') + "\n") }
|
95
186
|
end
|
96
|
-
|
97
|
-
def time_window
|
98
|
-
width = 18
|
99
|
-
@time_window ||= Window.new(1, 18, 0, @cols - 18 ).tap do |w|
|
100
|
-
w.attrset(A_DIM)
|
101
|
-
end
|
102
|
-
|
103
|
-
end
|
104
|
-
|
105
|
-
def progress_window
|
106
|
-
@progress_widnow ||= Window.new(@lines - 1 , @cols - 1, @lines - 1, 0 ).tap do |w|
|
107
|
-
w.attrset(A_DIM)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def render_columns
|
112
|
-
n_columns.times do |n|
|
113
|
-
w = column_window(n + 1)
|
114
|
-
w.addstr("Window #{n}")
|
115
|
-
w.refresh
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
|
120
|
-
def render_progress
|
121
|
-
progress_window.setpos(0,0)
|
122
|
-
progress_window.addstr(@pm.roles.inspect)
|
123
|
-
progress_window.addstr(@pm.current_action.inspect)
|
124
|
-
progress_window.addstr(@action)
|
125
|
-
progress_window.refresh
|
126
|
-
end
|
127
|
-
|
128
|
-
|
129
|
-
def column_window(n)
|
130
|
-
@columns ||= []
|
131
|
-
if @columns[n].nil?
|
132
|
-
column_height = @lines - 4
|
133
|
-
column_width = @cols / n_columns
|
134
|
-
top = 2
|
135
|
-
left = column_width * (n - 1)
|
136
|
-
w = Window.new(column_height, column_width - 1, top, left)
|
137
|
-
w.box("|", "-")
|
138
|
-
@columns[n] = w
|
139
|
-
end
|
140
|
-
@columns[n]
|
141
|
-
end
|
142
|
-
|
143
|
-
def n_columns
|
144
|
-
@previous_columns ||=0
|
145
|
-
if @previous_columns != @roles.size
|
146
|
-
@columns = []
|
147
|
-
end
|
148
|
-
@roles.size
|
149
|
-
end
|
150
|
-
|
151
|
-
|
152
|
-
def something
|
153
|
-
show_message "hello"
|
154
|
-
# show_message("Hit any key")
|
155
|
-
setpos((lines - 5) / 2, (cols - 10) / 2)
|
156
|
-
addstr("Hit any key")
|
157
|
-
refresh
|
158
|
-
getch
|
159
|
-
show_message("Hello, World!")
|
160
|
-
refresh
|
161
|
-
end
|
162
|
-
|
163
|
-
|
164
|
-
def show_message(message)
|
165
|
-
width = message.length + 6
|
166
|
-
win = Window.new(5, width,
|
167
|
-
(lines - 5) / 2, (cols - width) / 2)
|
168
|
-
win.box(?|, ?-)
|
169
|
-
win.setpos(2, 3)
|
170
|
-
win.addstr(message)
|
171
|
-
win.refresh
|
172
|
-
win.getch
|
173
|
-
win.close
|
174
|
-
end
|
175
|
-
|
176
|
-
|
177
187
|
end
|
178
188
|
end
|
data/lib/themigrator/version.rb
CHANGED
data/lib/themigrator.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
1
|
+
require 'themigrator/version'
|
2
|
+
require 'themigrator/logger'
|
3
|
+
require 'themigrator/migration'
|
4
|
+
require 'themigrator/migrator'
|
5
|
+
require 'themigrator/script_pool'
|
6
|
+
require 'themigrator/script'
|
7
|
+
require 'themigrator/migration_progress'
|
8
|
+
require 'themigrator/ui'
|
9
9
|
|
10
10
|
module Themigrator
|
11
|
-
|
12
|
-
|
13
11
|
end
|
data/themigrator.gemspec
CHANGED
@@ -4,25 +4,26 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'themigrator/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'themigrator'
|
8
8
|
spec.version = Themigrator::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Guillermo Álvarez']
|
10
|
+
spec.email = ['guillermo@cientifico.net']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
12
|
+
spec.summary = 'tool to ease migration a data migration process.'
|
13
|
+
spec.description = 'The migrator is a program that eases and automates data migrations.'
|
14
|
+
spec.homepage = 'https://github.com/wooga/themigrator'
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
-
spec.bindir =
|
17
|
+
spec.bindir = 'exe'
|
18
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
-
spec.require_paths = [
|
19
|
+
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.12'
|
22
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
23
|
+
spec.add_development_dependency 'minitest', '~> 5.0'
|
24
|
+
spec.add_development_dependency 'byebug'
|
25
|
+
spec.add_development_dependency 'rubocop'
|
25
26
|
|
26
|
-
spec.add_dependency
|
27
|
-
spec.add_dependency
|
27
|
+
spec.add_dependency 'thor', '~> 0.19'
|
28
|
+
spec.add_dependency 'curses', '~> 1.0'
|
28
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: themigrator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guillermo Álvarez
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: thor
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -110,7 +124,9 @@ files:
|
|
110
124
|
- Rakefile
|
111
125
|
- bin/console
|
112
126
|
- bin/setup
|
127
|
+
- bin/testui
|
113
128
|
- exe/themigrator
|
129
|
+
- how_to_run_it
|
114
130
|
- lib/themigrator.rb
|
115
131
|
- lib/themigrator/cli.rb
|
116
132
|
- lib/themigrator/helper.rb
|
@@ -118,9 +134,14 @@ files:
|
|
118
134
|
- lib/themigrator/migration.rb
|
119
135
|
- lib/themigrator/migration_progress.rb
|
120
136
|
- lib/themigrator/migrator.rb
|
137
|
+
- lib/themigrator/progress_window.rb
|
121
138
|
- lib/themigrator/script.rb
|
122
139
|
- lib/themigrator/script_pool.rb
|
123
140
|
- lib/themigrator/ui.rb
|
141
|
+
- lib/themigrator/ui/getchar.rb
|
142
|
+
- lib/themigrator/ui/log_area.rb
|
143
|
+
- lib/themigrator/ui/progress_window.rb
|
144
|
+
- lib/themigrator/ui/title_bar.rb
|
124
145
|
- lib/themigrator/version.rb
|
125
146
|
- test.sh
|
126
147
|
- themigrator.gemspec
|