squared 0.5.3 → 0.5.5

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.
@@ -98,7 +98,7 @@ module Squared
98
98
  'pack' => nil
99
99
  })
100
100
 
101
- def initialize(*, **kwargs)
101
+ def initialize(*, init: nil, asdf: 'nodejs', **kwargs)
102
102
  super
103
103
  if @pass.include?(Node.ref)
104
104
  initialize_ref Node.ref
@@ -108,7 +108,7 @@ module Squared
108
108
  initialize_env(**kwargs)
109
109
  end
110
110
  @dependfile = @path + 'package.json'
111
- @pm = {}
111
+ @pm = { __: init }
112
112
  end
113
113
 
114
114
  def ref
@@ -117,7 +117,7 @@ module Squared
117
117
 
118
118
  def populate(*, **)
119
119
  super
120
- return unless outdated? && ref?(Node.ref)
120
+ return unless (outdated? && ref?(Node.ref)) || @only
121
121
 
122
122
  namespace name do
123
123
  Node.subtasks do |action, flags|
@@ -129,10 +129,7 @@ module Squared
129
129
  format_desc action, nil, 'save?=prod|dev|optional|peer,name+'
130
130
  task action, [:save] do |_, args|
131
131
  save = param_guard(action, 'save', args: args, key: :save)
132
- if save.start_with?('=')
133
- exact = true
134
- save = save[1..-1]
135
- end
132
+ exact = true if save.delete_prefix!('=')
136
133
  case save
137
134
  when 'prod', 'dev', 'optional', 'peer'
138
135
  packages = args.extras
@@ -144,12 +141,12 @@ module Squared
144
141
  depend(:add, packages: packages, save: save, exact: exact)
145
142
  end
146
143
  when 'run'
147
- next if (list = read_scripts).empty?
144
+ next if scripts.empty?
148
145
 
149
146
  format_desc action, nil, "script,opts*|#{indexchar}index+|#,pattern*"
150
147
  task action, [:script] do |_, args|
151
148
  if args.script == '#'
152
- format_list(list, "run[#{indexchar}N]", 'scripts', grep: args.extras, from: dependfile)
149
+ format_list(scripts.to_a, "run[#{indexchar}N]", 'scripts', grep: args.extras, from: dependfile)
153
150
  else
154
151
  args = param_guard(action, 'script', args: args.to_a)
155
152
  opts = []
@@ -441,7 +438,19 @@ module Squared
441
438
  workspace.rev_clear(name, sync: sync)
442
439
  return update if !flag && env('NODE_UPDATE')
443
440
 
444
- if (yarn = dependtype(:yarn)) > 0
441
+ pnpm = pnpm?
442
+ yarn = pnpm ? 0 : dependtype(:yarn)
443
+ if @pm[:__] && !pnpm && yarn == 0
444
+ case @pm[:__]
445
+ when 'pnpm'
446
+ pnpm = true
447
+ when 'yarn'
448
+ yarn = 1
449
+ when 'berry'
450
+ yarn = 2
451
+ end
452
+ end
453
+ if yarn > 0
445
454
  cmd = session 'yarn'
446
455
  if flag == :add
447
456
  cmd << 'add'
@@ -451,7 +460,7 @@ module Squared
451
460
  cmd << 'install'
452
461
  cmd << '--ignore-engines' if yarn == 1 && !option('ignore-engines', equals: '0')
453
462
  end
454
- elsif pnpm?
463
+ elsif pnpm
455
464
  cmd = session 'pnpm'
456
465
  if flag == :add
457
466
  cmd << 'add' << "--save-#{save}"
@@ -496,7 +505,7 @@ module Squared
496
505
  banner = format_banner(cmd.temp(dryrun ? '--dry-run' : nil))
497
506
  print_item banner if sync
498
507
  begin
499
- data = pwd_set { `#{cmd.temp('--json', '--loglevel=error')}` }
508
+ data = pwd_set(dryrun: dryrun) { `#{cmd.temp('--json', '--loglevel=error')}` }
500
509
  doc = dependfile.read
501
510
  json = JSON.parse(doc)
502
511
  rescue StandardError => e
@@ -660,7 +669,7 @@ module Squared
660
669
  cmd << basic_option('otp', otp) if otp ||= option('otp')
