central 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/central +4 -4
  3. data/lib/central.rb +187 -213
  4. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 59a223e19b875e1e3d7dc50f70f60697816d47e3
4
- data.tar.gz: 8037442fffcaaccbe55bf1209dae265890432836
3
+ metadata.gz: 2c48d4b6cb13b63e3ba6896942008ae004fad3af
4
+ data.tar.gz: 37dc1ea33c1ed5e8521972c46c3d09df02c3aed6
5
5
  SHA512:
6
- metadata.gz: 1ef58f6d6da2bf0f3148677cc86d5cf5779c4d2fa766102c1dfd5cd4ac5aad643d7e55ed78a575b83a6e2d38735bfefdc0bb8a6eebe5935dde1ec4326bf03fa6
7
- data.tar.gz: 025ab8f80c6e4cc29038ff1cacb276206527da789865732539d64887b23b590007c9debe723ab7224ed02de28ac705be2a331cdeaf04ae568ed7a1ade5392858
6
+ metadata.gz: 69a3728b2832dc452ed34d8b88141efe9ea17287fe2555ac5b985e6c89b34122fa0a4037b49701563639fad3442d4894d9a3be671ae449bbded21b78d636dbc9
7
+ data.tar.gz: 3773b38f6bc059f9cddfa576017fd67b1628ed7dbf90702618988b2537f59e31e691e57d0c9134689737e17eb918520cc00728f567ceb9da655ba3ab43714deb
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- # encoding: utf-8
2
+ # frozen_string_literal: true
3
3
 
4
4
  # -------------------------------------------------------------------------
5
5
  # # central - dot files manager licensed under LGPLv3 (see LICENSE file) |
@@ -8,13 +8,13 @@
8
8
 
9
9
  require 'central'
10
10
 
11
- if ARGV.length > 0
11
+ unless ARGV.empty?
12
12
  if ARGV[0] == '-v' || ARGV[0] == '--version' || ARGV[0] == '-version'
13
- puts "central v0.2.4"
13
+ puts 'central v0.2.5'
14
14
  exit 0
15
15
  end
16
16
  if ARGV[0] == '-h' || ARGV[0] == '--help' || ARGV[0] == '-help'
17
- puts "central [path/to/configuration.rb]"
17
+ puts 'central [path/to/configuration.rb]'
18
18
  exit 0
19
19
  end
20
20
  end
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  # -------------------------------------------------------------------------
3
2
  # # central - dot files manager licensed under LGPLv3 (see LICENSE file) |
4
3
  # # written in Ruby by Dmitry Geurkov (d.geurkov@gmail.com) |
@@ -9,6 +8,33 @@ require 'socket'
9
8
  require 'open3'
10
9
  require 'fileutils'
11
10
 
11
+ # cli colors
12
+ COLOR_RED = 31
13
+ COLOR_GREEN = 32
14
+
15
+ # putsc, puts with color
16
+ def color(message, color)
17
+ "\e[#{color}m#{message}\e[0m"
18
+ end
19
+
20
+ # info
21
+ def info(message, param = nil)
22
+ puts color(message, COLOR_GREEN) +
23
+ (param.nil? ? '' : ': ' + param)
24
+ end
25
+
26
+ # error
27
+ def error(message, param = nil)
28
+ puts color(message, COLOR_RED) +
29
+ (param.nil? ? '' : ': ' + param)
30
+ end
31
+
32
+ # fail, print message to stderr and exit with 1
33
+ def fail(message, param = nil)
34
+ error message, param
35
+ exit 1
36
+ end
37
+
12
38
  # get hostname
13
39
  def hostname
14
40
  Socket.gethostname
@@ -17,114 +43,106 @@ end
17
43
  # get operating system
18
44
  def os
19
45
  if RUBY_PLATFORM.include?('linux')
20
- return 'linux'
46
+ 'linux'
21
47
  elsif RUBY_PLATFORM.include?('darwin')
22
- return 'osx'
48
+ 'osx'
23
49
  elsif RUBY_PLATFORM.include?('freebsd')
24
- return 'freebsd'
50
+ 'freebsd'
25
51
  elsif RUBY_PLATFORM.include?('solaris')
26
- return 'solaris'
52
+ 'solaris'
27
53
  end
