rake-opt-keyword_args 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,4 @@
1
+ require_relative 'patches/boolean.rb'
2
+ require_relative 'patches/rake/application.rb'
3
+ require_relative 'patches/rake/dsl.rb'
4
+ require_relative 'patches/rake/task.rb'
@@ -0,0 +1 @@
1
+ class Boolean ; end
@@ -0,0 +1,6 @@
1
+ require 'rake/application'
2
+
3
+ class Rake::Application
4
+ attr_accessor :last_args
5
+ attr_accessor :current_task
6
+ 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: []