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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +159 -61
- data/README.md +662 -1273
- data/lib/squared/common/base.rb +1 -1
- data/lib/squared/common/format.rb +5 -3
- data/lib/squared/common/prompt.rb +1 -1
- data/lib/squared/common/shell.rb +13 -3
- data/lib/squared/common/system.rb +4 -4
- data/lib/squared/config.rb +8 -8
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +37 -14
- data/lib/squared/workspace/project/base.rb +143 -51
- data/lib/squared/workspace/project/docker.rb +68 -52
- data/lib/squared/workspace/project/git.rb +314 -208
- data/lib/squared/workspace/project/node.rb +42 -32
- data/lib/squared/workspace/project/python.rb +76 -30
- data/lib/squared/workspace/project/ruby.rb +121 -69
- data/lib/squared/workspace/project/support/class.rb +109 -15
- data/lib/squared/workspace/repo.rb +75 -48
- data/squared.gemspec +2 -2
- metadata +4 -5
- data/README.ruby.md +0 -724
@@ -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.
|
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
|
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(
|
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
|
-
|
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
|
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
|
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
|
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
|
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
|
-
|
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[:_]) && !
|
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
|
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=
|
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=
|
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
|
-
[
|
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
|
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
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
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
|
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
|
-
|
309
|
-
|
310
|
-
|
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
|
-
|
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 &&
|
329
|
-
cmd = poetry_session 'install
|
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
|
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
|
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
|
-
(
|
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:
|
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{
|
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
|
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
|