28
54
  end
29
55
 
30
56
  def linux?
31
- return os == 'linux'
57
+ os == 'linux'
32
58
  end
33
59
 
34
60
  def osx?
35
- return os == 'osx'
61
+ os == 'osx'
36
62
  end
37
63
 
38
64
  def freebsd?
39
- return os == 'freebsd'
65
+ os == 'freebsd'
40
66
  end
41
67
 
42
68
  def solaris?
43
- return os == 'solaris'
69
+ os == 'solaris'
44
70
  end
45
71
 
46
- # run shell command and get output, optionaly can print command running if verbose and if not silent will also print to stdout and stderr
47
- $shell_return_value = nil
48
- def shell(command,verbose: false, silent: true)
49
- puts "Executing: #{command}" if verbose
72
+ # run shell command and get output, optionaly can print command running
73
+ # if verbose and if not silent will also print to stdout and stderr
74
+ def shell(command, verbose: false, silent: true)
75
+ info 'Executing', command if verbose
76
+ exit_code = nil
50
77
  stdout = ''
51
78
  stdout_line = ''
52
79
  stderr = ''
53
80
  stderr_line = ''
54
- Open3.popen3(command) do |i,o,e,t|
81
+ Open3.popen3(command) do |_, o, e, t|
55
82
  stdout_open = true
56
83
  stderr_open = true
57
- while stdout_open or stderr_open
84
+ while stdout_open || stderr_open
58
85
  if stdout_open
59
86
  begin
60
87
  ch = o.read_nonblock(1)
61
- stdout.insert(-1,ch)
88
+ stdout.insert(-1, ch)
62
89
  unless silent
63
- stdout_line.insert(-1,ch)
90
+ stdout_line.insert(-1, ch)
64
91
  if ch == "\n"
65
92
  STDOUT.puts stdout_line
66
93
  stdout_line = ''
67
94
  end
68
95
  end
69
96
  rescue IO::WaitReadable
70
- IO.select([o],nil,nil,0.1) unless stderr_open
97
+ IO.select([o], nil, nil, 0.01) unless stderr_open
71
98
  rescue EOFError
72
99
  stdout_open = false
73
100
  end
74
101
  end
75
- if stderr_open
76
- begin
77
- ch = e.read_nonblock(1)
78
- stderr.insert(-1,ch)
79
- unless silent
80
- stderr_line.insert(-1,ch)
81
- if ch == "\n"
82
- STDERR.puts stderr_line
83
- stderr_line = ''
84
- end
102
+ next unless stderr_open
103
+
104
+ begin
105
+ ch = e.read_nonblock(1)
106
+ stderr.insert(-1, ch)
107
+ unless silent
108
+ stderr_line.insert(-1, ch)
109
+ if ch == "\n"
110
+ STDERR.puts stderr_line
111
+ stderr_line = ''
85
112
  end
86
- rescue IO::WaitReadable
87
- IO.select([e],nil,nil,0.1) unless stdout_open
88
- rescue EOFError
89
- stderr_open = false
90
113
  end
114
+ rescue IO::WaitReadable
115
+ IO.select([e], nil, nil, 0.01) unless stdout_open
116
+ rescue EOFError
117
+ stderr_open = false
91
118
  end
92
119
  end
93
- $shell_return_value = t.value
94
- end
95
- if stderr == ''
96
- return stdout
97
- else
98
- return stdout, stderr
120
+ exit_code = t.value
99
121
  end
122
+ [exit_code, stdout, stderr]
100
123
  end
101
124
 
102
125
  # run shell command with sudo prefix, acts same as shell
103
- def sudo(command,verbose:,silent:)
104
- return shell('sudo '+command, verbose: verbose, silent: silent)
126
+ def sudo(command, verbose:, silent:)
127
+ shell('sudo ' + command, verbose: verbose, silent: silent)
105
128
  end
106
129
 
107
130
  # function used to check that system has all required tools installed
108
- def check_tool(name,check)
109
- begin
110
- output = shell(check+' 2>&1').downcase
111
- if output == '' or output.include?('command not found')
112
- STDERR.puts "#{name} not found, please install it to use central"
113
- exit 1
114
- end
115
- rescue Errno::ENOENT
116
- STDERR.puts "#{name} not found, please install it to use central"
117
- exit 1
131
+ def check_tool(name, check)
132
+ _, output, = shell(check + ' 2>&1')
133
+ if output == '' || output.downcase.include?('command not found')
134
+ fail "#{name} not found, please install it to use central"
118
135
  end
