atli 0.1.2 → 0.1.3

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,56 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ # Requirements
5
+ # =======================================================================
6
+
7
+ # Deps
8
+ # -----------------------------------------------------------------------
9
+ require 'nrser'
10
+
11
+
12
+ # Refinements
13
+ # =======================================================================
14
+
15
+ using NRSER
16
+ using NRSER::Types
17
+
18
+ # Declarations
19
+ # =======================================================================
20
+
21
+ module Thor::Base; end
22
+
23
+
24
+ # Definitions
25
+ # =======================================================================
26
+
27
+ # Mixin that provides "macros" for including common class options.
28
+ #
29
+ module Thor::Base::CommonClassOptions
30
+ @@messages = Concurrent::Hash.new
31
+
32
+ def self.define name, *args, &block
33
+ @@messages[name.to_sym] = \
34
+ NRSER::Message.new :class_option, name, *args, &block
35
+ end
36
+
37
+
38
+ define :backtrace,
39
+ desc: "Print stack traces with error messages",
40
+ type: :boolean
41
+
42
+
43
+ def common_class_options *names
44
+ messages = Hamster::Hash.new @@messages
45
+
46
+ names.map( &:to_sym ).each do |name|
47
+ unless messages.key? name
48
+ raise KeyError,
49
+ "No common class option named #{ name }"
50
+ end
51
+
52
+ messages[name].send_to self
53
+ end
54
+ end
55
+
56
+ end # module Thor::Base::CommonClassOptions
@@ -57,7 +57,15 @@ class Thor
57
57
  raise e
58
58
  end
59
59
  rescue Exception => error
60
- instance.send :on_run_error, error, self, args
60
+ # NOTE Need to use `#__send__` because the instance may define a
61
+ # command (method) `#send` - and one of the test fixtures **does**:
62
+ #
63
+ # //spec/fixtures/script.thor:100
64
+ #
65
+ # That's why the Thor code above uses `#__send__`, and we need to
66
+ # too.
67
+ #
68
+ instance.__send__ :on_run_error, error, self, args
61
69
 
62
70
  # We should not get here!!!
63
71
  # {Thor::Base#on_run_error} should exit or re-raise :(
@@ -29,4 +29,20 @@ class Thor
29
29
 
30
30
  class MalformattedArgumentError < InvocationError
31
31
  end
32
+
33
+ # Raised when a combination of conflicting arguments is provided.
34
+ #
35
+ # @todo
36
+ # It would be nice to parametrize this.
37
+ #
38
+ class ConflictingArgumentError < InvocationError
39
+ end
40
+
41
+ # Raised when an argument is not allowed.
42
+ #
43
+ # @todo
44
+ # It would be nice to parametrize this.
45
+ #
46
+ class ProhibitedArgumentError < InvocationError
47
+ end
32
48
  end
