squared 0.0.10 → 0.0.12

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.
@@ -12,26 +12,27 @@ module Squared
12
12
 
13
13
  class << self
14
14
  def populate(*); end
15
+ def batchargs(*); end
15
16
 
16
17
  def tasks
17
- nil
18
+ %i[outdated].freeze
19
+ end
20
+
21
+ def bannerargs
22
+ %i[dependfile].freeze
18
23
  end
19
24
 
20
25
  def venv?
21
26
  Dir.exist?(ENV.fetch('VIRTUAL_ENV', ''))
22
27
  end
23
28
 
24
- def is_a?(val)
25
- if (val = as_path(val))
26
- REQUIREMENTS.any? { |file| val.join(file).exist? }
27
- else
28
- super
29
- end
29
+ def config?(val)
30
+ return false unless (val = as_path(val))
31
+
32
+ REQUIREMENTS.any? { |file| val.join(file).exist? }
30
33
  end
31
34
  end
32
35
 
33
- attr_reader :requirements
34
-
35
36
  def initialize(*, **kwargs)
36
37
  super
37
38
  if @pass.include?(Python.ref)
@@ -41,12 +42,12 @@ module Squared
41
42
  initialize_build(Python.ref, **kwargs)
42
43
  initialize_env(**kwargs)
43
44
  end
44
- @reqindex = REQUIREMENTS.index { |file| base_path(file).exist? } || 0
45
- @requirements = base_path(REQUIREMENTS[@reqindex])
45
+ @dependindex = REQUIREMENTS.index { |file| basepath(file).exist? }
46
+ @dependfile = basepath(REQUIREMENTS[@dependindex || 0])
46
47
  end
47
48
 
48
49
  @@tasks[ref] = {
49
- install: %i[user target upgrade force]
50
+ install: %i[user target upgrade force].freeze
50
51
  }.freeze
51
52
 
52
53
  def ref
@@ -74,11 +75,12 @@ module Squared
74
75
  else
75
76
  OPT_USER
76
77
  end
77
- desc format_desc(action, flag, list + OPT_GENERAL, req: req)
78
+ list += OPT_GENERAL
79
+ desc format_desc(action, flag, list, req: req)
78
80
  if flag == :target
79
81
  task flag, [:dir, :opts] do |_, args|
80
- guard_params(action, flag, args: args, key: :dir)
81
- depend(flag, dir: args.dir, opts: args.to_a)
82
+ dir = guard_params(action, flag, args: args, key: :dir)
83
+ depend(flag, dir: dir, opts: args.to_a[1..-1] || [])
82
84
  end
83
85
  else
84
86
  task flag do |_, args|
@@ -92,12 +94,11 @@ module Squared
92
94
  end
93
95
  end
94
96
 
95
- def depend(flag = nil, dir: nil, opts: [])
97
+ def depend(flag = nil, dir: nil, opts: [], sync: invoked_sync?('depend', flag))
96
98
  if @depend && !flag
97
99
  super
98
100
  elsif outdated?
99
- sync = invoked_sync?('depend', flag)
100
- case (type = install_type)
101
+ case (type = dependtype)
101
102
  when 1, 2
102
103
  cmd = pip_session 'install'
103
104
  case flag
@@ -105,7 +106,7 @@ module Squared
105
106
  cmd << '--user'
106
107
  append_pip opts, OPT_USER
107
108
  when :target
108
- cmd << "--target=#{shell_escape(base_path(dir).to_s, quote: true)}"
109
+ cmd << "--target=#{shell_escape(basepath(dir), quote: true)}"
109
110
  append_pip opts, OPT_USER + ['upgrade']
110
111
  append_eager opts
111
112
  when :upgrade
@@ -129,17 +130,13 @@ module Squared
129
130
  run
130
131
  end
131
132
 
132
- def install_type(*)
133
- requirements.exist? ? @reqindex + 1 : 0
134
- end
135
-
136
133
  def variable_set(key, *val, **)
