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.
@@ -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: []