@@ -0,0 +1,276 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ # Requirements
5
+ # =======================================================================
6
+
7
+ # Stdlib
8
+ # -----------------------------------------------------------------------
9
+
10
+ # Deps
11
+ # -----------------------------------------------------------------------
12
+
13
+ # Project / Package
14
+ # -----------------------------------------------------------------------
15
+
16
+
17
+ # Refinements
18
+ # =======================================================================
19
+
20
+ using NRSER
21
+ using NRSER::Types
22
+
23
+
24
+ # Declarations
25
+ # =======================================================================
26
+
27
+
28
+ # Definitions
29
+ # =======================================================================
30
+
31
+
32
+ # An execution is an object created by {Thor::Base::ClassMethods#exec!} that
33
+ # holds references to all relevant objects for running a {Thor} instance as
34
+ # an executable and manages that execution.
35
+ #
36
+ class Thor::Execution
37
+
38
+ # Constants
39
+ # ======================================================================
40
+
41
+ BUILT_IN_ENV_PREFIXES = Hamster::Vector['ATLI', 'THOR']
42
+
43
+
44
+ # Mixins
45
+ # ============================================================================
46
+
47
+ include SemanticLogger::Loggable
48
+
49
+
50
+ # Attributes
51
+ # ======================================================================
52
+
53
+ # The {Thor} subclass that is being executed.
54
+ #
55
+ # @return [Class<Thor>]
56
+ #
57
+ attr_reader :thor_class
58
+
59
+
60
+ # The command line arguments given for execution.
61
+ #
62
+ # @return [Array<String>]
63
+ #
64
+ attr_reader :given_args
65
+
66
+
67
+ # The configuration hash, which includes any config values passed to
68
+ # {Thor::Base::ClassMethods#exec!}, and is mutated in {Thor::Base#initialize}
69
+ # to include things like the current command.
70
+ #
71
+ # @return [Hash]
72
+ #
73
+ attr_reader :thor_config
74
+
75
+
76
+ # The instance or {Thor} being executed, if it has been successfully
77
+ # constructed.
78
+ #
79
+ # @return [Class<Thor>?]
80
+ #
81
+ attr_reader :thor_instance
82
+
83
+
84
+ # Constructor
85
+ # ======================================================================
86
+
87
+ # Instantiate a new `Thor::Execution`.
88
+ def initialize thor_class:, given_args:, thor_config:
89
+ @thor_class = thor_class
90
+ @given_args = given_args.dup
91
+ @thor_config = thor_config
92
+ @thor_instance = nil
93
+ end # #initialize
94
+
95
+
96
+ # Instance Methods
97
+ # ======================================================================
98
+
99
+ # @todo Document env_prefixes method.
100
+ #
101
+ # @param [type] arg_name
102
+ # @todo Add name param description.
103
+ #
104
+ # @return [return_type]
105
+ # @todo Document return value.
106
+ #
107
+ def env_prefixes
108
+ BUILT_IN_ENV_PREFIXES
109
+ end # #env_prefixes
110
+
111
+
112
+
113
+ # @todo Document env_key method.
114
+ #
115
+ # @param [type] arg_name
116
+ # @todo Add name param description.
117
+ #
118
+ # @return [return_type]
119
+ # @todo Document return value.
120
+ #
121
+ def env_key_for prefix:, key:
122
+ "#{ prefix }_#{ key.upcase }"
123
+ end # #env_key
124
+
125
+
126
+ # @todo Document get_from_env method.
127
+ #
128
+ # @param key (see #get_context_value)
129
+ # @param with_source: (see #get_context_value)
130
+ #
131
+ # @return [String?]
132
+ # When +with_source:+ is +false+, just returns the value that was found,
133
+ # or +nil+ if none was.
134
+ #
135
+ # @return [Array<(nil, nil, nil)>]
136
+ # When +with_source:+ is +true+ and no value was found.
137
+ #
138
+ # @return [Array<(String, :env, String)>]
139
+ # When +with_source:+ is +true+ and the value was found.
140
+ #
141
+ # The first entry is the value, the last is the +ENV+ key it was at.
142
+ #
143
+ def get_from_env key, with_source: false
144
+ env_prefixes.each do |prefix|
145
+ env_key = env_key_for prefix: prefix, key: key
146
+ if ENV.key? env_key
147
+ if with_source
148
+ return [ENV[env_key], :env, env_key]
149
+ else
150
+ return ENV[env_key]
151
+ end
152
+ end
153
+ end
154
+
155
+ if with_source
156
+ [nil, nil, nil]
157
+ else
158
+ nil
159
+ end
160
+ end # #get_from_env
161
+
162
+
163
+ # Get the value for a key from the "context", which is the hierarchy of
164
+ # {Thor} instance class options, Thor config values and ENV variables.
165
+ #
166
+ # @param [Symbol] key
167
+ # The key to get the value for.
168
+ #
169
+ # @param [Boolean] with_source:
170
+ # When +true+, returns where the value was found as well (see below).
171
+ #
172
+ # @return [Object]
173
+ # When +with_source:+ is +false+, just returns the value that was found,
174
+ # or +nil+ if none was.
175
+ #
176
+ # @return [Array<(Object, Symbol?, (String | Symbol)?>)]
177
+ # When +with_source:+ is +true+ returns an Array triple:
178
+ #
179
+ # 1. The value that was found, or `nil` if none was.
180
+ #
181
+ # 2. A symbol indicating where the value was found:
182
+ # 1. +:thor_instance_options+ The `#options` hash of the
183
+ # {#thor_instance}. You will only see this result if the Thor
184
+ # instance successfully constructed and became available to the
185
+ # execution.
186
+ # 2. +:thor_config+ The {#thor_config} hash.
187
+ # 3. +:env+ The +ENV+.
188
+ #
189
+ # If the value isn't found, this will be +nil+.
190
+ #
191
+ # 3. The key used to get the value from the source hash-like. This is only
192
+ # really important when it came from the +ENV+.
193
+ #
194
+ # If the value is not found, this will be +nil+.
195
+ #
196
+ def get_context_value key, with_source: false
197
+ # 1. First stop is the Thor instance's options (if we have a Thor instance)
198
+ if thor_instance && thor_instance.options.key?( key )
199
+ if with_source
200
+ return [thor_instance.options[key], :thor_instance_options, key]
201
+ else
202
+ return thor_instance.options[key]
203
+ end
204
+ end
205
+
206
+ # 2. Next, check the config that was handed to `.exec!`
207
+ if thor_config.key? key
208
+ if with_source
209
+ return [thor_config[key], :thor_config, key]
210
+ else
211
+ return thor_config[key]
212
+ end
213
+ end
214
+
215
+ # 3. Last, check the ENV (returns `nil` if nothing found)
216
+ get_from_env key, with_source: with_source
217
+ end # #get_context_value
218
+
219
+
220
+ # Are we in debug mode?
221
+ def debug?
222
+ get_context_value( :debug ).truthy?
223
+ end
224
+
225
+
226
+ # Should we print backtraces with errors?
227
+ def backtrace?
228
+ debug? || get_context_value( :backtrace ).truthy?
229
+ end
230
+
231
+
232
+ # Should we raise errors (versus print them and exit)?
233
+ def raise_errors?
234
+ debug? || get_context_value( :raise_errors ).truthy?
235
+ end
236
+
237
+
238
+ # Let's do this thang!
239
+ def exec!
240
+ thor_config[:shell] ||= Thor::Base.shell.new
241
+
242
+ thor_class.send(
243
+ :dispatch,
244
+ nil,
245
+ given_args,
246
+ nil,
247
+ thor_config
248
+ ) { |thor_instance|
249
+ @thor_instance = thor_instance
250
+
251
+ logger.debug "Got Thor instance",
252
+ options: thor_instance.options
253
+ }
254
+ rescue SystemExit
255
+ # `exit` was called; we want to just let this keep going
256
+ raise
257
+ rescue Errno::EPIPE
258
+ # This happens if a thor command is piped to something like `head`,
259
+ # which closes the pipe when it's done reading. This will also
260
+ # mean that if the pipe is closed, further unnecessary
261
+ # computation will not occur.
262
+ exit true
263
+ rescue Exception => error
264
+ raise if raise_errors?
265
+
266
+ if backtrace?
267
+ logger.error error
268
+ else
269
+ logger.error error.message
270
+ end
271
+
272
+ exit false
273
+ end # #start
274
+
275
+
276
+ end # class Thor::Execution
@@ -1,11 +1,20 @@
1
+ require 'pathname'
2
+
1
3
  class Thor