136
+ rescue Errno::ENOENT
137
+ fail "#{name} not found, please install it to use central"
119
138
  end
120
139
 
121
- check_tool('file','file --version')
122
- check_tool('grep','grep --version')
123
- check_tool('ln','ln --version')
124
- check_tool('readlink','readlink --version')
125
- check_tool('git','git --version')
126
- check_tool('curl','curl --version')
127
-
140
+ check_tool('file', 'file --version')
141
+ check_tool('grep', 'grep --version')
142
+ check_tool('ln', 'ln --version')
143
+ check_tool('readlink', 'readlink --version')
144
+ check_tool('git', 'git --version')
145
+ check_tool('curl', 'curl --version')
128
146
 
129
147
  # current working directory
130
148
  def pwd
@@ -133,7 +151,7 @@ end
133
151
 
134
152
  # absolute path
135
153
  def abs(path)
136
- path = File.absolute_path(File.expand_path(path))
154
+ File.absolute_path(File.expand_path(path))
137
155
  end
138
156
 
139
157
  # change current working directory
@@ -165,80 +183,70 @@ end
165
183
 
166
184
  # get full path of symlink
167
185
  def symlink_path(symlink)
168
- shell("readlink \"#{abs(symlink)}\" 2>&1").strip
186
+ _, out, = shell("readlink -f \"#{abs(symlink)}\" 2>&1")
187
+ out.strip
169
188
  end
170
189
 
171
190
  # make directory including intermediate directories
172
191
  def mkdir(path)
173
192
  path = abs(path)
174
- unless dir_exists?(path)
175
- out = shell("mkdir -p \"#{path}\" 2>&1")
176
- unless $shell_return_value.success?
177
- STDERR.puts out
178
- STDERR.puts "Couldn't create directory: #{path}"
179
- exit 1
180
- end
181
- puts "Created directory: #{path}"
193
+ return if dir_exists?(path)
194
+
195
+ exit_code, out, = shell("mkdir -p \"#{path}\" 2>&1")
196
+ unless exit_code.success?
197
+ error out
198
+ fail "Couldn't create directory", path
182
199
  end
200
+ info 'Created directory', path
183
201
  end
184
202
 
185
203
  # remove file/directory
186
- def rm(path,recursive: false)
204
+ def rm(path, recursive: false)
187
205
  path = abs(path)
188
- if recursive
189
- recursive = '-R '
190
- else
191
- recursive = ''
192
- end
206
+ recursive = recursive ? '-R ' : ''
193
207
  is_dir = dir_exists?(path)
194
208
  is_symlink = symlink?(path)
195
- out = shell("rm #{recursive}-f \"#{path}\" 2>&1")
196
- unless $shell_return_value.success?
197
- STDERR.puts out
198
- STDERR.puts "Couldn't remove path: #{path}"
199
- exit 1
209
+ exit_code, out, = shell("rm #{recursive}-f \"#{path}\" 2>&1")
210
+ unless exit_code.success?
211
+ error out
212
+ fail "Couldn't remove path", path
200
213
  end
201
214
  if is_dir
202
- puts "Removed directory: #{path}"
215
+ info 'Removed directory', path
203
216
  elsif is_symlink
204
- puts "Removed symlink: #{path}"
217
+ info 'Removed symlink', path
205
218
  else
206
- puts "Removed file: #{path}"
219
+ info 'Removed file', path
207
220
  end
208
221
  end
209
222
 
210
223
  # remove directory recursively
211
224
  def rmdir(path)
212
- rm(path,recursive: true)
225
+ rm(path, recursive: true)
213
226
  end
214
227
 
215
228
  # touch file
216
229
  def touch(path)
217
230
  path = abs(path)
