cli-mastermind 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cli/mastermind/configuration.rb +8 -3
- data/lib/cli/mastermind/errors.rb +3 -0
- data/lib/cli/mastermind/loader/planfile_loader.rb +8 -4
- data/lib/cli/mastermind/plan.rb +32 -3
- data/lib/cli/mastermind/version.rb +1 -1
- metadata +2 -13
- data/.gitignore +0 -11
- data/.masterplan +0 -6
- data/.rspec +0 -3
- data/Gemfile +0 -12
- data/Gemfile.lock +0 -46
- data/bin/console +0 -12
- data/bin/rspec +0 -29
- data/bin/setup +0 -8
- data/cli-mastermind.gemspec +0 -34
- data/plans/gem.plan +0 -39
- data/plans/sample.plan +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b77931d1ca0f264d32626bd535ac1b865230156182f46e1c52eea2d77dac0684
|
4
|
+
data.tar.gz: 170465e4aed0ac88fb1faf9a586b70276f32dea2eec30f194b7edbc8cbce87dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98a87cf788c133fdc60d3ee14a0e356839c85f6b45ca9b95e490619126a511f261d81b949ae46cd16912d27325a214cbb27982be4d0eae830ec9074e41e92424
|
7
|
+
data.tar.gz: 7cf8df99f7168abb8510c87a24b9568d3e3cfec599424ab698279abec36f57ade58b51f4f812860f2d8101ade4fec76b1236150fef5e54877b91c40a45e29369
|
@@ -63,11 +63,16 @@ module CLI
|
|
63
63
|
# Loads all plan files added using +add_plans+
|
64
64
|
# @see Plan.load
|
65
65
|
def load_plans
|
66
|
-
@plans
|
66
|
+
@plans = {}
|
67
|
+
|
68
|
+
top_level_plan = Plan.new('temporary_plan')
|
69
|
+
|
70
|
+
@plan_files.each do |file|
|
67
71
|
plans = Plan.load file
|
68
|
-
|
69
|
-
hash
|
72
|
+
top_level_plan.add_children plans
|
70
73
|
end
|
74
|
+
|
75
|
+
@plans = top_level_plan.children
|
71
76
|
end
|
72
77
|
|
73
78
|
# Loads a masterplan using the DSL, if it exists and hasn't been loaded already
|
@@ -7,6 +7,9 @@ module CLI::Mastermind
|
|
7
7
|
DSL.new(filename).plans
|
8
8
|
end
|
9
9
|
|
10
|
+
class InvalidPlanfileError < Error
|
11
|
+
end
|
12
|
+
|
10
13
|
private
|
11
14
|
|
12
15
|
class DSL
|
@@ -14,21 +17,22 @@ module CLI::Mastermind
|
|
14
17
|
|
15
18
|
def initialize(filename=nil, &block)
|
16
19
|
@plans = []
|
20
|
+
@filename = filename
|
17
21
|
|
18
22
|
if block_given?
|
19
23
|
instance_eval(&block)
|
20
24
|
elsif File.exists? filename
|
21
25
|
instance_eval(File.read(filename), filename, 0)
|
22
26
|
else
|
23
|
-
raise 'Must provide valid path to a planfile or a block'
|
27
|
+
raise InvalidPlanfileError, 'Must provide valid path to a planfile or a block'
|
24
28
|
end
|
25
29
|
end
|
26
30
|
|
27
31
|
def plot(name, &block)
|
28
|
-
plan = Plan.new name, @description
|
32
|
+
plan = Plan.new name, @description, @filename
|
29
33
|
@description = nil
|
30
34
|
@plans << plan
|
31
|
-
plan.add_children DSL.new(&block).plans
|
35
|
+
plan.add_children DSL.new(@filename, &block).plans
|
32
36
|
end
|
33
37
|
alias_method :namespace, :plot
|
34
38
|
|
@@ -38,7 +42,7 @@ module CLI::Mastermind
|
|
38
42
|
alias_method :desc, :description
|
39
43
|
|
40
44
|
def plan(name, &block)
|
41
|
-
@plans << Plan.new(name, @description, &block)
|
45
|
+
@plans << Plan.new(name, @description, @filename, &block)
|
42
46
|
@description = nil
|
43
47
|
end
|
44
48
|
alias_method :task, :plan
|
data/lib/cli/mastermind/plan.rb
CHANGED
@@ -16,6 +16,9 @@ module CLI
|
|
16
16
|
# Used in the interactive plan selector to display child plans
|
17
17
|
attr_reader :children
|
18
18
|
|
19
|
+
# The file this plan was loaded from, if any
|
20
|
+
attr_reader :filename
|
21
|
+
|
19
22
|
# Loads a particular plan from the filesystem.
|
20
23
|
# @see Loader
|
21
24
|
def self.load(filename)
|
@@ -24,9 +27,10 @@ module CLI
|
|
24
27
|
loader.load(filename)
|
25
28
|
end
|
26
29
|
|
27
|
-
def initialize(name, description=nil, &block)
|
30
|
+
def initialize(name, description=nil, filename=nil, &block)
|
28
31
|
@name = name.to_s.freeze
|
29
32
|
@description = description.freeze
|
33
|
+
@filename = filename
|
30
34
|
@block = block
|
31
35
|
@children = {}
|
32
36
|
end
|
@@ -39,8 +43,8 @@ module CLI
|
|
39
43
|
alias_method :dig, :get_child
|
40
44
|
|
41
45
|
def add_children(plans)
|
42
|
-
raise 'Cannot add child plans to a plan with an action'
|
43
|
-
plans.each
|
46
|
+
raise InvalidPlanError, 'Cannot add child plans to a plan with an action' unless @block.nil?
|
47
|
+
plans.each(&method(:incorporate_plan))
|
44
48
|
end
|
45
49
|
|
46
50
|
def has_children?
|
@@ -56,6 +60,31 @@ module CLI
|
|
56
60
|
|
57
61
|
private
|
58
62
|
|
63
|
+
def incorporate_plan(plan)
|
64
|
+
# If this namespace isn't taken just add the plan
|
65
|
+
if @children.has_key? plan.name
|
66
|
+
|
67
|
+
# Otherwise, we need to handle a name collision
|
68
|
+
existing_plan = @children[plan.name]
|
69
|
+
|
70
|
+
# If both plans have children, we merge them together
|
71
|
+
if existing_plan.has_children? and plan.has_children?
|
72
|
+
existing_plan.add_children plan.children.values
|
73
|
+
|
74
|
+
return existing_plan
|
75
|
+
end
|
76
|
+
|
77
|
+
# Otherwise, the plan defined later wins and overwrites the existing plan
|
78
|
+
warn <<~PLAN_COLLISON.strip
|
79
|
+
Plan name collision encountered when loading plans from "#{plan.filename}" that cannot be merged.
|
80
|
+
"#{plan.name}" was previously defined in "#{existing_plan.filename}".
|
81
|
+
Plans from "#{plan.filename}" will be used instead.
|
82
|
+
PLAN_COLLISON
|
83
|
+
end
|
84
|
+
|
85
|
+
@children[plan.name] = plan
|
86
|
+
end
|
87
|
+
|
59
88
|
# Delegate configuration to the top-level configuration object
|
60
89
|
def_delegator :'CLI::Mastermind', :configuration
|
61
90
|
alias_method :config, :configuration
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cli-mastermind
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Hall
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cli-ui
|
@@ -70,17 +70,8 @@ executables:
|
|
70
70
|
extensions: []
|
71
71
|
extra_rdoc_files: []
|
72
72
|
files:
|
73
|
-
- ".gitignore"
|
74
|
-
- ".masterplan"
|
75
|
-
- ".rspec"
|
76
|
-
- Gemfile
|
77
|
-
- Gemfile.lock
|
78
73
|
- LICENSE.txt
|
79
74
|
- README.md
|
80
|
-
- bin/console
|
81
|
-
- bin/rspec
|
82
|
-
- bin/setup
|
83
|
-
- cli-mastermind.gemspec
|
84
75
|
- exe/mastermind
|
85
76
|
- lib/cli/mastermind.rb
|
86
77
|
- lib/cli/mastermind/arg_parse.rb
|
@@ -91,8 +82,6 @@ files:
|
|
91
82
|
- lib/cli/mastermind/loader/planfile_loader.rb
|
92
83
|
- lib/cli/mastermind/plan.rb
|
93
84
|
- lib/cli/mastermind/version.rb
|
94
|
-
- plans/gem.plan
|
95
|
-
- plans/sample.plan
|
96
85
|
homepage: https://github.com/chall8908/cli-mastermind
|
97
86
|
licenses:
|
98
87
|
- MIT
|
data/.gitignore
DELETED
data/.masterplan
DELETED
data/.rspec
DELETED
data/Gemfile
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
source "https://rubygems.org"
|
2
|
-
|
3
|
-
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
4
|
-
|
5
|
-
#ruby=ruby-2.5.1
|
6
|
-
#ruby-gemset=cli-mastermind
|
7
|
-
|
8
|
-
# Specify your gem's dependencies in cli-mastermind.gemspec
|
9
|
-
gemspec
|
10
|
-
|
11
|
-
gem 'pry'
|
12
|
-
gem 'pry-byebug'
|
data/Gemfile.lock
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
cli-mastermind (0.0.1)
|
5
|
-
cli-ui (~> 1.2, >= 1.2.1)
|
6
|
-
|
7
|
-
GEM
|
8
|
-
remote: https://rubygems.org/
|
9
|
-
specs:
|
10
|
-
byebug (10.0.2)
|
11
|
-
cli-ui (1.2.1)
|
12
|
-
coderay (1.1.2)
|
13
|
-
diff-lcs (1.3)
|
14
|
-
method_source (0.9.2)
|
15
|
-
pry (0.12.2)
|
16
|
-
coderay (~> 1.1.0)
|
17
|
-
method_source (~> 0.9.0)
|
18
|
-
pry-byebug (3.6.0)
|
19
|
-
byebug (~> 10.0)
|
20
|
-
pry (~> 0.10)
|
21
|
-
rspec (3.8.0)
|
22
|
-
rspec-core (~> 3.8.0)
|
23
|
-
rspec-expectations (~> 3.8.0)
|
24
|
-
rspec-mocks (~> 3.8.0)
|
25
|
-
rspec-core (3.8.0)
|
26
|
-
rspec-support (~> 3.8.0)
|
27
|
-
rspec-expectations (3.8.2)
|
28
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
29
|
-
rspec-support (~> 3.8.0)
|
30
|
-
rspec-mocks (3.8.0)
|
31
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
32
|
-
rspec-support (~> 3.8.0)
|
33
|
-
rspec-support (3.8.0)
|
34
|
-
|
35
|
-
PLATFORMS
|
36
|
-
ruby
|
37
|
-
|
38
|
-
DEPENDENCIES
|
39
|
-
bundler (~> 1.16)
|
40
|
-
cli-mastermind!
|
41
|
-
pry
|
42
|
-
pry-byebug
|
43
|
-
rspec (~> 3.0)
|
44
|
-
|
45
|
-
BUNDLED WITH
|
46
|
-
1.16.2
|
data/bin/console
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "cli/mastermind"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
require "pry"
|
11
|
-
require 'pry-byebug'
|
12
|
-
Pry.start
|
data/bin/rspec
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
#
|
5
|
-
# This file was generated by Bundler.
|
6
|
-
#
|
7
|
-
# The application 'rspec' is installed as part of a gem, and
|
8
|
-
# this file is here to facilitate running it.
|
9
|
-
#
|
10
|
-
|
11
|
-
require "pathname"
|
12
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
-
Pathname.new(__FILE__).realpath)
|
14
|
-
|
15
|
-
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
-
|
17
|
-
if File.file?(bundle_binstub)
|
18
|
-
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
-
load(bundle_binstub)
|
20
|
-
else
|
21
|
-
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
-
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
require "rubygems"
|
27
|
-
require "bundler/setup"
|
28
|
-
|
29
|
-
load Gem.bin_path("rspec-core", "rspec")
|
data/bin/setup
DELETED
data/cli-mastermind.gemspec
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
lib = File.expand_path("../lib", __FILE__)
|
2
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
require "cli/mastermind/version"
|
4
|
-
|
5
|
-
Gem::Specification.new do |spec|
|
6
|
-
spec.name = "cli-mastermind"
|
7
|
-
spec.version = CLI::Mastermind.gem_version
|
8
|
-
spec.authors = ["Chris Hall"]
|
9
|
-
spec.email = ["chall8908@gmail.com"]
|
10
|
-
|
11
|
-
spec.summary = "Mastermind is a library for constructing command line toolboxes."
|
12
|
-
spec.description = <<-DESC
|
13
|
-
Take over the world from your command line!
|
14
|
-
With mastermind, you can quickly build and generate
|
15
|
-
command line toolkits without having to custom build
|
16
|
-
everything for every project.
|
17
|
-
DESC
|
18
|
-
spec.homepage = "https://github.com/chall8908/cli-mastermind"
|
19
|
-
spec.license = "MIT"
|
20
|
-
|
21
|
-
# Specify which files should be added to the gem when it is released.
|
22
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
23
|
-
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
24
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
25
|
-
end
|
26
|
-
spec.bindir = "exe"
|
27
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
|
-
spec.require_paths = ["lib"]
|
29
|
-
|
30
|
-
spec.add_runtime_dependency "cli-ui", "~> 1.2", ">= 1.2.1"
|
31
|
-
|
32
|
-
spec.add_development_dependency "bundler", "~> 1.16"
|
33
|
-
spec.add_development_dependency "rspec", "~> 3.0"
|
34
|
-
end
|
data/plans/gem.plan
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
#-*- ruby -*-
|
2
|
-
plot :gem do
|
3
|
-
description 'Builds the mastermind gem'
|
4
|
-
# NOTE: The Gem::Package interface doesn't appear to be completely stable.
|
5
|
-
# This may only work on version 2.7.7 of RubyGems, though other versions
|
6
|
-
# seem to support passing only a spec as I'm doing here.
|
7
|
-
plan :build do
|
8
|
-
Dir.mkdir 'pkg' unless Dir.exists? 'pkg'
|
9
|
-
|
10
|
-
require 'rubygems/package'
|
11
|
-
spec = config.gemspec
|
12
|
-
|
13
|
-
Gem::Package.build(spec)
|
14
|
-
|
15
|
-
File.write(File.join('pkg', spec.file_name), File.read(spec.file_name), mode: ?w)
|
16
|
-
File.delete(spec.file_name)
|
17
|
-
end
|
18
|
-
|
19
|
-
description 'Install mastermind into the local system'
|
20
|
-
plan :install do
|
21
|
-
require 'rubygems/installer'
|
22
|
-
config.plans['gem']['build'].call
|
23
|
-
|
24
|
-
Gem::Installer.at(File.join('pkg', config.gemspec.file_name)).install
|
25
|
-
end
|
26
|
-
|
27
|
-
description 'Package and push a new release'
|
28
|
-
plan :release do
|
29
|
-
config.plans['gem']['build'].call
|
30
|
-
spec = config.gemspec
|
31
|
-
|
32
|
-
`git tag '#{spec.version}'`
|
33
|
-
`git push origin HEAD`
|
34
|
-
`git push --tags`
|
35
|
-
|
36
|
-
require 'rubygems/command_manager'
|
37
|
-
Gem::CommandManager.instance['push'].invoke File.join('pkg', spec.file_name)
|
38
|
-
end
|
39
|
-
end
|
data/plans/sample.plan
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
#-*- ruby -*-
|
2
|
-
# aliased as `namespace` for a less fanciful, rake-like way of doing things
|
3
|
-
plot :top_level do
|
4
|
-
|
5
|
-
# aliased as `desc` if you prefer brevity
|
6
|
-
description 'This is the description of the next plan defined'
|
7
|
-
# aliased as `task`, for a less fanciful, rake-like way of doing things
|
8
|
-
plan :child_plan do |arguments|
|
9
|
-
puts 'EXECUTING'
|
10
|
-
puts arguments
|
11
|
-
end
|
12
|
-
|
13
|
-
description 'This is another plan under the top_level plan'
|
14
|
-
plan :second_child do
|
15
|
-
# more tasks
|
16
|
-
end
|
17
|
-
end
|