137
134
  case key
138
- when :requirements
139
- req = base_path(val.first)
135
+ when :dependfile
136
+ req = basepath(*val)
140
137
  if (index = REQUIREMENTS.index(req.basename.to_s))
141
- @reqindex = index
142
- @requirements = req
138
+ @dependindex = index
139
+ @dependfile = req
143
140
  else
144
141
  log.warn "variable_set: @#{key}=#{req} (not supported)"
145
142
  end
@@ -148,8 +145,12 @@ module Squared
148
145
  end
149
146
  end
150
147
 
148
+ def depend?
149
+ @depend != false && (!@depend.nil? || outdated?)
150
+ end
151
+
151
152
  def outdated?
152
- install_type > 0
153
+ dependtype > 0
153
154
  end
154
155
 
155
156
  private
@@ -169,21 +170,23 @@ module Squared
169
170
  (v ? "-#{v[0]}" : "--#{opt}")
170
171
  end
171
172
  end
172
- @session << '--user' if env('PIP_USER')
173
- @session << '--no-input' if env('PIP_NO_INPUT')
174
- if (val = env('PIP_PROXY'))
173
+ @session << '--user' if option('user')
174
+ @session << '--no-input' if option('no-input')
175
+ if (val = option('proxy', ignore: false))
175
176
  @session << "--proxy=#{shell_escape(val, quote: true)}"
176
177
  end
177
- if (val = env('PIP_LOG'))
178
- @session << "--log=#{shell_escape(base_path(val).to_s, quote: true)}"
178
+ if (val = option('log', ignore: false))
179
+ @session << "--log=#{shell_escape(basepath(val), quote: true)}"
179
180
  end
180
- append_nocolor
181
+ append_nocolor option('no-color')
181
182
  end
182
183
 
183
184
  def append_eager(opts)
184
185
  @session << '--upgrade-strategy=eager' if opts.include?('eager')
185
186
  end
186
187
  end
188
+
189
+ Application.implement Python
187
190
  end
188
191
  end
189
192
  end
@@ -14,32 +14,33 @@ module Squared
14
14
 
15
15
  class << self
16
16
  def populate(*); end
17
+ def batchargs(*); end
17
18
 
18
19
  def tasks
19
- nil
20
+ %i[outdated].freeze
20
21
  end
21
22
 
22
- def is_a?(val)
23
- if (val = as_path(val))
24
- RUBY_DIR.any? { |file| val.join(file).exist? }
25
- else
26
- super
27
- end
23
+ def bannerargs
24
+ %i[dependfile].freeze
25
+ end
26
+
27
+ def config?(val)
28
+ return false unless (val = as_path(val))
29
+
30
+ RUBY_DIR.any? { |file| val.join(file).exist? }
28
31
  end
29
32
  end
30
33
 
31
34
  @@tasks[ref] = {
32
- install: %i[redownload local prefer-local gem with without],
33
- update: %i[all patch minor major],
34
- outdated: %i[patch minor major],
35
- pristine: %i[gem all version],
35
+ install: %i[redownload local prefer-local gem with without].freeze,
36
+ update: %i[all patch minor major].freeze,
37
+ outdated: %i[patch minor major].freeze,
38
+ pristine: %i[gem all version].freeze,
36
39
  exec: nil,
37
40
  config: nil,
38
41
  rake: nil
39
42
  }.freeze
40
43
 
41
- attr_reader :gemfile
42
-
43
44
  def initialize(*, version: nil, autodetect: false, **kwargs)
44
45
  super
45
46
  if @pass.include?(Ruby.ref)
@@ -51,8 +52,8 @@ module Squared
51
52
  end
52
53
  @version = env('BUILD', version, suffix: 'VERSION')
53
54
  @autodetect = autodetect
