oleg 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/leg +9 -0
- data/lib/leg/cli.rb +38 -0
- data/lib/leg/commands/base_command.rb +87 -0
- data/lib/leg/commands/build.rb +19 -0
- data/lib/leg/commands/clean.rb +19 -0
- data/lib/leg/commands/contract.rb +14 -0
- data/lib/leg/commands/diff.rb +22 -0
- data/lib/leg/commands/edit.rb +34 -0
- data/lib/leg/commands/expand.rb +14 -0
- data/lib/leg/commands/help.rb +20 -0
- data/lib/leg/commands/ls.rb +16 -0
- data/lib/leg/commands/next.rb +21 -0
- data/lib/leg/commands/pieces.rb +14 -0
- data/lib/leg/commands/run.rb +19 -0
- data/lib/leg/commands.rb +18 -0
- data/lib/leg.rb +9 -0
- metadata +60 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b7f5e28e44643080bb4f06b3396701c0bdce1693
|
4
|
+
data.tar.gz: 0c1ab8f6502b31450ea97af8498d4a08bf54ec56
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d4a7c99b7d778a0fce3d5af4bd14a8e7a9cdf1af4ba3414f13d11382928673c1eda2587dab92988292aed8de347e4ed0117ae9672f6377ef6ec5a698247c7ed8
|
7
|
+
data.tar.gz: ae2f6ce2b82963ce815cf68461cf9edb12ba24044a4d827d8c8273609fbcbef5ca48084b3e04fe2b7c831c23d804a124c57e1724451f43ce8d259b1474eb6064
|
data/bin/leg
ADDED
data/lib/leg/cli.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
class Leg::CLI
|
2
|
+
CONFIG_FILE = "leg.yml"
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
initial_dir = FileUtils.pwd
|
6
|
+
|
7
|
+
last_dir = nil
|
8
|
+
while FileUtils.pwd != last_dir
|
9
|
+
if File.exist?(CONFIG_FILE)
|
10
|
+
@config = YAML.load(File.read(CONFIG_FILE))
|
11
|
+
unless @config.is_a? Hash
|
12
|
+
puts "Error: Invalid config file."
|
13
|
+
exit!
|
14
|
+
end
|
15
|
+
@config[:path] = FileUtils.pwd
|
16
|
+
@config[:step_path] = last_dir
|
17
|
+
@config[:orig_path] = initial_dir
|
18
|
+
break
|
19
|
+
end
|
20
|
+
|
21
|
+
last_dir = FileUtils.pwd
|
22
|
+
FileUtils.cd('..')
|
23
|
+
end
|
24
|
+
|
25
|
+
FileUtils.cd(initial_dir)
|
26
|
+
end
|
27
|
+
|
28
|
+
def run(args)
|
29
|
+
args = ["help"] if args.empty?
|
30
|
+
cmd_name = args.shift.downcase
|
31
|
+
if cmd = Leg::Commands::LIST.find { |cmd| cmd.name == cmd_name }
|
32
|
+
cmd.new(args, @config).run
|
33
|
+
else
|
34
|
+
puts "There is no '#{cmd_name}' command. Run `leg help` for help."
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,87 @@
|
|
1
|
+
class Leg::Commands::BaseCommand
|
2
|
+
def initialize(args, config)
|
3
|
+
@args = args
|
4
|
+
@config = config
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.name; raise NotImplementedError; end
|
8
|
+
def self.summary; raise NotImplementedError; end
|
9
|
+
def run; raise NotImplementedError; end
|
10
|
+
|
11
|
+
def self.inherited(subclass)
|
12
|
+
Leg::Commands::LIST << subclass
|
13
|
+
end
|
14
|
+
|
15
|
+
ERROR_MSG = {
|
16
|
+
config: "You are not in a leg working directory.",
|
17
|
+
config_build: "Config file doesn't have build instructions.",
|
18
|
+
config_run: "Config file doesn't have run instructions.",
|
19
|
+
config_clean: "Config file doesn't have cleaning instructions.",
|
20
|
+
config_editor: "Config file doesn't specify a text editor."
|
21
|
+
}
|
22
|
+
|
23
|
+
def needs!(what)
|
24
|
+
valid = false
|
25
|
+
|
26
|
+
case what
|
27
|
+
when :config
|
28
|
+
valid = true if @config
|
29
|
+
when :config_build
|
30
|
+
valid = true if @config[:build]
|
31
|
+
when :config_run
|
32
|
+
valid = true if @config[:run]
|
33
|
+
when :config_clean
|
34
|
+
valid = true if @config[:clean]
|
35
|
+
when :config_editor
|
36
|
+
valid = true if @config[:editor]
|
37
|
+
else
|
38
|
+
raise NotImplementedError
|
39
|
+
end
|
40
|
+
|
41
|
+
if !valid
|
42
|
+
puts "Error: " + ERROR_MSG[what]
|
43
|
+
exit!
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def shell_command(*cmd, exec: false, echo: true, exit_on_failure: true)
|
48
|
+
if exec
|
49
|
+
exec(*cmd)
|
50
|
+
else
|
51
|
+
puts cmd if echo
|
52
|
+
success = system(*cmd)
|
53
|
+
exit! if !success && exit_on_failure
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def steps
|
58
|
+
@steps ||= Dir[File.join(@config[:path], "*")].map do |f|
|
59
|
+
name = File.basename(f)
|
60
|
+
name if File.directory?(f) && name =~ /\A\d+(\.\d+)*\z/
|
61
|
+
end.compact.sort_by { |s| s.split(".").map(&:to_i) }
|
62
|
+
end
|
63
|
+
|
64
|
+
def current_step
|
65
|
+
if @config[:step_path]
|
66
|
+
File.basename(@config[:step_path])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def latest_step
|
71
|
+
steps.last
|
72
|
+
end
|
73
|
+
|
74
|
+
def current_or_latest_step
|
75
|
+
current_step || latest_step
|
76
|
+
end
|
77
|
+
|
78
|
+
def step_path(step)
|
79
|
+
File.join(@config[:path], step)
|
80
|
+
end
|
81
|
+
|
82
|
+
def select_step(step, &block)
|
83
|
+
puts "Selecting step: #{step}"
|
84
|
+
FileUtils.cd(step_path(step), &block)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Leg::Commands::Build < Leg::Commands::BaseCommand
|
2
|
+
def self.name
|
3
|
+
"build"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.summary
|
7
|
+
"Build a version (latest by default) of a project"
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
needs! :config
|
12
|
+
needs! :config_build
|
13
|
+
|
14
|
+
select_step(current_or_latest_step) do
|
15
|
+
shell_command(@config[:build])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Leg::Commands::Clean < Leg::Commands::BaseCommand
|
2
|
+
def self.name
|
3
|
+
"clean"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.summary
|
7
|
+
"Delete files generated by the build command"
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
needs! :config
|
12
|
+
needs! :config_clean
|
13
|
+
|
14
|
+
select_step(current_or_latest_step) do
|
15
|
+
shell_command(@config[:clean])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class Leg::Commands::Diff < Leg::Commands::BaseCommand
|
2
|
+
def self.name
|
3
|
+
"diff"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.summary
|
7
|
+
"Display a diff between two versions of a file"
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
needs! :config
|
12
|
+
|
13
|
+
step = @args.first || latest_step
|
14
|
+
step_idx = steps.index(step)
|
15
|
+
prev_step = steps[step_idx - 1]
|
16
|
+
|
17
|
+
FileUtils.cd(@config[:path]) do
|
18
|
+
shell_command("git diff --no-index #{prev_step} #{step}", exec: true)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class Leg::Commands::Edit < Leg::Commands::BaseCommand
|
2
|
+
def self.name
|
3
|
+
"edit"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.summary
|
7
|
+
"Open a file in a text editor"
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
needs! :config
|
12
|
+
needs! :config_editor
|
13
|
+
|
14
|
+
step = current_or_latest_step
|
15
|
+
|
16
|
+
files = Dir[File.join(step_path(step), "**/*")].reject { |f| File.directory? f }
|
17
|
+
if files.length == 0
|
18
|
+
puts "Error: No files to edit."
|
19
|
+
exit!
|
20
|
+
elsif files.length == 1
|
21
|
+
file_path = files[0]
|
22
|
+
elsif @config[:default_file]
|
23
|
+
file_path = @config[:default_file]
|
24
|
+
else
|
25
|
+
puts "Error: You'll need to choose a file to edit."
|
26
|
+
exit!
|
27
|
+
end
|
28
|
+
|
29
|
+
select_step(step) do
|
30
|
+
shell_command("#{@config[:editor]}", file_path, exec: true)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Leg::Commands::Help < Leg::Commands::BaseCommand
|
2
|
+
def self.name
|
3
|
+
"help"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.summary
|
7
|
+
"Print out this help"
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
puts "Usage: leg <command> [args...]"
|
12
|
+
puts
|
13
|
+
puts "Commands:"
|
14
|
+
Leg::Commands::LIST.each do |cmd|
|
15
|
+
puts " #{cmd.name}"
|
16
|
+
puts " #{cmd.summary}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Leg::Commands::Next < Leg::Commands::BaseCommand
|
2
|
+
def self.name
|
3
|
+
"next"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.summary
|
7
|
+
"Create a new step that is a copy of the latest step"
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
needs! :config
|
12
|
+
|
13
|
+
latest_step = steps.last
|
14
|
+
next_step = (latest_step.to_i + 1).to_s
|
15
|
+
|
16
|
+
FileUtils.cd(@config[:path]) do
|
17
|
+
shell_command("cp -r #{latest_step} #{next_step}")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Leg::Commands::Run < Leg::Commands::BaseCommand
|
2
|
+
def self.name
|
3
|
+
"run"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.summary
|
7
|
+
"Build and run a version (latest by default) of the project"
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
needs! :config
|
12
|
+
needs! :config_run
|
13
|
+
|
14
|
+
select_step(current_or_latest_step) do
|
15
|
+
shell_command(@config[:run], exec: true)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
data/lib/leg/commands.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Leg::Commands
|
2
|
+
LIST = []
|
3
|
+
end
|
4
|
+
|
5
|
+
require 'leg/commands/base_command'
|
6
|
+
|
7
|
+
require 'leg/commands/build'
|
8
|
+
require 'leg/commands/clean'
|
9
|
+
require 'leg/commands/contract'
|
10
|
+
require 'leg/commands/diff'
|
11
|
+
require 'leg/commands/edit'
|
12
|
+
require 'leg/commands/expand'
|
13
|
+
require 'leg/commands/help'
|
14
|
+
require 'leg/commands/ls'
|
15
|
+
require 'leg/commands/next'
|
16
|
+
require 'leg/commands/pieces'
|
17
|
+
require 'leg/commands/run'
|
18
|
+
|
data/lib/leg.rb
ADDED
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: oleg
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jeremy Ruten
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-03-05 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email: jeremy.ruten@gmail.com
|
15
|
+
executables:
|
16
|
+
- leg
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- bin/leg
|
21
|
+
- lib/leg.rb
|
22
|
+
- lib/leg/cli.rb
|
23
|
+
- lib/leg/commands.rb
|
24
|
+
- lib/leg/commands/base_command.rb
|
25
|
+
- lib/leg/commands/build.rb
|
26
|
+
- lib/leg/commands/clean.rb
|
27
|
+
- lib/leg/commands/contract.rb
|
28
|
+
- lib/leg/commands/diff.rb
|
29
|
+
- lib/leg/commands/edit.rb
|
30
|
+
- lib/leg/commands/expand.rb
|
31
|
+
- lib/leg/commands/help.rb
|
32
|
+
- lib/leg/commands/ls.rb
|
33
|
+
- lib/leg/commands/next.rb
|
34
|
+
- lib/leg/commands/pieces.rb
|
35
|
+
- lib/leg/commands/run.rb
|
36
|
+
homepage: https://github.com/yjerem/leg
|
37
|
+
licenses:
|
38
|
+
- MIT
|
39
|
+
metadata: {}
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options: []
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
requirements: []
|
55
|
+
rubyforge_project:
|
56
|
+
rubygems_version: 2.6.8
|
57
|
+
signing_key:
|
58
|
+
specification_version: 4
|
59
|
+
summary: tools for .leg files
|
60
|
+
test_files: []
|