661
670
  cmd << basic_option('tag', tag) if tag ||= option('tag')
662
671
  cmd << basic_option('access', access) if access ||= option('access')
663
- dryrun = dryrun?('npm') if dryrun.nil?
672
+ dryrun ||= dryrun?('npm')
664
673
  if dryrun
665
674
  cmd << '--dry-run'
666
675
  else
@@ -671,7 +680,7 @@ module Squared
671
680
  run(from: from, sync: sync, interactive: !dryrun && "Publish #{sub_style(npmname, styles: theme[:active])}")
672
681
  else
673
682
  on :first, from
674
- pwd_set(from: from) do
683
+ pwd_set(from: from, dryrun: dryrun) do
675
684
  require 'open3'
676
685
  banner = format_banner cmd.to_s
677
686
  Open3.popen2e(cmd.done) do |_, out|
@@ -748,21 +757,23 @@ module Squared
748
757
  when :major
749
758
  if seg[0] != '0' || seg[2].nil?
750
759
  seg[0] = seg[0].succ
760
+ seg[2] = '0'
751
761
  else
752
762
  seg[2] = seg[2].succ
753
763
  end
764
+ seg[4] = '0'
754
765
  when :minor
755
766
  if seg[0] == '0'
756
767
  seg[4] &&= seg[4].succ
757
768
  else
758
769
  seg[2] = seg[2].succ
759
770
  end
771
+ seg[4] = '0'
760
772
  when :patch
761
773
  seg[4] &&= seg[4].succ
762
774
  end
763
775
  return if (val = seg.join) == cur
764
776
  end
765
-
766
777
  begin
767
778
  doc = dependfile.read
768
779
  if doc.sub!(/"version"\s*:\s*"#{cur}"/, "\"version\": \"#{val}\"")
@@ -771,15 +782,15 @@ module Squared
771
782
  log.info "bump version #{cur} to #{val} (#{flag})"
772
783
  on :first, :bump
773
784
  end
774
- if verbose
785
+ if stdin?
786
+ puts val
787
+ elsif verbose
775
788
  major = flag == :major
776
789
  emphasize("version: #{val}", title: name, border: borderstyle, sub: [
777
790
  headerstyle,
778
791
  { pat: /\A(version:)( )(\S+)(.*)\z/, styles: color(major ? :green : :yellow), index: 3 },
779
792
  { pat: /\A(version:)(.*)\z/, styles: theme[major ? :major : :active] }
780
793
  ])
781
- elsif stdin?
782
- puts val
783
794
  end
784
795
  on :last, :bump unless dryrun?
785
796
  else
@@ -796,7 +807,7 @@ module Squared
796
807
  cmd = session dependbin, 'pack'
797
808
  if dependtype(:yarn) > 1
798
809
  op = OptionPartition.new(opts, OPT_BERRY[:pack], cmd, project: self)
799
- op << quote_option('out', Pathname.pwd + "#{project}-#{version}.tgz") unless op.arg?('out')
810
+ op.append?('out', Pathname.pwd + "#{project}-#{version}.tgz")
800
811
  else
801
812
  op = OptionPartition.new(opts, pnpm? ? OPT_PNPM[:pack] : OPT_NPM[:pack] + OPT_NPM[:common], cmd,
802
813
  project: self)
@@ -811,7 +822,7 @@ module Squared
811
822
  end
812
823
  end
813
824
  end
814
- op << quote_option('pack-destination', Dir.pwd) unless op.arg?('pack-destination')
825
+ op.append?('pack-destination', Dir.pwd)
815
826
  end
816
827
  op.clear
817
828
  run(from: :pack)
@@ -925,13 +936,17 @@ module Squared
925
936
  end
926
937
 
927
938
  def version
928
- @version ||= read_packagemanager(:version)
939
+ self.version ||= read_packagemanager(:version)
929
940
  end
930
941
 
931
942
  def packagename
932
943
  read_packagemanager :name
933
944
  end
934
945
 
946
+ def scripts
947
+ @scripts ||= read_packagemanager(:scripts).yield_self { |ret| ret.is_a?(Hash) ? ret : {} }
948
+ end
949
+
935
950
  private
936
951
 
937
952
  def read_packagemanager(key = nil, version: nil, update: false)
@@ -951,7 +966,7 @@ module Squared
951
966
  else
952
967
  if key