54
- index = GEMFILE.index { |file| base_path(file).exist? } || 0
55
- @gemfile = base_path(GEMFILE[index])
55
+ @dependindex = GEMFILE.index { |file| basepath(file).exist? }
56
+ @dependfile = basepath(GEMFILE[@dependindex || 0])
56
57
  return if !@output[0].nil? || !@copy.nil? || @version || @autodetect || (file = rakefile).nil?
57
58
 
58
59
  begin
@@ -89,9 +90,25 @@ module Squared
89
90
  when :rake
90
91
  next unless rakefile
91
92
 
92
- desc format_desc(action, nil, 'command*')
93
+ desc format_desc(action, nil, 'command*|^index,args*|#,pattern*')
93
94
  task action, [:command] do |_, args|
94
- rake(*args.to_a)
95
+ if args.command == '#'
96
+ format_list(read_rakefile, 'rake[^N]', 'tasks', grep: args.extras, from: rakefile.to_s,
97
+ each: ->(val) { val[0] + val[1].to_s })
98
+ elsif (data = indexdata(args.command))
99
+ n, opts = data
100
+ list = read_rakefile
101
+ if (item = list[n - 1])
102
+ cmd = opts ? "#{opts} #{item.first}" : item.first
103
+ elsif exception
104
+ indexerror n, list
105
+ else
106
+ next log.warn "rake task #{n} of #{list.size} (out of range)"
107
+ end
108
+ rake(args.extras.empty? ? cmd : "#{cmd}[#{args.extras.join(',')}]")
109
+ else
110
+ rake(*args.to_a)
111
+ end
95
112
  end
96
113
  end
97
114
  else
@@ -103,16 +120,14 @@ module Squared
103
120
  when :gem
104
121
  desc format_desc(action, flag, 'name+')
105
122
  task flag, [:name] do |_, args|
106
- name = args.to_a
107
- guard_params(action, flag, args: name)
108
- depend(flag, opts: name)
123
+ opts = guard_params(action, flag, args: args.to_a)
124
+ depend(flag, opts: opts)
109
125
  end
110
126
  when :with, :without
111
127
  desc format_desc(action, flag, 'group+')
112
128
  task flag, [:group] do |_, args|
113
- group = args.to_a
114
- guard_params(action, flag, args: group)
115
- depend(flag, opts: group)
129
+ opts = guard_params(action, flag, args: args.to_a)
130
+ depend(flag, opts: opts)
116
131
  end
117
132
  else
118
133
  desc format_desc(action, flag, OPT_INSTALL)
@@ -130,9 +145,8 @@ module Squared
130
145
  when :gem
131
146
  desc format_desc(action, flag, 'name+')
132
147
  task flag, [:name] do |_, args|
133
- name = args.to_a
134
- guard_params(action, flag, args: name)
135
- pristine(flag, opts: name)
148
+ opts = guard_params(action, flag, args: args.to_a)
149
+ pristine(flag, opts: opts)
136
150
  end
137
151
  when :all
138
152
  desc format_desc(action, flag, 'skip*')
@@ -142,8 +156,8 @@ module Squared
142
156
  when :version
143
157
  desc format_desc(action, flag, 'version?')
144
158
  task flag, [:version] do |_, args|
145
- guard_params(action, flag, args: args, key: :version)
146
- pristine(flag, version: args.version)
159
+ version = guard_params(action, flag, args: args, key: :version)
160
+ pristine(flag, version: version)
147
161
  end
148
162
  end
149
163
  end
@@ -154,7 +168,7 @@ module Squared
154
168
  end
155
169
  end
156
170
 
157
- def depend(flag = nil, opts: [])
171
+ def depend(flag = nil, opts: [], sync: invoked_sync?('depend', flag))
158
172
  if @depend && !flag
159
173
  super
160
174
  elsif outdated?
@@ -167,7 +181,7 @@ module Squared
167
181
  append_repeat flag, opts
168
182
  when :redownload, :local, :'prefer-local'