4
+ # Absolute, expanded path to the gem's root directory.
5
+ #
6
+ # @return [Pathname]
7
+ #
8
+ ROOT = Pathname.new( __dir__ ).join( '..', '..' ).expand_path
9
+
10
+
2
11
  # Gem version string.
3
12
  #
4
13
  # See {file:doc/files/notes/versioning.md} for details.
5
14
  #
6
15
  # @return [String]
7
16
  #
8
- VERSION = "0.1.2"
17
+ VERSION = '0.1.3'
9
18
 
10
19
 
11
20
  # The version of Thor that Atli is up to date with.
@@ -18,5 +27,5 @@ class Thor
18
27
  #
19
28
  # @return [String]
20
29
  #
21
- THOR_VERSION = '0.20.0'
30
+ THOR_VERSION = '0.1.3'
22
31
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: atli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Neil Souza (Atli)
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2018-02-24 00:00:00.000000000 Z
13
+ date: 2018-02-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -32,14 +32,42 @@ dependencies:
32
32
  requirements:
33
33
  - - ">="
34
34
  - !ruby/object:Gem::Version
35
- version: 0.2.0.pre.1
35
+ version: 0.2.0.pre.2
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: 0.2.0.pre.1
42
+ version: 0.2.0.pre.2
43
+ - !ruby/object:Gem::Dependency
44
+ name: yard
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: 0.9.12
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: 0.9.12
57
+ - !ruby/object:Gem::Dependency
58
+ name: redcarpet
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '3.4'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '3.4'
43
71
  description: Atli is a fork of Thor that's better or worse.
44
72
  email: neil@atli.nrser.com
45
73
  executables:
@@ -63,11 +91,13 @@ files:
63
91
  - lib/thor/actions/file_manipulation.rb
64
92
  - lib/thor/actions/inject_into_file.rb
65
93
  - lib/thor/base.rb
94
+ - lib/thor/base/common_class_options.rb
66
95
  - lib/thor/command.rb
67
96
  - lib/thor/core_ext/hash_with_indifferent_access.rb
68
97
  - lib/thor/core_ext/io_binary_read.rb
69
98
  - lib/thor/core_ext/ordered_hash.rb
70
99
  - lib/thor/error.rb
100
+ - lib/thor/execution.rb
71
101
  - lib/thor/group.rb
72
102
  - lib/thor/invocation.rb
73
103
  - lib/thor/line_editor.rb
@@ -107,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
137
  version: 1.3.5
108
138
  requirements: []
109
139
  rubyforge_project:
110
- rubygems_version: 2.5.2
140
+ rubygems_version: 2.5.2.2
111
141
  signing_key:
112
142
  specification_version: 4
113
143
  summary: Atli is a fork of Thor that's better or worse.