953
968
  @pm[key]
954
- elsif (ret = @pm[:_]) && !(version && semcmp(ret[(ret.index('@') + 1)..-1], version) == 1)
969
+ elsif (ret = @pm[:_]) && (!version || semgte?(ret[(ret.index('@') + 1)..-1], version))
955
970
  ret
956
971
  end
957
972
  end
@@ -963,13 +978,8 @@ module Squared
963
978
  ret
964
979
  end
965
980
 
966
- def read_scripts
967
- ret = read_packagemanager(:scripts)
968
- ret.is_a?(Hash) ? ret.to_a : []
969
- end
970
-
971
981
  def append_loglevel(target: @session)
972
- level = env 'NODE_LOGLEVEL'
982
+ level = env('NODE_LOGLEVEL')
973
983
  silent = !verbose || level == 'silent'
974
984
  return unless silent || level
975
985
 
@@ -1000,10 +1010,6 @@ module Squared
1000
1010
  end
1001
1011
  end
1002
1012
 
1003
- def dryrun?(prefix = dependbin, **)
1004
- super || !option('dry-run', prefix: prefix).nil?
1005
- end
1006
-
1007
1013
  def dependbin
1008
1014
  if yarn?
1009
1015
  'yarn'
@@ -1028,6 +1034,10 @@ module Squared
1028
1034
  { pat: /^(npm )(.+)$/, styles: :bold }
1029
1035
  ]
1030
1036
  end
1037
+
1038
+ def dryrun?(prefix = dependbin, **)
1039
+ super || !option('dry-run', prefix: prefix).nil?
1040
+ end
1031
1041
  end
1032
1042
 
1033
1043
  Application.implement Node
@@ -30,7 +30,7 @@ module Squared
30
30
  OPT_POETRY = {
31
31
  common: %w[ansi no-ansi no-cache n|no-interaction no-plugins q|quiet v|verbose P|project=p].freeze,
32
32
  build: %w[clean config-settings=qq f|format=b o|output=p].freeze,
33
- publish: %w[build dry-run skip-existing cert=p client-cert=p dist-dir=p p|password=b r|repository=b
33
+ publish: %w[build dry-run skip-existing cert=p client-cert=p dist-dir=p p|password=b r|repository=q
34
34
  u|username=b].freeze
35
35
  }.freeze
36
36
  OPT_PDM = {
@@ -45,7 +45,7 @@ module Squared
45
45
  q|quiet v|verbose].freeze,
46
46
  build: %w[clean-hooks-after ext hooks-only no-hooks c|clean t|target=b].freeze,
47
47
  publish: %w[initialize-auth n|no-prompt y|yes a|auth=q ca-cert=p client-cert=p client-key=p o|option=q
48
- p|publisher=b r|repo=b u|user=q].freeze
48
+ p|publisher=b r|repo=q u|user=q].freeze
49
49
  }.freeze
