rake-opt-keyword_args 0.1.0
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 +15 -0
- data/lib/rake/opt/keyword_args.rb +196 -0
- data/lib/rake/opt/keyword_args/patches.rb +4 -0
- data/lib/rake/opt/keyword_args/patches/boolean.rb +1 -0
- data/lib/rake/opt/keyword_args/patches/rake/application.rb +6 -0
- data/lib/rake/opt/keyword_args/patches/rake/dsl.rb +17 -0
- data/lib/rake/opt/keyword_args/patches/rake/task.rb +61 -0
- metadata +98 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MDk0MWYzYzMzMGQzYjY2YmQwM2E4ODE2MDM0OWIwMTI5NDc4YTVmMg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MDlmM2UwOGI1ODczMTU0YmFkMmQ1OGVhMDcwNGI5Y2UzMDBmOTUzNg==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YTAwMzA2OThiYTU5ZDVmNWYzODllZTg2NjYxNzYyNWYxYmJjMTk4ODMwNTc4
|
10
|
+
NjVjN2I2MDdiY2IxZDdiNTFiYTMxYzc3NDRkOGM5OTMzZmQ4MDY3OTQ3NWM2
|
11
|
+
MTdiODg5NWZlM2E0ZTc3ZDEzYTQzMDhlOTM1YTVhMzUzYWFiM2U=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZTljZDRhY2JlYjhlNmFkMzBjNzU4ZWY3Yjc0NGNhM2QxZWNhMmUzMTliOTVi
|
14
|
+
YTZlOTUzNWRkYmZmNzM2ODQ3NDkzNDlmMTQ4ODY4OTk3NTUyNjAzOWI3Mzhi
|
15
|
+
NzIwYTI4ZjA4NzQ5NjFkNzliYTU4M2RiNzE5ZjM4ZDQ5MmJlM2E=
|
@@ -0,0 +1,196 @@
|
|
1
|
+
require 'active_support/all'
|
2
|
+
require 'hashie'
|
3
|
+
|
4
|
+
module Rake
|
5
|
+
module Opt
|
6
|
+
module KeywordArgs
|
7
|
+
PARAM_SEPARATOR = ' '
|
8
|
+
|
9
|
+
class Error < StandardError ; end
|
10
|
+
class DefinitionError < Error ; end
|
11
|
+
class ValidationError < Error ; end
|
12
|
+
class UnsupportedTypeError < Error ; end
|
13
|
+
|
14
|
+
def self.included base
|
15
|
+
base.send :include, InstanceMethods
|
16
|
+
base.extend ClassMethods
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
|
21
|
+
def verify_args_block
|
22
|
+
# Flush the Print Queue at the end of each iteration
|
23
|
+
lambda do |*args|
|
24
|
+
task = args.first
|
25
|
+
yield task, task.verify_args(args[1]) if block_given?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def define_parameterized_task(*args, &block)
|
30
|
+
arg_options = Rake.application.last_args
|
31
|
+
Rake.application.last_args = nil
|
32
|
+
# Parse the arguments
|
33
|
+
name = ''
|
34
|
+
requirements = []
|
35
|
+
case args.size
|
36
|
+
when 1 then
|
37
|
+
arg = args.first
|
38
|
+
if arg.is_a? Hash
|
39
|
+
name = arg.keys.first
|
40
|
+
requirements = arg.values.first
|
41
|
+
else
|
42
|
+
name = arg.to_s
|
43
|
+
end
|
44
|
+
when 2 then
|
45
|
+
name = args.first
|
46
|
+
deps = args.last
|
47
|
+
if deps.is_a? Hash
|
48
|
+
if deps.keys.first.empty?
|
49
|
+
requirements = deps.values.last
|
50
|
+
else
|
51
|
+
raise DefinitionError, 'Must have no arguments when defining a paramterized task'
|
52
|
+
end
|
53
|
+
else
|
54
|
+
raise DefinitionError, 'Must have no arguments when defining a paramterized task'
|
55
|
+
end
|
56
|
+
else
|
57
|
+
raise DefinitionError, 'Unknown argument format'
|
58
|
+
end
|
59
|
+
|
60
|
+
# Set the pseudo args
|
61
|
+
arg_options_str = arg_options.keys.sort do |x,y|
|
62
|
+
next -1 if arg_options[x][:required] && !arg_options[y][:required]
|
63
|
+
next 1 if !arg_options[x][:required] && arg_options[y][:required]
|
64
|
+
next 1 if arg_options[x][:default] && !arg_options[y][:default]
|
65
|
+
next -1 if !arg_options[x][:default] && arg_options[y][:default]
|
66
|
+
next x.to_s <=> y.to_s
|
67
|
+
end.map do |arg|
|
68
|
+
options = arg_options[arg]
|
69
|
+
if options[:default] != nil
|
70
|
+
default_str = options[:default].to_s
|
71
|
+
elsif options[:required]
|
72
|
+
default_str = 'REQUIRED'
|
73
|
+
else
|
74
|
+
default_str = 'nil'
|
75
|
+
end
|
76
|
+
next "#{arg}=#{default_str}"
|
77
|
+
end.join(PARAM_SEPARATOR)
|
78
|
+
task_args = [ name, { [arg_options_str] => requirements } ]
|
79
|
+
|
80
|
+
task = self.__define_task_before_keyword_args__(*task_args, &verify_args_block(&block))
|
81
|
+
|
82
|
+
task.arg_options = arg_options
|
83
|
+
|
84
|
+
return task
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
module InstanceMethods
|
90
|
+
attr_accessor :arg_options
|
91
|
+
|
92
|
+
def parse_args(args)
|
93
|
+
raise Error, 'Expected only one argument' if args.count > 1
|
94
|
+
args = (args.first && args.first.last) ? args.first.last : ''
|
95
|
+
parsed_args = Hashie::Mash.new
|
96
|
+
args.split(PARAM_SEPARATOR).each do |pair|
|
97
|
+
arg, value = pair.split('=', 2)
|
98
|
+
parsed_args[arg] = value.blank? ? nil : value
|
99
|
+
end
|
100
|
+
|
101
|
+
return parsed_args
|
102
|
+
end
|
103
|
+
|
104
|
+
def verify_args(args)
|
105
|
+
return args unless self.arg_options
|
106
|
+
|
107
|
+
parsed_args = self.parse_args(args)
|
108
|
+
output = Hashie::Mash.new
|
109
|
+
self.arg_options.each do |arg_name, options|
|
110
|
+
# Extract Value if it's set, otherwise, use the default
|
111
|
+
if parsed_args[arg_name]
|
112
|
+
value = parsed_args[arg_name]
|
113
|
+
else
|
114
|
+
value = options[:default]
|
115
|
+
end
|
116
|
+
|
117
|
+
# Cast the argument to the proper type
|
118
|
+
if value.nil?
|
119
|
+
# Keep it as nil
|
120
|
+
elsif [Fixnum, Integer].include? options[:class]
|
121
|
+
value = value.to_i
|
122
|
+
elsif Float == options[:class]
|
123
|
+
value = value.to_f
|
124
|
+
elsif Symbol == options[:class]
|
125
|
+
value = value.to_sym
|
126
|
+
elsif Rational == options[:class]
|
127
|
+
value = value.to_r
|
128
|
+
elsif [String, nil].include? options[:class]
|
129
|
+
value = value.to_s
|
130
|
+
elsif Boolean == options[:class]
|
131
|
+
value = %w{ 1 true yes t }.include? value.to_s.downcase
|
132
|
+
else
|
133
|
+
raise UnsupportedTypeError, "Arguments of type #{options[:class]} are not supported"
|
134
|
+
end
|
135
|
+
|
136
|
+
# Set the output value
|
137
|
+
output[arg_name] = value
|
138
|
+
|
139
|
+
if options[:required] && output[arg_name].nil? && !Rake.application.options.dryrun
|
140
|
+
raise ValidationError, "Argument :#{arg_name} is required for Task #{self.name}"
|
141
|
+
end
|
142
|
+
end
|
143
|
+
return output
|
144
|
+
end
|
145
|
+
|
146
|
+
def verify_and_merge_args(args)
|
147
|
+
verified = verify_args(args)
|
148
|
+
return self.parse_args(args).merge(verified)
|
149
|
+
end
|
150
|
+
|
151
|
+
def arg_hash_to_str(hash)
|
152
|
+
args = ''
|
153
|
+
hash.each{ |k, v| args << "#{k}=#{v} " }
|
154
|
+
return args.strip
|
155
|
+
end
|
156
|
+
|
157
|
+
private
|
158
|
+
def extract_prerequisite_args(task_args, p)
|
159
|
+
merged_args = self.verify_and_merge_args(task_args)
|
160
|
+
if p.arg_options
|
161
|
+
prereq_args = Rake::TaskArguments.new(p.arg_names, [self.arg_hash_to_str(merged_args)])
|
162
|
+
p.verify_args(prereq_args)
|
163
|
+
else
|
164
|
+
prereq_args = task_args.new_scope(p.arg_names)
|
165
|
+
end
|
166
|
+
return prereq_args
|
167
|
+
end
|
168
|
+
|
169
|
+
def invoke_prerequisites(task_args, invocation_chain) # :nodoc:
|
170
|
+
if application.options.always_multitask
|
171
|
+
invoke_prerequisites_concurrently(task_args, invocation_chain)
|
172
|
+
else
|
173
|
+
prerequisite_tasks.each do |p|
|
174
|
+
merged_args = self.verify_and_merge_args(task_args)
|
175
|
+
p.invoke_with_call_chain(extract_prerequisite_args(task_args,p), invocation_chain)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def invoke_prerequisites_concurrently(task_args, invocation_chain)# :nodoc:
|
181
|
+
futures = prerequisite_tasks.map do |p|
|
182
|
+
merged_args = self.verify_and_merge_args(task_args)
|
183
|
+
application.thread_pool.future(p) do |r|
|
184
|
+
r.invoke_with_call_chain(extract_prerequisite_args(task_args,p), invocation_chain)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
futures.each { |f| f.value }
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
require_relative 'keyword_args/patches.rb'
|
196
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
class Boolean ; end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative 'task.rb'
|
2
|
+
|
3
|
+
require 'rake/opt/keyword_args'
|
4
|
+
|
5
|
+
module Rake::DSL
|
6
|
+
|
7
|
+
# Define a task with keyword args
|
8
|
+
def args(args_options)
|
9
|
+
# Set defaults
|
10
|
+
args_options.each do |arg, options|
|
11
|
+
raise ArgumentError, "No options set for argument #{arg}", caller[2..-1] unless options
|
12
|
+
options[:required] ||= options[:required].nil? && options[:default].nil?
|
13
|
+
end
|
14
|
+
Rake.application.last_args = args_options
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'rake/task'
|
2
|
+
|
3
|
+
class Rake::Task
|
4
|
+
include Rake::Opt::KeywordArgs
|
5
|
+
|
6
|
+
# Save the original invoke instance method
|
7
|
+
alias_method "__invoke_before_keyword_args__", "invoke"
|
8
|
+
|
9
|
+
def invoke (*args)
|
10
|
+
if self.arg_options && args.first.is_a?(Hash)
|
11
|
+
self.__invoke_before_keyword_args__(arg_hash_to_str(args.first))
|
12
|
+
else
|
13
|
+
self.__invoke_before_keyword_args__(*args)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Save the original execute instance method
|
18
|
+
alias_method "__execute_before_keyword_args__", "execute"
|
19
|
+
|
20
|
+
def execute (*args)
|
21
|
+
if self.arg_options && args.first.is_a?(Hash)
|
22
|
+
self.__execute_before_keyword_args__(Rake::TaskArguments.new(arg_names, [arg_hash_to_str(args.first)]))
|
23
|
+
else
|
24
|
+
self.__execute_before_keyword_args__(*args)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def invoke_prerequisites(task_args, invocation_chain) # :nodoc:
|
29
|
+
if application.options.always_multitask
|
30
|
+
invoke_prerequisites_concurrently(task_args, invocation_chain)
|
31
|
+
else
|
32
|
+
prerequisite_tasks.each do |p|
|
33
|
+
merged_args = self.verify_and_merge_args(task_args)
|
34
|
+
p.invoke_with_call_chain(extract_prerequisite_args(task_args,p), invocation_chain)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def invoke_prerequisites_concurrently(task_args, invocation_chain)# :nodoc:
|
40
|
+
futures = prerequisite_tasks.map do |p|
|
41
|
+
merged_args = self.verify_and_merge_args(task_args)
|
42
|
+
application.thread_pool.future(p) do |r|
|
43
|
+
r.invoke_with_call_chain(extract_prerequisite_args(task_args,p), invocation_chain)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
futures.each { |f| f.value }
|
47
|
+
end
|
48
|
+
|
49
|
+
class << self
|
50
|
+
# Save the original define_task module method
|
51
|
+
alias_method "__define_task_before_keyword_args__", "define_task"
|
52
|
+
def define_task(*args, &block)
|
53
|
+
if Rake.application.last_args
|
54
|
+
return define_parameterized_task(*args, &block)
|
55
|
+
else
|
56
|
+
return self.__define_task_before_keyword_args__(*args, &block)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
metadata
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rake-opt-keyword_args
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: !binary |-
|
5
|
+
MC4xLjA=
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jon San Miguel
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2016-05-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ! '>='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: !binary |-
|
21
|
+
MTAuMy4y
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ! '>='
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: !binary |-
|
29
|
+
MTAuMy4y
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: hashie
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ! '>='
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: !binary |-
|
37
|
+
Mi4xLjE=
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: !binary |-
|
45
|
+
Mi4xLjE=
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: activesupport
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: !binary |-
|
53
|
+
NC4xLjE=
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: !binary |-
|
61
|
+
NC4xLjE=
|
62
|
+
description: Adds keyword arg system to rake tasks
|
63
|
+
email: jon.sanmiguel@optimizely.com
|
64
|
+
executables: []
|
65
|
+
extensions: []
|
66
|
+
extra_rdoc_files: []
|
67
|
+
files:
|
68
|
+
- lib/rake/opt/keyword_args.rb
|
69
|
+
- lib/rake/opt/keyword_args/patches.rb
|
70
|
+
- lib/rake/opt/keyword_args/patches/boolean.rb
|
71
|
+
- lib/rake/opt/keyword_args/patches/rake/application.rb
|
72
|
+
- lib/rake/opt/keyword_args/patches/rake/dsl.rb
|
73
|
+
- lib/rake/opt/keyword_args/patches/rake/task.rb
|
74
|
+
homepage: http://rubygems.org/gems/rake-opt-keyword_args
|
75
|
+
licenses:
|
76
|
+
- Apache 2.0
|
77
|
+
metadata: {}
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options: []
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ! '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
requirements: []
|
93
|
+
rubyforge_project:
|
94
|
+
rubygems_version: 2.4.8
|
95
|
+
signing_key:
|
96
|
+
specification_version: 4
|
97
|
+
summary: Adds keyword arg system to rake tasks
|
98
|
+
test_files: []
|