218
- unless file_exists?(path)
219
- out = shell("touch \"#{path}\" 2>&1")
220
- unless $shell_return_value.success?
221
- STDERR.puts out
222
- STDERR.puts "Couldn't touch file: #{path}"
223
- exit 1
224
- end
225
- puts "Touched file: #{path}"
231
+ return if file_exists?(path)
232
+
233
+ exit_code, out, = shell("touch \"#{path}\" 2>&1")
234
+ unless exit_code.success?
235
+ error out
236
+ fail "Couldn't touch file", path
226
237
  end
238
+ info 'Touched file', path
227
239
  end
228
240
 
229
241
  # change file permissions
230
- def chmod(path,permissions,recursive: false)
242
+ def chmod(path, permissions, recursive: false)
231
243
  path = abs(path)
232
- if recursive
233
- recursive = '-R '
234
- else
235
- recursive = ''
236
- end
244
+ recursive = recursive ? '-R ' : ''
237
245
  shell("chmod #{recursive}#{permissions} \"#{path}\"")
238
246
  end
239
247
 
240
248
  # symlink path
241
- def symlink(from,to)
249
+ def symlink(from, to)
242
250
  from = abs(from)
243
251
  to = abs(to)
244
252
  if symlink?(from)
@@ -247,187 +255,156 @@ def symlink(from,to)
247
255
  symlink from, to
248
256
  end
249
257
  elsif file_exists?(from)
250
- STDERR.puts "File #{from} exists in place of symlink..."
251
- exit 1
258
+ fail "File #{from} exists in place of symlink..."
252
259
  elsif dir_exists?(from)
253
- STDERR.puts "Directory #{from} exists in place of symlink..."
254
- exit 1
260
+ fail "Directory #{from} exists in place of symlink..."
255
261
  else
256
- out = shell("ln -s \"#{to}\" \"#{from}\" 2>&1")
257
- unless $shell_return_value.success?
258
- STDERR.puts out
259
- STDERR.puts "Couldn't create symlink: #{from} → #{to}"
260
- exit 1
262
+ exit_code, out, = shell("ln -s \"#{to}\" \"#{from}\" 2>&1")
263
+ unless exit_code.success?
264
+ error out
265
+ fail "Couldn't create symlink", "#{from} → #{to}"
261
266
  end
262
- puts "Created symlink: #{from} → #{to}"
267
+ info 'Created symlink', "#{from} → #{to}"
263
268
  end
264
269
  end
265
270
 
266
271
  # git clone url into a path
267
- def git(url,path,branch: nil,silent: false,depth: nil)
272
+ def git(url, path, branch: nil, silent: true, depth: nil)
268
273
  path = abs(path)
269
274
  if dir_exists?(path) && dir_exists?("#{path}/.git")
270
- cwd = pwd()
275
+ cwd = pwd
271
276
  chdir path
272
277
  out = nil
273
278
  if branch
274
- out = shell('git fetch 2>&1',{:silent => silent})
275
- if out.size > 0
276
- puts out if silent
277
- end
278
- out = shell("git checkout #{branch} 2>&1",{:silent => silent})
279
+ _, out, = shell('git fetch 2>&1', silent: silent)
280
+ puts out if silent && out.size.positive?
281
+ _, out, = shell("git checkout #{branch} 2>&1", silent: silent)
279
282
  unless out.downcase.include? 'is now at'
280
283
  puts out if silent
281
284
  end
282
- out = shell("git pull origin #{branch} 2>&1",{:silent => silent})
285
+ _, out, = shell("git pull origin #{branch} 2>&1", silent: silent)
283
286
  else
284
- out = shell('git pull 2>&1',{:silent => silent})
287
+ _, out, = shell('git pull 2>&1', silent: silent)
285
288
  end
286
- unless out.downcase.include? "already up-to-date"
289
+ unless out.downcase.include? 'already up-to-date'
287
290
  puts out if silent
288
- puts "Git repository pulled: #{url} → #{path}"
291
+ info 'Git repository pulled', "#{url} → #{path}"
289
292
  end
290
293
  chdir cwd
291
294
  else
292
- if branch
293
- branch = "-b #{branch} "
294
- else
295
- branch = ''
296
- end
297
- if depth
298
- depth = '--depth '+depth.to_s+' '
299
- else
300
- depth = ''
301
- end
302
- out = shell("git clone #{depth}#{branch}#{url} \"#{path}\" 2>&1",{:silent => silent})
295
+ branch = branch ? "-b #{branch} " : ''
296
+ depth = depth ? "--depth #{depth} " : ''
297
+ _, out, = shell("git clone #{depth}#{branch}#{url} \"#{path}\" 2>&1",
298
+ silent: silent)
303
299
  puts out if silent