50
50
  OPT_TWINE = {
51
51
  publish: %w[attestations disable-progress-bar non-interactive s|sign skip-existing verbose cert=p
@@ -78,7 +78,7 @@ module Squared
78
78
 
79
79
  attr_reader :venv, :editable
80
80
 
81
- def initialize(*, editable: '.', verbose: nil, **kwargs)
81
+ def initialize(*, editable: '.', verbose: nil, asdf: 'python', **kwargs)
82
82
  super
83
83
  if @pass.include?(Python.ref)
84
84
  initialize_ref Python.ref
@@ -87,7 +87,6 @@ module Squared
87
87
  initialize_build(Python.ref, **kwargs)
88
88
  initialize_env(**kwargs)
89
89
  end
90
- @verbose = verbose.size if verbose.is_a?(String) && verbose.match?(/\Av+\z/)
91
90
  dependfile_set DEP_PYTHON
92
91
  editable_set editable
93
92
  venv_set kwargs[:venv]
@@ -95,7 +94,7 @@ module Squared
95
94
 
96
95
  subtasks({
97
96
  'venv' => %i[exec create remove show].freeze,
98
- 'pip' => %i[uninstall freeze].freeze,
97
+ 'pip' => %i[upgrade uninstall freeze].freeze,
99
98
  'install' => %i[user force upgrade target editable].freeze,
100
99
  'outdated' => %i[major minor patch].freeze,
101
100
  'build' => %i[python poetry pdm hatch].freeze,
@@ -104,13 +103,22 @@ module Squared
104
103
  'exec' => nil
105
104
  })
106
105
 
106
+ def verbose=(val)
107
+ case val
108
+ when /\Av+\z/
109
+ @verbose = val.size
110
+ else
111
+ super
112
+ end
113
+ end
114
+
107
115
  def ref
108
116
  Python.ref
109
117
  end
110
118
 
111
119
  def populate(*, **)
112
120
  super
113
- return unless outdated? && ref?(Python.ref)
121
+ return unless (outdated? && ref?(Python.ref)) || @only
114
122
 
115
123
  namespace name do
116
124
  Python.subtasks do |action, flags|
@@ -124,7 +132,7 @@ module Squared
124
132
  format_desc action, nil, "script+|#{indexchar}index+|#,pattern*"
125
133
  task action, [:command] do |_, args|
126
134
  found = 0
127
- ['tool.poetry.scripts', 'tool.pdm.scripts', 'project.scripts'].each_with_index do |table, index|
135
+ %w[tool.poetry.scripts tool.pdm.scripts project.scripts].each_with_index do |table, index|
128
136
  next if (list = read_pyproject(table)).empty?
129
137
 
130
138
  if args.command == '#'
@@ -159,7 +167,7 @@ module Squared
159
167
  found |= 1
160
168
  run(pdm_session('run', val), from: :run)
161
169
  else
162
- raise_error("script: #{val}", hint: 'unknown') if exception
170
+ raise_error "script: #{val}" if exception
163
171
  found |= 2
164
172
  log.warn "run script \"#{val}\" (not indexed)"
165
173
  end
@@ -234,6 +242,14 @@ module Squared
234
242
  end
235
243
  when 'pip'
236
244
  case flag
245
+ when :upgrade
246
+ format_desc action, flag, 'opts*'
247
+ task flag do |_, args|
248
+ args = args.to_a
249
+ args.prepend('upgrade')
250
+ args.append('pip')
251
+ install flag, args
252
+ end
237
253
  when :freeze
238
254
  format_desc action, flag, "file?=#{DEP_PYTHON[4]},opts*"
239
255
  task flag do |_, args|
@@ -260,13 +276,16 @@ module Squared
260
276
  end
261
277
  when :upgrade
262
278
  task flag, [:strategy] do |_, args|
263
- case (strategy = args.strategy)
264
- when 'eager', 'only-if-needed'
265
- args = args.extras
266
- else
267
- args = args.to_a
268
- strategy = nil
269
- end
279
+ args = case (strategy = args.strategy)
280
+ when 'eager', 'only-if-needed'
281
+ args.extras
282
+ when 'needed'
283
+ strategy = 'only-if-needed'
284
+ args.extras
285
+ else
286
+ strategy = nil
287
+ args.to_a
288
+ end
270
289
  install(flag, args, strategy: strategy)
271
290
  end
272
291
  when :target
@@ -287,7 +306,7 @@ module Squared
287
306
  when 'build'
288
307
  case flag
289
308
  when :poetry
290
- next unless build_backend == 'poetry.core.masonry.api'
309
+ next unless poetry?
291
310
  when :pdm
292
311
  next unless build_backend == 'pdm.backend'
293
312
  when :hatch
@@ -304,12 +323,18 @@ module Squared
304
323
  end
305
324
  break unless flag == :python
306
325
  when 'publish'
307
- format_desc(action, flag, 'opts*', after: case flag
308
- when :hatch then 'artifacts?'
309
- when :twine then 'dist?'
310
- end)
326
+ format_desc(action, flag, 'test?,opts*', after: case flag
327
+ when :hatch then 'artifacts?'
328
+ when :twine then 'dist?'
329
+ end)
311
330
  task flag do |_, args|
312
- publish flag, args.to_a
331
+ args = args.to_a
332
+ publish(flag, args, test: if args.first == 'test'
333
+ args.shift
334
+ true
335
+ else
336
+ false
337
+ end)
313
338
  end
314
339
  end
315
340
  end
@@ -325,8 +350,8 @@ module Squared
325
350
  elsif outdated?
326
351
  venv_init
327
352
  workspace.rev_clear(name, sync: sync)
328
- if !flag && dependtype == 1
329
- cmd = poetry_session 'install', '-n'
353
+ if !flag && poetry?
354
+ cmd = poetry_session 'install -n'
330
355
  cmd << '--no-root' if option('no-root')
331
356
  else
332
357
  cmd = pip_session 'install'
@@ -351,7 +376,7 @@ module Squared
351
376
  end
352
377
 
353
378
  def outdated(flag = nil, opts = [], sync: invoked_sync?('outdated'))
354
- cmd = pip_session 'list', '--outdated'
379
+ cmd = pip_session 'list --outdated'
355
380
  append_global
356
381
  cmd = session_done cmd
357
382
  log.info cmd
@@ -458,6 +483,11 @@ module Squared
458
483
  cmd << '--user' if user
459
484
  cmd << basic_option('upgrade-strategy', strategy) if strategy
460
485
  append_value out
486
+ if workspace.windows?
487
+ pip = cmd.to_a.drop(1)
488
+ cmd = python_session '-m pip'
489
+ cmd.merge(pip)
490
+ end
461
491
  end
462
492
  run(from: :install)
463
493
  end
@@ -506,12 +536,12 @@ module Squared
506
536
  end
507
537
  op << basic_option('p', project) unless ENV['HATCH_PROJECT'] || op.arg?('p', 'project')
508
538
  end
509
- op << shell_quote(path + srcdir) if srcdir
539
+ op.add_path(srcdir) if srcdir
510
540
  op.clear
511
541
  run(from: :"#{flag}:build")
512
542
  end
513
543
 
514
- def publish(flag, opts = [])
544
+ def publish(flag, opts = [], test: false)
515
545
  case flag
516
546
  when :poetry
517
547
  poetry_session 'publish'
@@ -528,10 +558,17 @@ module Squared
528
558
  end
529
559
  op = OptionPartition.new(opts, list, @session, project: self, single: singleopt(flag))
530
560
  dist = lambda do
531
- (path + 'dist').tap do |dir|
561
+ path.join('dist').tap do |dir|
532
562
  raise_error('no source files found', hint: dir) unless dir.directory? && !dir.empty?
533
563
  end
534
564
  end
565
+ if test
566
+ if op.arg?('r', flag == :hatch ? 'repo' : 'repository')
567
+ op.push('test')
568
+ else
569
+ op << quote_option('r', 'testpypi')
570
+ end
571
+ end
535
572
  case flag
536
573
  when :hatch, :twine
537
574
  if op.empty?
@@ -552,7 +589,7 @@ module Squared
552
589
  out = append_pip(nil, opts, from: flag)
553
590
  case flag
554
591
  when :uninstall
555
- raise_error('no packages listed', hint: 'uninstall') if out.empty?
592
+ raise_error('no packages listed', hint: flag) if out.empty?
556
593
  cmd.merge(out)
557
594
  when :freeze
558
595
  venv_init
@@ -655,9 +692,10 @@ module Squared
655
692
  op.found << opt
656
693
  end
657
694
  end
695
+ op << '--no-build-isolation' if option('build-isolation', equals: '0')
658
696
  op.swap
659
697
  if edit
660
- edit = path + edit unless %r{^[a-z]+(?:\+[a-z]+)?://}i.match?(edit)
698
+ edit = path + edit unless %r{\A[a-z]+(?:\+[a-z]+)?://}i.match?(edit)
661
699
  if flag == :editable
662
700
  op.push(edit)
663
701
  else
@@ -769,7 +807,7 @@ module Squared
769
807
  end
770
808
  @pyproject[table] = ret
771
809
  end
772
- return ret.find { |val| val[0] == key }&.last if key
810
+ return ret.find { |val| val.first == key }&.last if key
773
811
 
774
812
  ret
775
813
  end
@@ -870,6 +908,14 @@ module Squared
870
908
  puts(dir.directory? ? "Success: #{dir}" : 'Failed') if banner && !status
871
909
  end
872
910
 
911
+ def setuptools?
912
+ build_backend ? build_backend == 'setuptools.build_meta' : dependtype == 2 || dependtype == 4
913
+ end
914
+
915
+ def poetry?
916
+ build_backend ? build_backend == 'poetry.core.masonry.api' : dependtype == 1
917
+ end
918
+
873
919
  def requirements?
874
920
  dependtype == 5
875
921
  end