169
183
  cmd = bundle_session 'install', "--#{flag}"
170
- if (val = env('BUNDLE_TRUST_POLICY'))
184
+ if (val = option('trust-policy', ignore: false))
171
185
  cmd << "--trust-policy=#{case val
172
186
  when '0'
173
187
  'NoSecurity'
@@ -188,28 +202,28 @@ module Squared
188
202
  bundle_session 'install'
189
203
  append_bundle
190
204
  end
191
- run_rb(sync: invoked_sync?('depend', flag))
205
+ run_rb(sync: sync)
192
206
  end
193
207
  end
194
208
 
195
- def copy(from: 'lib', glob: '**/*', gemdir: @gemdir, override: false)
209
+ def copy(from: 'lib', glob: nil, into: @gemdir, override: false)
196
210
  if @copy && !override
197
211
  return super if runnable?(@copy)
198
212
 
199
213
  from = @copy[:from] if @copy.key?(:from)
200
214
  glob = @copy[:glob] if @copy.key?(:glob)
201
- gemdir = @copy[:gemdir] if @copy.key?(:gemdir)
215
+ into = @copy[:into] if @copy.key?(:into)
202
216
  end
203
- return unless gemdir
217
+ return unless into
204
218
 
205
- dest = Pathname.new(gemdir).realpath
219
+ dest = Pathname.new(into).realpath
206
220
  print_item unless @output[0]
207
- glob = as_a(glob)
221
+ glob = as_a(glob || '**/*')
208
222
  as_a(from).each_with_index do |val, i|
209
- a = base_path(val)
223
+ a = basepath(val)
210
224
  b = dest.join(val)
211
- c = glob[i] || '**/*'
212
- log.warn "cp #{a.join(c)} #{b}"
225
+ c = glob[i] || glob[0]
226
+ log.info "cp #{a.join(c)} #{b}"
213
227
  copy_d(a, b, glob: c, verbose: verbose)
214
228
  end
215
229
  end
@@ -217,7 +231,7 @@ module Squared
217
231
  def outdated(rev = nil, opts: [])
218
232
  cmd = bundle_session 'outdated', rev && "--#{rev}"
219
233
  append_bundle opts, OPT_OUTDATED
220
- cmd = close_session(cmd)
234
+ cmd = session_done(cmd)
221
235
  log.info cmd
222
236
  banner = format_banner(cmd)
223
237
  if invoked_sync?('outdated', rev)
@@ -232,31 +246,32 @@ module Squared
232
246
  if start > 0
233
247
  unless stdin?
234
248
  data = line.scan(SEM_VER)
235
- cur = data.shift
236
- lat = data.shift
237
- if cur && lat
238
- semver(cur)
239
- semver(lat)
240
- c = cur.join
241
- l = lat.join
242
- styles = []
249
+ next unless (cur = data.shift) && (lat = data.shift)
250
+
251
+ semver(cur)
252
+ semver(lat)
253
+ c = cur.join
254
+ l = lat.join
255
+ styles = []
256
+ major_set = lambda do
257
+ styles = %i[green bold]
258
+ major += 1
259
+ end
260
+ minor_set = -> { styles[0] = cur[2] == lat[2] ? :yellow : :green }
261
+ if data.empty?
262
+ semmajor?(cur, lat) ? major_set.() : minor_set.()
263
+ else
243
264
  data.each do |val|