304
- puts "Git repository cloned: #{url} → #{path}"
300
+ info 'Git repository cloned', "#{url} → #{path}"
305
301
  end
306
302
  end
307
303
 
308
304
  # download url into a path using curl
309
- def curl(url,path, verbose: false)
305
+ def curl(url, path, verbose: false)
310
306
  path = abs(path)
311
- puts "Downloading #{url} → #{path}"
312
- output = shell("curl -s -S \"#{url}\"",verbose: verbose, silent: true)
313
- unless $shell_return_value.success?
314
- STDERR.puts output
315
- STDERR.puts "Couldn't download file from #{url}..."
316
- exit 1
307
+ info 'Downloading', "#{url} → #{path}"
308
+ exit_code, output, = shell("curl -s -S \"#{url}\"",
309
+ verbose: verbose, silent: true)
310
+ unless exit_code.success?
311
+ error output
312
+ fail "Couldn't download file from", url
317
313
  end
318
- File.write(path,output)
319
- puts "Downloaded #{url} → #{path}"
314
+ File.write(path, output)
315
+ info 'Downloaded', "#{url} → #{path}"
320
316
  end
321
317
 
322
318
  # read content of a file
323
319
  def read(file)
324
320
  file = abs(file)
325
- if file_exists?(file)
326
- return File.read(file)
327
- else
328
- STDERR.puts "Couldn't read file #{file}..."
329
- exit 1
330
- end
321
+ return File.read(file) if file_exists?(file)
322
+
323
+ fail "Couldn't read file", file
331
324
  end
332
325
 
333
326
  # write content into a file
334
- def write(file,content)
327
+ def write(file, content)
335
328
  file = abs(file)
336
- File.write(file,content)
329
+ File.write(file, content)
337
330
  end
338
331
 
339
332
  # source file in sh/bash/zsh script
340
- def source(file,source)
333
+ def source(file, source)
341
334
  file = abs(file)
342
335
  source = abs(source)
343
336
  source_line = "source \"#{source}\""
344
- out = shell("grep -Fx '#{source_line}' \"#{file}\"")
345
- if out == ""
346
- shell("echo '#{source_line}' >> \"#{file}\"")
347
- puts "Added source #{source} line to #{file}"
348
- end
337
+ _, out, = shell("grep -Fx '#{source_line}' \"#{file}\"")
338
+ return unless out == ''
339
+
340
+ shell("echo '#{source_line}' >> \"#{file}\"")
341
+ info 'Added source', "#{source} line to #{file}"
349
342
  end
350
343
 
351
344
  # list directory content
352
- def ls(path,dotfiles: false, grep: '', dir: true, file: true)
345
+ def ls(path, dotfiles: false, grep: '', dir: true, file: true)
353
346
  path = abs(path)
354
- if dotfiles
355
- dotfiles = '-a '
356
- else
357
- dotfiles = ''
358
- end
347
+ dotfiles = dotfiles ? '-a ' : ''
359
348
  command = "ls -1 #{dotfiles}\"#{path}\" 2>&1"
360
- if grep.length > 0
361
- command += " | grep #{grep}"
362
- end
363
- output = shell(command)
349
+ command += " | grep #{grep}" unless grep.empty?
350
+
351
+ _, output, = shell(command)
364
352
  if output.downcase.end_with?('no such file or directory')
365
- STDERR.puts "Couldn't ls directory #{path}..."
366
- exit 1
353
+ fail "Couldn't ls directory", path
367
354
  end
355
+
368
356
  ls = output.split("\n")
369
- unless dir
370
- ls = ls.keep_if {|f| !File.directory?("#{path}/#{f}") }
371
- end
372
- unless file
373
- ls = ls.keep_if {|f| !File.file?("#{path}/#{f}") }
374
- end
375
- return ls
357
+ ls = ls.keep_if { |f| !File.directory?("#{path}/#{f}") } unless dir
358
+ ls = ls.keep_if { |f| !File.file?("#{path}/#{f}") } unless file
359
+ ls
360
+ end
361
+
362
+ # copy_file
363
+ def copy_file(from, to)
364
+ fail "Couldn't access file", from unless file_exists?(from)
365
+
366
+ return if file_exists?(to) && FileUtils.compare_file(from, to)
367
+
368
+ FileUtils.copy_file(from, to)
369
+ info 'Copied file', "#{from} → #{to}"
376
370
  end
