gisture 0.0.11 → 0.0.12
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/lib/gisture/cloned_file.rb +1 -1
- data/lib/gisture/commands/repo/file/run.rb +84 -0
- data/lib/gisture/commands/repo/run.rb +3 -41
- data/lib/gisture/file.rb +15 -4
- data/lib/gisture/repo.rb +61 -2
- data/lib/gisture/version.rb +1 -1
- data/lib/tasks/gisture.rake +11 -4
- data/spec/gists/array.gist +7 -0
- data/spec/gists/class.gist +4 -0
- data/spec/gists/gisture.yml +5 -0
- data/spec/gists/method.gisture +3 -0
- data/spec/gists/multi.gist +10 -0
- data/spec/gists/resourceful.gist +4 -0
- data/spec/gists/resourceful.rb +2 -0
- data/spec/gists/resourceful.txt +1 -0
- metadata +33 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab45da4ed2c2d6056ff570a3acb5fb65040c4a9e
|
4
|
+
data.tar.gz: 4b59c005cb105f398c21cc0587c46b129cca8080
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 949934e74b6d675074d0a07677650671d1dd29d2b937b37694030c56a200fe3d3db727cec96f829f205f735376c21a59a1fec95fe093fe756e64d1407c574b2f
|
7
|
+
data.tar.gz: ef22d5df5fb865b17051ff3f4ebb0738bc2a2f00a7de4247072a061499b00bcd9b2183b924ee7298157e9502328e5c394b5a1a18cb3ed4ca1484eaadab6eef3e
|
data/lib/gisture/cloned_file.rb
CHANGED
@@ -44,7 +44,7 @@ module Gisture
|
|
44
44
|
path = ::File.join(clone_path, file_path)
|
45
45
|
@clone_path = clone_path
|
46
46
|
@tempfile = ::File.new(path)
|
47
|
-
file_hash = Hashie::Mash.new({path: path, filename:
|
47
|
+
file_hash = Hashie::Mash.new({path: path, filename: file_path, content: tempfile.read})
|
48
48
|
super(file_hash, basename: basename, strategy: strategy)
|
49
49
|
end
|
50
50
|
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'kommand/commands'
|
2
|
+
|
3
|
+
module Gisture
|
4
|
+
module Commands
|
5
|
+
module Repo
|
6
|
+
module File
|
7
|
+
class Run
|
8
|
+
include Kommand::Commands::Command
|
9
|
+
|
10
|
+
command_name 'repo:file:run'
|
11
|
+
command_summary "Run a repo file directly from the command line"
|
12
|
+
valid_argument Kommand::Scripts::Argument.new("-f, --filename", summary: "Specify a filename if it's not included in the repo URL")
|
13
|
+
valid_argument Kommand::Scripts::Argument.new("-s, --strategy", summary: "Execution strategy, defaults to 'eval'")
|
14
|
+
valid_argument Kommand::Scripts::Argument.new("-e, --evaluator", summary: "Use a custom evaluator class, only applies to 'eval' strategy")
|
15
|
+
valid_argument Kommand::Scripts::Argument.new("-c, --clone", summary: "Clone the repo into a local tmp path and run from that working dir")
|
16
|
+
validate_arguments false
|
17
|
+
|
18
|
+
class << self
|
19
|
+
def usage
|
20
|
+
puts "usage: #{Kommand.kommand} #{command_name} GIST_ID_OR_URL #{valid_arguments.to_s}"
|
21
|
+
unless valid_arguments.empty?
|
22
|
+
puts
|
23
|
+
puts "Arguments:"
|
24
|
+
puts valid_arguments.to_help
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def run
|
30
|
+
clone? ? repo.clone! : repo.destroy_clone!
|
31
|
+
|
32
|
+
result = file.run!
|
33
|
+
|
34
|
+
if strategy == :exec
|
35
|
+
puts result
|
36
|
+
else
|
37
|
+
result
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
protected
|
42
|
+
|
43
|
+
def file
|
44
|
+
@file ||= repo.file((repo_url[1] || filename), strategy: strategy)
|
45
|
+
end
|
46
|
+
|
47
|
+
def repo
|
48
|
+
@repo ||= Gisture.repo(repo_url[0])
|
49
|
+
end
|
50
|
+
|
51
|
+
def repo_url
|
52
|
+
Gisture::Repo.parse_file_url(arguments.unnamed.first.value)
|
53
|
+
rescue
|
54
|
+
[Gisture::Repo.parse_repo_url(arguments.unnamed.first.value).join('/')]
|
55
|
+
end
|
56
|
+
|
57
|
+
def strategy
|
58
|
+
@strategy ||= begin
|
59
|
+
strat = arguments.get(:strategy) || 'eval'
|
60
|
+
if strat == 'eval'
|
61
|
+
{eval: evaluator}
|
62
|
+
else
|
63
|
+
strat.to_sym
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def evaluator
|
69
|
+
@evaluator ||= eval(arguments.get(:evaluator) || 'Gisture::Evaluator')
|
70
|
+
end
|
71
|
+
|
72
|
+
def filename
|
73
|
+
@filename ||= arguments.get(:filename)
|
74
|
+
end
|
75
|
+
|
76
|
+
def clone?
|
77
|
+
arguments.arg?(:clone)
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -7,16 +7,12 @@ module Gisture
|
|
7
7
|
include Kommand::Commands::Command
|
8
8
|
|
9
9
|
command_name 'repo:run'
|
10
|
-
command_summary "Run a
|
11
|
-
valid_argument Kommand::Scripts::Argument.new("-f, --filename", summary: "Specify a filename if it's not included in the repo URL")
|
12
|
-
valid_argument Kommand::Scripts::Argument.new("-s, --strategy", summary: "Execution strategy, defaults to 'eval'")
|
13
|
-
valid_argument Kommand::Scripts::Argument.new("-e, --evaluator", summary: "Use a custom evaluator class, only applies to 'eval' strategy")
|
14
|
-
valid_argument Kommand::Scripts::Argument.new("-c, --clone", summary: "Clone the repo into a local tmp path and run from that working dir")
|
10
|
+
command_summary "Run a yaml gisture directly from the command line"
|
15
11
|
validate_arguments false
|
16
12
|
|
17
13
|
class << self
|
18
14
|
def usage
|
19
|
-
puts "usage: #{Kommand.kommand} #{command_name}
|
15
|
+
puts "usage: #{Kommand.kommand} #{command_name} YAML_GISTURE_URL #{valid_arguments.to_s}"
|
20
16
|
unless valid_arguments.empty?
|
21
17
|
puts
|
22
18
|
puts "Arguments:"
|
@@ -26,22 +22,11 @@ module Gisture
|
|
26
22
|
end
|
27
23
|
|
28
24
|
def run
|
29
|
-
|
30
|
-
|
31
|
-
result = file.run!
|
32
|
-
|
33
|
-
if strategy == :exec
|
34
|
-
puts result
|
35
|
-
else
|
36
|
-
result
|
37
|
-
end
|
25
|
+
repo.run!(repo_url[1])
|
38
26
|
end
|
39
27
|
|
40
28
|
protected
|
41
29
|
|
42
|
-
def file
|
43
|
-
@file ||= repo.file((repo_url[1] || filename), strategy: strategy)
|
44
|
-
end
|
45
30
|
|
46
31
|
def repo
|
47
32
|
@repo ||= Gisture.repo(repo_url[0])
|
@@ -53,29 +38,6 @@ module Gisture
|
|
53
38
|
[Gisture::Repo.parse_repo_url(arguments.unnamed.first.value).join('/')]
|
54
39
|
end
|
55
40
|
|
56
|
-
def strategy
|
57
|
-
@strategy ||= begin
|
58
|
-
strat = arguments.get(:strategy) || 'eval'
|
59
|
-
if strat == 'eval'
|
60
|
-
{eval: evaluator}
|
61
|
-
else
|
62
|
-
strat.to_sym
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def evaluator
|
68
|
-
@evaluator ||= eval(arguments.get(:evaluator) || 'Gisture::Evaluator')
|
69
|
-
end
|
70
|
-
|
71
|
-
def filename
|
72
|
-
@filename ||= arguments.get(:filename)
|
73
|
-
end
|
74
|
-
|
75
|
-
def clone?
|
76
|
-
arguments.arg?(:clone)
|
77
|
-
end
|
78
|
-
|
79
41
|
end
|
80
42
|
end
|
81
43
|
end
|
data/lib/gisture/file.rb
CHANGED
@@ -21,21 +21,21 @@ module Gisture
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def require!(*args, &block)
|
24
|
-
Gisture.logger.info "[gisture] Running #{basename
|
24
|
+
Gisture.logger.info "[gisture] Running #{::File.join(basename, (file.filename || file.path))} via the :require strategy"
|
25
25
|
required = require tempfile.path
|
26
26
|
unlink_tempfile
|
27
27
|
block_given? ? yield : required
|
28
28
|
end
|
29
29
|
|
30
30
|
def load!(*args, &block)
|
31
|
-
Gisture.logger.info "[gisture] Running #{basename
|
31
|
+
Gisture.logger.info "[gisture] Running #{::File.join(basename, (file.filename || file.path))} via the :load strategy"
|
32
32
|
loaded = load tempfile.path
|
33
33
|
unlink_tempfile
|
34
34
|
block_given? ? yield : loaded
|
35
35
|
end
|
36
36
|
|
37
37
|
def eval!(*args, &block)
|
38
|
-
Gisture.logger.info "[gisture] Running #{basename
|
38
|
+
Gisture.logger.info "[gisture] Running #{::File.join(basename, (file.filename || file.path))} via the :eval strategy"
|
39
39
|
args << Gisture::Evaluator
|
40
40
|
klass = args.first
|
41
41
|
evaluator = klass.new(file.content)
|
@@ -44,7 +44,7 @@ module Gisture
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def exec!(*args, &block)
|
47
|
-
Gisture.logger.info "[gisture] Running #{basename
|
47
|
+
Gisture.logger.info "[gisture] Running #{::File.join(basename, (file.filename || file.path))} via the :exec strategy"
|
48
48
|
|
49
49
|
# map nils to file path in args to allow easily inserting the filepath wherever
|
50
50
|
# makes sense in your executable arguments (i.e. 'ruby', '-v', nil, '--script-arg')
|
@@ -81,6 +81,17 @@ module Gisture
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
+
def localize!(root)
|
85
|
+
@tempfile = begin
|
86
|
+
fname = ::File.join(root, (file.path || file.filename))
|
87
|
+
FileUtils.mkdir_p ::File.dirname(fname)
|
88
|
+
local_file = ::File.open(fname, 'w')
|
89
|
+
local_file.write(file.content)
|
90
|
+
local_file.close
|
91
|
+
local_file
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
84
95
|
def extname
|
85
96
|
@extname ||= ::File.extname(file.filename)
|
86
97
|
end
|
data/lib/gisture/repo.rb
CHANGED
@@ -3,6 +3,7 @@ module Gisture
|
|
3
3
|
attr_reader :owner, :project
|
4
4
|
REPO_URL_REGEX = /\A((http[s]?:\/\/)?github\.com\/)?([a-z0-9_\-\.]*)\/([a-z0-9_\-\.]*)\/?\Z/i
|
5
5
|
FILE_URL_REGEX = /\A((http[s]?:\/\/)?github\.com\/)?(([a-z0-9_\-\.]*)\/([a-z0-9_\-\.]*))(\/[a-z0-9_\-\.\/]+)\Z/i
|
6
|
+
GISTURE_FILE_REGEX = /\A(gisture\.ya?ml|.+\.gist|.+\.gisture)\Z/ # gisture.yml, gisture.yaml, whatever.gist, whatever.gisture
|
6
7
|
|
7
8
|
class << self
|
8
9
|
def file(path, strategy: nil)
|
@@ -44,9 +45,67 @@ module Gisture
|
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
47
|
-
def
|
48
|
-
|
48
|
+
def files(path)
|
49
|
+
if cloned?
|
50
|
+
Dir[::File.join(clone_path, path, '*')].map { |f| Hashie::Mash.new({name: ::File.basename(f), path: ::File.join(path, ::File.basename(f))}) }
|
51
|
+
else
|
52
|
+
github.repos.contents.get(user: owner, repo: project, path: path).body
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# TODO move all the gisture/gisticulate stuff into a separate class (Gisture? Gisticulation?)
|
57
|
+
|
58
|
+
def gistures(path)
|
59
|
+
if ::File.basename(path).match(GISTURE_FILE_REGEX)
|
60
|
+
[Hashie::Mash.new(YAML.load(file(path).content).symbolize_keys)]
|
61
|
+
else
|
62
|
+
files(path).select { |f| f.name.match(GISTURE_FILE_REGEX) }.map { |f| Hashie::Mash.new(YAML.load(file(f.path).content).symbolize_keys) }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def gisticulate(gisture, &block)
|
67
|
+
if gisture.key?(:gistures) || gisture.key?(:gists)
|
68
|
+
gists = (gisture[:gistures] || gisture[:gists])
|
69
|
+
gists = gists.values if gists.respond_to?(:values)
|
70
|
+
clone! if gists.any? { |g| g[:clone] == true } # force clone once up front for a refresh
|
71
|
+
gists.map { |gist| gisticulate(gist, &block) }
|
72
|
+
else
|
73
|
+
clone if gisture[:clone] == true
|
74
|
+
|
75
|
+
run_options = []
|
76
|
+
run_options << eval(gisture[:evaluator]) if (!gisture.key?(:strategy) || gisture[:strategy].to_sym == :eval) && gisture.key?(:evaluator)
|
77
|
+
run_options = gisture[:executor] if (gisture.key?(:strategy) && gisture[:strategy].to_sym == :exec) && gisture.key?(:executor)
|
78
|
+
|
79
|
+
if gisture[:resources] && !cloned?
|
80
|
+
# localize and pull down any relevant resources
|
81
|
+
gisture[:resources].each do |resource|
|
82
|
+
Gisture.logger.info "[gisture] Localizing resource #{::File.join(owner, project, resource)} into #{clone_path}"
|
83
|
+
file(resource).localize!(clone_path)
|
84
|
+
end
|
85
|
+
|
86
|
+
# localize the file we're running
|
87
|
+
Gisture.logger.info "[gisture] Localizing gisture #{::File.join(owner, project, gisture[:path])} into #{clone_path}"
|
88
|
+
gfile = file(gisture[:path], strategy: gisture[:strategy])
|
89
|
+
gfile.localize!(clone_path)
|
90
|
+
|
91
|
+
# chdir into the localized temp path
|
92
|
+
cwd = Dir.pwd
|
93
|
+
Dir.chdir ::File.dirname(gfile.tempfile.path)
|
94
|
+
result = gfile.run!(*run_options, &block)
|
95
|
+
Dir.chdir cwd
|
96
|
+
result
|
97
|
+
else
|
98
|
+
file(gisture[:path], strategy: gisture[:strategy]).run!(*run_options, &block)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def run(path, &block)
|
104
|
+
gists = gistures(path)
|
105
|
+
clone! if gists.any? { |g| g[:clone] == true } # force clone once up front for a refresh
|
106
|
+
gists.map { |g| gisticulate(g, &block) }
|
49
107
|
end
|
108
|
+
alias_method :run!, :run
|
50
109
|
|
51
110
|
def clone_path
|
52
111
|
@clone_path ||= ::File.join(Gisture.configuration.tmpdir, owner, project)
|
data/lib/gisture/version.rb
CHANGED
data/lib/tasks/gisture.rake
CHANGED
@@ -8,10 +8,17 @@ namespace :gisture do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
namespace :repo do
|
11
|
-
desc 'Run a
|
12
|
-
task :run, [:repo, :
|
13
|
-
|
14
|
-
|
11
|
+
desc 'Run a yaml gisture from a github repo in a rake task'
|
12
|
+
task :run, [:repo, :yaml_file] => :environment do |t,args|
|
13
|
+
Gisture.repo(args.repo).run!(args.yaml_file)
|
14
|
+
end
|
15
|
+
|
16
|
+
namespace :file do
|
17
|
+
desc 'Run a file from a github repo in a rake task'
|
18
|
+
task :run, [:repo, :filename, :strategy, :runner] => :environment do |t,args|
|
19
|
+
runner = Proc.new { eval(args.runner.to_s) }
|
20
|
+
Gisture.repo(args.repo).file(args.filename, strategy: args.strategy).run!(&runner)
|
21
|
+
end
|
15
22
|
end
|
16
23
|
end
|
17
24
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
This is the content of resourceful.txt
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gisture
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Rebec
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: canfig
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: hashie
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: git
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +122,7 @@ files:
|
|
108
122
|
- lib/gisture/cloned_file.rb
|
109
123
|
- lib/gisture/commands.rb
|
110
124
|
- lib/gisture/commands/gist/run.rb
|
125
|
+
- lib/gisture/commands/repo/file/run.rb
|
111
126
|
- lib/gisture/commands/repo/run.rb
|
112
127
|
- lib/gisture/errors.rb
|
113
128
|
- lib/gisture/evaluator.rb
|
@@ -119,10 +134,18 @@ files:
|
|
119
134
|
- lib/gisture/repo_file.rb
|
120
135
|
- lib/gisture/version.rb
|
121
136
|
- lib/tasks/gisture.rake
|
137
|
+
- spec/gists/array.gist
|
122
138
|
- spec/gists/called_class.rb
|
123
139
|
- spec/gists/called_method.rb
|
140
|
+
- spec/gists/class.gist
|
124
141
|
- spec/gists/class.rb
|
142
|
+
- spec/gists/gisture.yml
|
143
|
+
- spec/gists/method.gisture
|
125
144
|
- spec/gists/method.rb
|
145
|
+
- spec/gists/multi.gist
|
146
|
+
- spec/gists/resourceful.gist
|
147
|
+
- spec/gists/resourceful.rb
|
148
|
+
- spec/gists/resourceful.txt
|
126
149
|
- spec/gists/simple.rb
|
127
150
|
- spec/gisture/evaluator_spec.rb
|
128
151
|
- spec/gisture/file_spec.rb
|
@@ -156,10 +179,18 @@ signing_key:
|
|
156
179
|
specification_version: 4
|
157
180
|
summary: Execute one-off gists inline or in the background.
|
158
181
|
test_files:
|
182
|
+
- spec/gists/array.gist
|
159
183
|
- spec/gists/called_class.rb
|
160
184
|
- spec/gists/called_method.rb
|
185
|
+
- spec/gists/class.gist
|
161
186
|
- spec/gists/class.rb
|
187
|
+
- spec/gists/gisture.yml
|
188
|
+
- spec/gists/method.gisture
|
162
189
|
- spec/gists/method.rb
|
190
|
+
- spec/gists/multi.gist
|
191
|
+
- spec/gists/resourceful.gist
|
192
|
+
- spec/gists/resourceful.rb
|
193
|
+
- spec/gists/resourceful.txt
|
163
194
|
- spec/gists/simple.rb
|
164
195
|
- spec/gisture/evaluator_spec.rb
|
165
196
|
- spec/gisture/file_spec.rb
|