gisture 0.0.11 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- 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
|