377
371
 
378
372
  # copy
379
- def copy(from,to)
373
+ def copy(from, to)
380
374
  from = abs(from)
381
375
  to = abs(to)
382
376
  if dir_exists?(from)
383
- (Dir.entries(from).select { |f| f != "." and f != ".." }).each do |f|
377
+ (Dir.entries(from).select { |f| f != '.' && f != '..' }).each do |f|
384
378
  FileUtils.mkdir_p(to)
385
- copy("#{from}/#{f}","#{to}/#{f}")
379
+ copy("#{from}/#{f}", "#{to}/#{f}")
386
380
  end
387
381
  else
388
- unless file_exists?(from)
389
- STDERR.puts "Couldn't access file #{from}..."
390
- exit 1
391
- end
392
- if !file_exists?(to) or !FileUtils.compare_file(from,to)
393
- FileUtils.copy_file(from,to)
394
- puts "Copied file: #{from} → #{to}"
395
- end
382
+ copy_file(from, to)
396
383
  end
397
384
  end
398
385
 
399
386
  # process erb template into an output_file
400
- def erb(file,output_file = nil)
387
+ def erb(file, output_file = nil)
401
388
  file = abs(file)
402
- if output_file == nil
403
- if file.end_with?('.erb')
404
- output_file = file[0...-4]
405
- else
406
- output_file = file+'.out'
407
- end
408
- end
409
- if file_exists?(file)
410
- output = ERB.new(File.read(file)).result
411
- if File.exist?(output_file) && File.read(output_file) == output
412
- return
413
- end
414
- File.write(output_file,output)
415
- puts "Processed erb #{file} → #{output_file}"
416
- else
417
- STDERR.puts "Couldn't process erb file #{file}..."
418
- exit 1
389
+ fail 'No erb file found', file unless file_exists?(file)
390
+
391
+ if output_file.nil?
392
+ output_file = file.end_with?('.erb') ? file[0...-4] : file + '.out'
419
393
  end
394
+ out = ERB.new(File.read(file)).result
395
+ return if File.exist?(output_file) && File.read(output_file) == out
396
+
397
+ File.write(output_file, out)
398
+ info 'Processed erb', "#{file} → #{output_file}"
420
399
  end
421
400
 
422
401
  # run configuration.rb file
423
402
  def run(file)
424
- cwd = pwd()
403
+ cwd = pwd
425
404
  file = abs(file)
426
- unless file_exists?(file)
427
- STDERR.puts "No configuration file: #{file} found"
428
- exit 1
429
- end
430
- puts "Running configuration: "+file
405
+ fail 'No configuration file found', file unless file_exists?(file)
406
+
407
+ info 'Running configuration', file
431
408
  file_cwd = file_dir(file)
432
409
  chdir file_cwd
433
410
  load file
@@ -436,19 +413,16 @@ end
436
413
 
437
414
  # run configuration.rb file only if it exists
438
415
  def run_if_exists(file)
439
- if file_exists?(file)
440
- run file
441
- end
416
+ run file if file_exists?(file)
442
417
  end
443
418
 
444
419
  # run central configuration
445
420
  def central(configurations)
446
- if configurations.instance_of?(Array) && configurations.length > 0
447
- configurations.each {|configuration| run configuration }
421
+ if configurations.instance_of?(Array) && !configurations.empty?
422
+ configurations.each { |configuration| run configuration }
448
423
  elsif configurations.instance_of?(String)
449
424
  run configurations
450
425
  else
451
426
  run 'configuration.rb'
452
427
  end
453
428
  end
454
-
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: central
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Geurkov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-19 00:00:00.000000000 Z
11
+ date: 2019-05-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: central dotfile management system
14
14
  email: d.geurkov@gmail.com
@@ -31,7 +31,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: '0'
34
+ version: '2.0'
35
35
  required_rubygems_version: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - ">="