244
265
  break unless (req = /(>=?|=|~>|!=|<=?) (#{Regexp.escape(val.join)})/.match(line))
245
266
 
246
267
  v = semver(val).join
247
268
  case req[1]
248
269
  when '>', '>='
249
- if semmajor(cur, lat)
250
- styles = %i[green bold]
251
- major += 1
252
- else
253
- styles[0] = cur[2] == lat[2] ? :yellow : :green
254
- end
270
+ semmajor?(cur, lat) ? major_set.() : minor_set.()
255
271
  when '<', '<='
256
272
  if c <= v
257
- if semmajor(cur, lat)
258
- styles = %i[green bold]
259
- major += 1
273
+ if semmajor?(cur, lat)
274
+ major_set.()
260
275
  else
261
276
  styles[0] = :yellow
262
277
  end
@@ -268,29 +283,29 @@ module Squared
268
283
  styles[1] = :bold
269
284
  end
270
285
  when '~>'
271
- if c < v && cur[0] == val[0] && !semmajor(cur, val)
286
+ if c < v && cur[0] == val[0] && !semmajor?(cur, val)
272
287
  styles[0] = :yellow
273
- elsif semmajor(val, lat)
288
+ elsif semmajor?(val, lat)
274
289
  styles[1] = :underline
275
290
  else
276
291
  styles[1] = :bold
277
292
  end
278
293
  end
279
294
  end
280
- unless styles.empty?
281
- case styles[0]
282
- when :green
283
- line = sub_style(line, pat: /^(\S+)(.+)$/, styles: theme[styles[1] == :bold ? :major : :active])
284
- found += 1
285
- when :yellow
286
- found += 1
287
- end
288
- styles = styles.compact
289
- .map { |s| s == :green || s == :yellow ? color(s) : s }
290
- .flatten
291
- line = sub_style(line, pat: /^((?:\S+\s+){2})(#{Regexp.escape(l)})(.+)$/, styles: styles,
292
- index: 2)
295
+ end
296
+ unless styles.empty?
297
+ case styles[0]
298
+ when :green
299
+ line = sub_style(line, pat: /^(\S+)(.+)$/, styles: theme[styles[1] == :bold ? :major : :active])
300
+ found += 1
301
+ when :yellow
302
+ found += 1
293
303
  end
304
+ styles = styles.compact
305
+ .map { |s| s == :green || s == :yellow ? color(s) : s }
306
+ .flatten
307
+ line = sub_style(line, pat: /^((?:\S+\s+){2})(#{Regexp.escape(l)})(.*)$/, styles: styles,
308
+ index: 2)
294
309
  end
295
310
  end
296
311
  puts "#{start.to_s.rjust(2)}. #{line}"
@@ -298,16 +313,24 @@ module Squared
298
313
  elsif line =~ /^Gem /
299
314
  print_item banner if banner
300
315
  unless stdin?
301
- puts print_footer(" # #{line.chomp}", reverse: true, sub: [
302
- { pat: /^(.+)(Gem)(.+)$/, styles: theme[:header], index: 2 },
303
- { pat: /^(.+)(Latest)(.+)$/, styles: theme[:header], index: 2 }
304
- ])
316
+ sub = { pat: /^(.+)(?<!\dm)(Gem|Latest)(.+)$/, styles: theme[:header], index: 2 }
317
+ puts print_footer(" # #{line.chomp}", reverse: true, sub: [sub, sub])
305
318
  end
306
319
  start += 1
307
320
  end
308
321
  end
309
322
  if found > 0
310
- puts print_footer(empty_status('Updates are available', 'major', major, always: true))
323
+ begin
324
+ if major == 0 && (data = /\b(?:source\s+(["'])(.+?)\1|remote:\s+(\S+))/.match(dependfile.read))
325
+ status = (data[2] || data[3]).chomp('/')
326
+ right = true
327
+ end
328
+ rescue StandardError => e
329
+ log.debug e
330
+ ensure
331
+ status ||= 'Updates are available'
332
+ end
333
+ puts print_footer(empty_status(status, 'major', major, always: !right), right: right)
311
334
  elsif start == 0
312
335
  puts 'No updates were found'
313
336
  end
@@ -340,30 +363,19 @@ module Squared
340
363
  end
341
364
 
342
365
  def rake(*cmd)
343
- run_s(cmd.empty? ? 'rake' : cmd.map { |val| "rake #{val}" })
344
- end
345
-
346
- def rakefile
347
- file = ::Rake::Application::DEFAULT_RAKEFILES.find { |val| base_path(val).exist? }
348
- base_path(file) if file
349
- end
350
-
351
- def variable_set(key, *val, **)
352
- case key
353
- when :gemfile
354
- @gemfile = base_path(val.first)
366
+ if cmd.empty?
367
+ run_s 'rake'
355
368
  else
356
- super
369
+ run_s(*cmd.map { |val| "rake #{val}" }, banner: false)
357
370
  end
358
371
  end
359
372
 
360
- def variable_all
361
- ret = super + VAR_SET
362
- ret.freeze
373
+ def depend?
374
+ @depend != false && (!@depend.nil? || outdated?)
363
375
  end
364
376
 
365
377
  def copy?
366
- return true if super || (@copy.is_a?(::Hash) && copy.fetch(:gemdir, nil))
378
+ return true if super || (@copy.is_a?(::Hash) && copy.fetch(:into, nil))
367
379
  return gemdir? if @gemdir
368
380
 
369
381
  if @version && (val = ENV['GEM_HOME'])
@@ -397,17 +409,22 @@ module Squared
397
409
  end
398
410
 
399
411
  def outdated?
400
- gemfile.exist?
412
+ dependtype > 0
401
413
  end
402
414
 
403
415
  private
404
416
 
417
+ def variables
418
+ ret = super + VAR_SET
419
+ ret.freeze
420
+ end
421
+
405
422
  def run_rb(sync: true)
406
423
  run(sync: sync, banner: !@session.include?('--quiet'))
407
424
  end
408
425
 
409
426
  def append_bundle(opts = nil, list = nil)
410
- if (val = env('BUNDLE_JOBS')).to_i > 0
427
+ if (val = option('jobs')).to_i > 0
411
428
  @session << "-j#{val}"
412
429
  end
413
430
  return unless opts && list
@@ -423,16 +440,34 @@ module Squared
423
440
 
424
441
  def gem_session(*cmd)
425
442
  ret = session('gem', *cmd)
426
- if (val = env('GEM_CONFIG_FILE'))
427
- ret << "--config-file=#{shell_escape(base_path(val).to_s, quote: true)}"
443
+ if (val = option('config-file', ignore: false))
444
+ ret << "--config-file=#{shell_escape(basepath(val), quote: true)}"
428
445
  end
429
- ret << '--norc' if env('GEM_NORC')
446
+ ret << '--norc' if option('norc')
430
447
  ret
431
448
  end
432
449
 
433
450
  def bundle_session(*cmd)
434
451
  session('bundle', *cmd)
435
- append_nocolor
452
+ append_nocolor option('no-color')
453
+ @session
454
+ end
455
+
456
+ def read_rakefile
457
+ return @rakelist if @rakelist
458
+
459
+ ret = []
460
+ IO.popen("rake -C #{shell_quote(path)} -AT").each do |line|
461
+ next unless (data = /^rake ((?:[^\[: ]+:?)+)(\[[^\]]+\])?/.match(line))
462
+
463
+ ret << [data[1], data[2]]
464
+ end
465
+ @rakelist = ret
466
+ end
467
+
468
+ def rakefile
469
+ file = ::Rake::Application::DEFAULT_RAKEFILES.find { |val| basepath(val).exist? }
470
+ basepath(file) if file
436
471
  end
437
472
 
438
473
  def gempath
@@ -443,6 +478,8 @@ module Squared
443
478
  @gemdir.exist? && !@gemdir.empty?
444
479
  end
445
480
  end
481
+
482
+ Application.implement Ruby
446
483
  end
447
484
  end
448
485
  end
@@ -18,6 +18,3 @@ end
18
18
 
19
19
  require_relative 'project/base'
20
20
  require_relative 'project/git'
21
- require_relative 'project/node'
22
- require_relative 'project/python'
23
- require_relative 'project/ruby'