squared 0.7.6 → 0.8.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 34bdb83cec13d6b8da3e9aecb19b2b13f7c3482ce7500f399e2663ef436c46d1
4
- data.tar.gz: b12b93015ce27785b1903674af314582348537ca3cc5ac2de00188c072677e50
3
+ metadata.gz: 2452b04f29a57fd7e41177ca45d0699c6cbfcbac259f6cd5d34c7b884e525fa3
4
+ data.tar.gz: 795dbe474a4ad6e72af653fcd0bf8c80929edaa1749c7a7f0343b60e851cd954
5
5
  SHA512:
6
- metadata.gz: ede0371288478d0cdfdfc3a282d82b3d46e2dd5f32186df6d9125f781eeaa604f75e808490fc8cdfde32a77ed7b24d392407d5c907bb31384cfa4f19276a6623
7
- data.tar.gz: 822a6b29c9047a8708240f25443ce6158092a04001302b14981d3466d9473a24db2c6ce8b5a31011f0104848943e241ed9eaf975b0b6bcc598abea22b571e0a3
6
+ metadata.gz: be07f3621680097432f4a5f56c825af6e47603c1fbdbaaf37a12c0fbec377fa231ad9d2551ee5a6d2fe1565115dc8e8398cca35cac7f858874a178f920683879
7
+ data.tar.gz: 1743bc51b54ceb5c21a1328bc83b8cb2c2e098378964e1f6bfc623984e551be215c73ef3b16b21e9258d257ba29d950b385364e874a8a6b5485bab24f3c1953c
data/CHANGELOG.md CHANGED
@@ -1,5 +1,90 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.8.0] - 2026-06-16
4
+
5
+ ### Added
6
+
7
+ - Application method join for group task invoke was created.
8
+ - Ruby command gem action push can use wildcard paths.
9
+ - Ruby command gem action build can use wildcard paths.
10
+ - Docker command container action attach was implemented.
11
+ - Application method join can be run in parallel.
12
+ - Project base method semver supports bumping prerelease.
13
+ - Node command bump supports incrementing a private workspace.
14
+ - Project base class implemented Enumerable each method.
15
+ - Ruby command gem action outdated can be pinned by semver.
16
+ - Node command publish action stage was implemented.
17
+ - Git command remote was implemented.
18
+
19
+ ### Changed
20
+
21
+ - Node task outdated does not modify without a full semver range.
22
+ - OptionPartition static methods do not support unknown arguments.
23
+ - Readline/Reline is no longer loaded into global namespace.
24
+ - JRuby/TruffleRuby are no longer given any special treatment.
25
+ - Common shell lib does not include PATH when used as module function.
26
+ - Override methods using suffix "!" were renamed to "\_".
27
+ - Common method as_a checks for to_ary after to_a.
28
+ - Node command bump was condensed into one subtask.
29
+ - Git event name revbuild was separated into git:revbuild:[before|after].
30
+ - Git command stash action [branch|clear|list|all|staged|worktree] were grouped.
31
+ - Project methods with prefix parameter were converted into keyword.
32
+ - Project base method accept_b parameters were converted into keyword.
33
+ - Class methods with a ref parameter were converted into keyword.
34
+
35
+ ### Removed
36
+
37
+ - Common format method raise_error was removed.
38
+
39
+ ## [0.7.7] - 2026-06-15
40
+
41
+ ### Added
42
+
43
+ - Ruby program commands can be run through bundle exec.
44
+ - Node command package action [approve|deny] was implemented.
45
+ - NPM command options were updated to 11.16.
46
+
47
+ ### Fixed
48
+
49
+ - Project method format_banner modified reference to run command.
50
+ - Project subtasks did not use exception? wrapper method.
51
+
52
+ ## [0.6.14] - 2026-06-14
53
+
54
+ ### Added
55
+
56
+ - Node task depend can run approve-scripts with NPM_APPROVE_SCRIPTS.
57
+
58
+ ### Fixed
59
+
60
+ - Docker command bake action build did not append context directory.
61
+
62
+ ## [0.5.24]
63
+
64
+ ### Fixed
65
+
66
+ - See `0.4.38`.
67
+
68
+ ## [0.4.38]
69
+
70
+ ### Added
71
+
72
+ - Application project commands can be defined without a reference.
73
+ - Git command branch action all was implemented.
74
+
75
+ ### Changed
76
+
77
+ - Override alias methods were created for suffix "!" to "\_".
78
+ - Project banners do not display boolean attributes.
79
+ - OptionPartition method append strips single quotes when quoting strings.
80
+
81
+ ### Fixed
82
+
83
+ - Application methods log and exclude were non-functional.
84
+ - Docker command bake action build does not support changing context.
85
+ - Project base method semver did not include prerelease delimiter.
86
+ - Project session cleanup did not compare by reference.
87
+
3
88
  ## [0.7.6] - 2026-05-04
4
89
 
5
90
  ### Added
@@ -194,6 +279,7 @@
194
279
  - Application class supports extensions used during build finalization.
195
280
  - Docker command bake action compose to build with defaults was implemented.
196
281
  - Program asdf legacy global installations using ASDF_DIR is supported.
282
+ - Docker command compose action publish was implemented.
197
283
 
198
284
  ### Changed
199
285
 
@@ -221,7 +307,6 @@
221
307
  - Application project classes can only be injected using static methods.
222
308
  - Tasks can only be excluded through Appliction build instance method.
223
309
  - Project base utility methods were relocated to Support namespace.
224
- - Ruby class private method run_rb was removed.
225
310
  - Application attribute exception accept Logger levels to route errors.
226
311
  - Ruby command irb always includes local development require paths.
227
312
  - Bundler tasks are hidden when package is not installed.
@@ -229,7 +314,10 @@
229
314
  - Application method with renamed pass to hide due to conflict with Project.
230
315
  - Node task depend using Yarn no longer sets option ignore-engines by default.
231
316
  - Project base private instance variable events was relocated.
232
- - Docker command compose action publish was implemented.
317
+
318
+ ### Removed
319
+
320
+ - Ruby class private method run_rb was removed.
233
321
 
234
322
  ### Fixed
235
323
 
@@ -604,7 +692,6 @@
604
692
 
605
693
  - Git method source will raise error when checking exit status.
606
694
  - Date gem is no longer globally required.
607
- - Global task git:all was removed.
608
695
  - Common base method as_a was relocated to Utils.
609
696
  - Python command build and publish detects only one backend.
610
697
  - Docker command compose action ps was renamed service.
@@ -612,14 +699,12 @@
612
699
  - Project base method success? conditionally calls print_success method.
613
700
  - Error classes were not specified for invalid operation.
614
701
  - Common format methods stripstyle and stripext are String instance methods.
615
- - Common format method alias puts_oe was removed.
616
702
  - Git commands without a valid action will exit with error status.
617
703
  - Errno exceptions are used in place of SystemCallError.
618
704
  - Common format method raise_error defaults to RuntimeError.
619
705
  - OptionPartition delegator method delete_at was renamed remove_at.
620
706
  - Node event name "publish" was renamed to "npm:publish".
621
707
  - Project task run with a Method passes self as first argument.
622
- - Ruby command check was removed.
623
708
  - Ruby method gem! was renamed gem.
624
709
  - Ruby methods ruby and irb first argument was converted into kwargs.
625
710
  - Ruby method rake executes all tasks in one run command.
@@ -635,12 +720,18 @@
635
720
  - Project base method run_s uses last argument for ENV hash.
636
721
  - Project base method inject does not exit program when raised.
637
722
  - Reline gem is installed only when using at least Ruby 3.0.
638
- - Python method install arguments strategy and user were removed.
639
723
  - Project command outdated does not support threading when interactive.
640
724
  - Project base accessor global was converted into a reader and setter.
641
725
  - Repo build can simultaneously use script and run through REPO_BUILD.
642
726
  - Repo static method read_manifest was made an instance method named repo_manifest.
643
727
 
728
+ ### Removed
729
+
730
+ - Global task git:all was removed.
731
+ - Common format method alias puts_oe was removed.
732
+ - Ruby command check was removed.
733
+ - Python method install arguments strategy and user were removed.
734
+
644
735
  ### Fixed
645
736
 
646
737
  - Node task update did not check equivalent ENV install options.
@@ -1237,6 +1328,10 @@
1237
1328
 
1238
1329
  ## [0.3.10]
1239
1330
 
1331
+ ### Removed
1332
+
1333
+ - Git command files action ignored could not be used alone.
1334
+
1240
1335
  ### Fixed
1241
1336
 
1242
1337
  - Git command reset action commit used invalid delimeter.
@@ -1244,10 +1339,6 @@
1244
1339
  - Project script task did not fire first and last callbacks.
1245
1340
  - Git checkout action commit did not include options.
1246
1341
 
1247
- ### Removed
1248
-
1249
- - Git command files action ignored could not be used alone.
1250
-
1251
1342
  ## [0.2.10]
1252
1343
 
1253
1344
  ### Fixed
@@ -1829,6 +1920,8 @@
1829
1920
 
1830
1921
  - Changelog was created.
1831
1922
 
1923
+ [0.8.0]: https://github.com/anpham6/squared-ruby/releases/tag/v0.8.0
1924
+ [0.7.7]: https://github.com/anpham6/squared-ruby/releases/tag/v0.7.7
1832
1925
  [0.7.6]: https://github.com/anpham6/squared-ruby/releases/tag/v0.7.6
1833
1926
  [0.7.5]: https://github.com/anpham6/squared-ruby/releases/tag/v0.7.5
1834
1927
  [0.7.4]: https://github.com/anpham6/squared-ruby/releases/tag/v0.7.4
@@ -1836,6 +1929,7 @@
1836
1929
  [0.7.2]: https://github.com/anpham6/squared-ruby/releases/tag/v0.7.2
1837
1930
  [0.7.1]: https://github.com/anpham6/squared-ruby/releases/tag/v0.7.1
1838
1931
  [0.7.0]: https://github.com/anpham6/squared-ruby/releases/tag/v0.7.0
1932
+ [0.6.14]: https://github.com/anpham6/squared-ruby/releases/tag/v0.6.14
1839
1933
  [0.6.13]: https://github.com/anpham6/squared-ruby/releases/tag/v0.6.13
1840
1934
  [0.6.12]: https://github.com/anpham6/squared-ruby/releases/tag/v0.6.12
1841
1935
  [0.6.11]: https://github.com/anpham6/squared-ruby/releases/tag/v0.6.11
@@ -1850,6 +1944,7 @@
1850
1944
  [0.6.2]: https://github.com/anpham6/squared-ruby/releases/tag/v0.6.2
1851
1945
  [0.6.1]: https://github.com/anpham6/squared-ruby/releases/tag/v0.6.1
1852
1946
  [0.6.0]: https://github.com/anpham6/squared-ruby/releases/tag/v0.6.0
1947
+ [0.5.24]: https://github.com/anpham6/squared-ruby/releases/tag/v0.5.24
1853
1948
  [0.5.23]: https://github.com/anpham6/squared-ruby/releases/tag/v0.5.23
1854
1949
  [0.5.22]: https://github.com/anpham6/squared-ruby/releases/tag/v0.5.22
1855
1950
  [0.5.21]: https://github.com/anpham6/squared-ruby/releases/tag/v0.5.21
@@ -1874,6 +1969,7 @@
1874
1969
  [0.5.2]: https://github.com/anpham6/squared-ruby/releases/tag/v0.5.2-ruby
1875
1970
  [0.5.1]: https://github.com/anpham6/squared-ruby/releases/tag/v0.5.1-ruby
1876
1971
  [0.5.0]: https://github.com/anpham6/squared-ruby/releases/tag/v0.5.0-ruby
1972
+ [0.4.38]: https://github.com/anpham6/squared-ruby/releases/tag/v0.4.38
1877
1973
  [0.4.37]: https://github.com/anpham6/squared-ruby/releases/tag/v0.4.37
1878
1974
  [0.4.36]: https://github.com/anpham6/squared-ruby/releases/tag/v0.4.36
1879
1975
  [0.4.35]: https://github.com/anpham6/squared-ruby/releases/tag/v0.4.35
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # squared 0.7
1
+ # squared 0.8
2
2
 
3
3
  * [source](https://github.com/anpham6/squared-ruby)
4
4
  * [docs](https://squared.readthedocs.io)
@@ -11,11 +11,12 @@
11
11
  | 2025-01-07 | 0.2.0 | | 3.4.0 | |
12
12
  | 2025-02-07 | 0.3.0 | | 3.4.1 | |
13
13
  | 2025-03-06 | 0.4.0 | | 3.4.2 | * |
14
- | 2025-06-16 | 0.5.0 | 2.5.0 | 3.4.4 | * |
14
+ | 2025-06-16 | 0.5.0 | 2.5.0 | 3.4.4 | |
15
15
  | ---------- | ----- | ----- | ----- | --- |
16
16
  | 2025-08-23 | 0.5.5 | | 3.4.5 | |
17
17
  | 2025-10-31 | 0.6.0 | | 3.4.7 | * |
18
18
  | 2026-01-07 | 0.7.0 | 2.5.0 | 4.0.0 | * |
19
+ | 2026-06-16 | 0.8.0 | | 4.0.5 | * |
19
20
 
20
21
  The range chart indicates the *latest* Ruby tested against at the time of release.
21
22
 
@@ -47,7 +48,6 @@ require "squared/app" # All workspace related modules
47
48
  # log = /workspaces/logger
48
49
  # emc = /workspaces/e-mc
49
50
  # pir = /workspaces/pi-r
50
- # pir2 = /workspaces/pi-r2
51
51
  # squared = /workspaces/squared
52
52
  # cli = /workspaces/squared/publish/sqd-cli
53
53
  # sqd-serve = /workspaces/squared/publish/sqd-serve
@@ -74,7 +74,6 @@ Workspace::Application
74
74
  end
75
75
  .add("e-mc", "emc", copy: { from: "publish", scope: "@e-mc", also: [:pir, "squared-express/"] }, ref: :node) # Node
76
76
  .add("pi-r", "pir", copy: { from: "publish", scope: "@pi-r" }, clean: ["publish/**/*.js", "tmp/"]) # Trailing slash required for directories
77
- .add("pi-r2", "pir2", copy: { from: :npm, also: %i[squared express], files: ["LICENSE", ["README.md.ruby", "README.md"]] }) # Uses dist files from NPM package spec
78
77
  .add("squared", init: "pnpm", script: ["build:stage1", "build:stage2"], group: "app") do # Use pnpm/yarn/berry for depend + Copy target (main)
79
78
  # Repo (global)
80
79
  as(:run, "build:dev", "dev") # npm run build:dev -> npm run dev
@@ -179,6 +178,12 @@ Workspace::Application
179
178
  pip("wheel", with: "build:dev") # pip wheel -r "/chrome-docs/requirements.txt" --no-deps
180
179
  }
181
180
  end
181
+
182
+ join("venv", invoke: "venv:remove", args: ["create"]) # rake venv:python => rake android:venv:remove[create] => chrome:venv:remove[create]
183
+ join("venv", "venv:remove", "create", sync: false) # PYTHON_ARGS=depend,dry-run rake venv:python => rake android:venv:remove[depend,dry-run] | chrome:venv:remove[depend,dry-run]
184
+ join("pwd") do # rake pwd:python => "/workspaces/android-docs" => "/workspaces/chrome-docs"
185
+ puts self.path
186
+ end
182
187
  end
183
188
  .style("inline", "bold")
184
189
  .stage("init:project") { puts self.path } # modify attributes before building tasks (init | begin | project:begin/end | populate | extensions | series | finalize | end)
@@ -211,7 +216,6 @@ Workspace::Application
211
216
  })
212
217
  end
213
218
  .add("squared", release: "https://github.com/anpham6/squared/archive/refs/tags/??") # squared:unpack:zip[v5.4.0,/tmp/squared]
214
- end
215
219
  ```
216
220
 
217
221
  ### Clone
@@ -285,9 +289,6 @@ Workspace::Application
285
289
  add("pi-r", "pir") do
286
290
  chain "all", "build", after: "emc:build" # step: 3
287
291
  end
288
- add("pi-r2", "pir2") do
289
- chain "all", "build", before: "squared" # step: 3
290
- end
291
292
  add("squared-express", "express") do
292
293
  chain "all", "clean", with: "emc" # step: 1
293
294
  chain "all", "build", with: "pir" # step: 3
@@ -366,7 +367,7 @@ Workspace::Application
366
367
  first("git:ls-files", override: true) { puts "2" } # puts "2"
367
368
  last("git:ls-files") { puts workspace.root } # puts "/workspaces" (does not run when error is raised)
368
369
  error("git:ls-files") { |err| err.is_a?(TypeError) } # return true to suppress error
369
- end
370
+ end
370
371
  end
371
372
  .with(:ruby) do
372
373
  run("gem build") # gem build
@@ -548,6 +549,7 @@ Most project classes will inherit from `Git` which enables these tasks:
548
549
  | pull | pull | origin remote all |
549
550
  | range-diff | range-diff | view between contain |
550
551
  | rebase | rebase | branch onto send |
552
+ | remote | remote | add select |
551
553
  | refs | ls-remote --refs | heads tags remote |
552
554
  | reset | reset | commit index patch mode undo |
553
555
  | restore | restore | source staged worktree |
@@ -698,6 +700,7 @@ GIT_COUNT=50 # list display limit
698
700
  | checkout | * | F|FORCE MERGE |
699
701
  | clone | * | DEPTH=n ORIGIN=s BRANCH=s REVISION=s BARE=1 LOCAL=0,1 |
700
702
  | | | SINGLE_BRANCH=0,1 NO_CHECKOUT=1 NO_TAGS=1 QUIET=1 |
703
+ | commit | amend | F|FORCE |
701
704
  | commit | * | UPSTREAM=s DRY_RUN EDIT=0 M|MESSAGE=s |
702
705
  | diff | head branch | INDEX=n |
703
706
  | diff | * | PATHSPEC=s |
@@ -868,43 +871,44 @@ Features can be enabled through ENV when calling global tasks such as through *C
868
871
 
869
872
  * Prefix: BUNDLE/GEM/RBS
870
873
 
871
- | Command | Flag | ENV |
872
- | :--------- | :-------- | :-------------------------------------------------------- |
873
- | depend | - | BINSTUBS=s JOBS=n |
874
- | depend | update | VERSION=major|minor|patch STRICT CONSERVATIVE |
875
- | outdated | - | U|UPDATE=major|minor|patch ONLY_EXPLICIT DRY_RUN |
876
- | gem | outdated | DOCUMENT=0,1 USER_INSTALL=0,1 |
877
- | rbs | prototype | Y=0,1 |
874
+ | Command | Flag | ENV |
875
+ | :--------- | :-------- | :---------------------------------------------------------- |
876
+ | depend | - | BINSTUBS=s JOBS=n |
877
+ | depend | update | VERSION=major|minor|patch STRICT CONSERVATIVE |
878
+ | outdated | - | U|UPDATE=major|minor|patch ONLY_EXPLICIT DRY_RUN |
879
+ | gem | outdated | DOCUMENT=0,1 USER_INSTALL=0,1 |
880
+ | rbs | prototype | Y=0,1 |
878
881
 
879
882
  #### Node
880
883
 
881
884
  * Prefix: NPM/PNPM/YARN
882
885
 
883
- | Command | Flag | ENV |
884
- | :------------- | :------------- | :----------------------------------------------- |
885
- | depend | - | FORCE CI IGNORE_SCRIPTS |
886
- | outdated | - | U|UPDATE=major|minor|patch DIFF DRY_RUN |
887
- | publish | - | OTP=s TAG=s ACCESS=0,1,s DRY_RUN Y |
888
- | depend package | * | PACAKGE_LOCK|LOCKFILE=0 NO_LOCKFILE=1 Y |
889
- | npm pnpm | depend package | CPU=s OS=s LIBC=s |
890
- | npm | package | SAVE IGNORE_SCRIPTS STRICT_PEER_DEPS |
891
- | pnpm | depend | PUBLIC_HOIST_PATTERN=s APPROVE_BUILDS |
892
- | pnpm | depend:add | ALLOW_BUILD=s |
893
- | yarn | depend package | IGNORE_ENGINES |
894
- | yarn | depend:add | W|IGNORE_WORKSPACE_ROOT_CHECK=0 |
886
+ | Command | Flag | ENV |
887
+ | :------------- | :------------- | :------------------------------------------------- |
888
+ | depend | - | FORCE CI IGNORE_SCRIPTS |
889
+ | outdated | - | U|UPDATE=major|minor|patch SAVE_EXACT DIFF DRY_RUN |
890
+ | publish | - | OTP=s TAG=s ACCESS=0,1,s DRY_RUN Y |
891
+ | depend package | * | PACAKGE_LOCK|LOCKFILE=0 NO_LOCKFILE=1 Y |
892
+ | npm | depend | APPROVE_SCRIPTS=s |
893
+ | npm | package | SAVE IGNORE_SCRIPTS STRICT_PEER_DEPS |
894
+ | pnpm | depend | PUBLIC_HOIST_PATTERN=s APPROVE_BUILDS |
895
+ | pnpm | depend:add | ALLOW_BUILD=s |
896
+ | yarn | depend package | IGNORE_ENGINES |
897
+ | yarn | depend:add | W|IGNORE_WORKSPACE_ROOT_CHECK=0 |
898
+ | npm pnpm | depend package | CPU=s OS=s LIBC=s |
895
899
 
896
900
  #### Python
897
901
 
898
902
  * Prefix: PIP/POETRY
899
903
 
900
- | Command | Flag | ENV |
901
- | :--------- | :-------- | :-------------------------------------------------------- |
902
- | global | * | CACHE_DIR=0,s PROXY=s PYTHON=s COLOR=0 |
903
- | depend | - | E|EDITABLE=0,s BUILD_ISOLATION=0 |
904
- | outdated | - | U|UPDATE=major|minor|patch NOT_REQUIRED=0 L|LOCAL DRY_RUN |
905
- | venv | exec | INTERACTIVE=0 |
906
- | poetry | * | PROJECT=s |
907
- | poetry | depend | NO_ROOT |
904
+ | Command | Flag | ENV |
905
+ | :--------- | :-------- | :---------------------------------------------------------- |
906
+ | global | * | CACHE_DIR=0,s PROXY=s PYTHON=s COLOR=0 |
907
+ | depend | - | E|EDITABLE=0,s BUILD_ISOLATION=0 |
908
+ | outdated | - | U|UPDATE=major|minor|patch NOT_REQUIRED=0 L|LOCAL DRY_RUN |
909
+ | venv | exec | INTERACTIVE=0 |
910
+ | poetry | * | PROJECT=s |
911
+ | poetry | depend | NO_ROOT |
908
912
 
909
913
  ## LICENSE
910
914
 
@@ -18,7 +18,6 @@ module Squared
18
18
  GRAPH: %w[| - | \\ -].freeze,
19
19
  BORDER: %w[| - - - - - | | - -].freeze,
20
20
  VIEW: 'view',
21
- BACKTRACE: $DEBUG || !$VERBOSE.nil?,
22
21
  LEVEL: ENV.fetch('LOG_LEVEL', 0).to_i,
23
22
  COLOR: ENV.fetch('NO_COLOR', '').empty?
24
23
  }
@@ -41,7 +41,7 @@ module Squared
41
41
 
42
42
  String.define_method(:stripstyle) { gsub(/\x1B\[(?:\d+;?)+m/, '') }
43
43
  String.define_method(:stripext) { File.basename(self, '.*') }
44
- String.define_method(:subhint) { |s| s.nil? || (s.is_a?(::String) && s.empty?) ? self : "#{self} (#{s})" }
44
+ String.define_method(:subhint) { |s| s.nil? || (s.respond_to?(:empty?) && s.empty?) ? self : "#{self} (#{s})" }
45
45
 
46
46
  def enable_aixterm
47
47
  unless (colors = __get__(:colors)).frozen?
@@ -62,9 +62,9 @@ module Squared
62
62
  return val unless ARG[:COLOR]
63
63
 
64
64
  ret = if pat && index != 0
65
- return val unless (data = pat.match(val))
65
+ return val unless (md = pat.match(val))
66
66
 
67
- index == -1 ? data.to_a.drop(1) : data[index]
67
+ index == -1 ? md.to_a.drop(1) : md[index]
68
68
  else
69
69
  index = 0
70
70
  val
@@ -110,10 +110,10 @@ module Squared
110
110
  return ret.join if index == -1
111
111
 
112
112
  ret = wrap.call(ret, code) unless code.empty?
113
- return ret unless data
113
+ return ret unless md
114
114
 
115
115
  out = +''
116
- data.to_a.each_with_index do |group, i|
116
+ md.to_a.each_with_index do |group, i|
117
117
  next if i == 0
118
118
 
119
119
  if i == index
@@ -319,15 +319,6 @@ module Squared
319
319
  err ? warn(out) : puts(out)
320
320
  end
321
321
  end
322
-
323
- def raise_error(*args, hint: nil, kind: RuntimeError, start: 0)
324
- kind = args.shift if args.first.is_a?(::Class) && args.first < ::Exception
325
- raise kind, message(*args, hint: hint, empty: true), if ARG[:BACKTRACE]
326
- caller(start.succ)
327
- else
328
- caller_locations(start.succ, 1).first&.base_label
329
- end
330
- end
331
322
  end
332
323
  end
333
324
  end
@@ -1,28 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- unless defined?(Readline)
4
- if RUBY_ENGINE == 'ruby' && RUBY_VERSION < '2.7'
5
- require 'readline'
6
- else
7
- begin
8
- require 'reline'
9
- Object.send(:remove_const, :Readline) if Object.const_defined?(:Readline)
10
- Readline = Reline
11
- rescue LoadError
12
- require 'readline' rescue LoadError
13
- end
14
- end
15
- end
16
-
17
3
  module Squared
18
4
  module Common
19
5
  module Prompt
6
+ def self.reline
7
+ if RUBY_ENGINE == 'ruby' && RUBY_VERSION < '2.7'
8
+ require 'readline'
9
+ Readline
10
+ else
11
+ begin
12
+ require 'reline'
13
+ Reline
14
+ rescue LoadError
15
+ require 'readline'
16
+ Readline
17
+ end
18
+ end
19
+ end
20
+
20
21
  module_function
21
22
 
22
- def confirm(msg, default = nil, agree: 'Y', cancel: 'N', force: false, attempts: 3, timeout: 60)
23
+ def confirm(msg, accept = nil, agree: 'Y', cancel: 'N', force: false, attempts: 3, timeout: 60)
23
24
  require 'timeout'
24
- if agree == 'Y' && cancel == 'N' && !msg.match?(%r{\[(?:Yn|nY|Y/n|y/N)\]})
25
- case default
25
+ if agree == 'Y' && cancel == 'N' && !msg.match?(%r{\[(Yn|nY|Y/n|y/N)\]})
26
+ case accept
26
27
  when 'Y'
27
28
  msg = "#{msg} [Y/n] "
28
29
  when 'N'
@@ -32,9 +33,9 @@ module Squared
32
33
  agree = /^#{Regexp.escape(agree)}$/i if agree.is_a?(::String)
33
34
  cancel = /^#{Regexp.escape(cancel)}$/i if cancel.is_a?(::String)
34
35
  Timeout.timeout(timeout) do
35
- while (ch = Readline.readline(msg))
36
+ while (ch = Prompt.reline.readline(msg))
36
37
  ch = ch.chomp
37
- case (ch.empty? ? default : ch)
38
+ case (ch.empty? ? accept : ch)
38
39
  when agree
39
40
  return true
40
41
  when cancel
@@ -82,7 +83,7 @@ module Squared
82
83
  end
83
84
  between = ->(s) { s.match?(/^\d+$/) && s.to_i.between?(min, max) }
84
85
  Timeout.timeout(timeout) do
85
- while (ch = Readline.readline(msg))
86
+ while (ch = Prompt.reline.readline(msg))
86
87
  ch.strip!
87
88
  unless ch.empty?
88
89
  if multiple
@@ -128,14 +129,14 @@ module Squared
128
129
  end
129
130
 
130
131
  def readline(msg, history = false, force: nil, multiline: nil, &blk)
131
- multiline = nil unless Readline.respond_to?(:readmultiline)
132
+ multiline = nil unless Prompt.reline.respond_to?(:readmultiline)
132
133
  read = lambda do
133
134
  if !multiline
134
- Readline.readline(msg, history)
135
+ Prompt.reline.readline(msg, history)
135
136
  elsif block_given?
136
- Readline.readmultiline(msg, history, &blk)
137
+ Prompt.reline.readmultiline(msg, history, &blk)
137
138
  else
138
- Readline.readmultiline(msg, history) do |line|
139
+ Prompt.reline.readmultiline(msg, history) do |line|
139
140
  next if line.strip.empty?
140
141
 
141
142
  Array(multiline).any? { |val| line.split.last.end_with?(val.to_s) }
@@ -18,14 +18,14 @@ module Squared
18
18
 
19
19
  def shell_escape(val, quote: false, option: false, force: false, double: false, override: false)
20
20
  val = val.to_s
21
- if (r = /\A(--?)([^=\s]+)((=|\s+)(["'])?(?(5)(.*)\5|(.*)))?\z/m.match(val))
22
- if (data = r[2].match(QUOTE_VALUE))
23
- double = data[1] == '"'
21
+ if (md = /\A(--?)([^=\s]+)((=|\s+)(["'])?(?(5)(.*)\5|(.*)))?\z/m.match(val))
22
+ if (q = md[2].match(QUOTE_VALUE))
23
+ double = q[1] == '"'
24
24
  override = true
25
- elsif !r[3] || r[6]
25
+ elsif !md[3] || md[6]
26
26
  return val
27
27
  end
28
- ch = r[7]
28
+ ch = md[7]
29
29
  opt = if ch.start_with?('"', "'")
30
30
  "#{ch}#{ch[0]}"
31
31
  elsif ch.end_with?('"', "'")
@@ -35,7 +35,7 @@ module Squared
35
35
 
36
36
  ch
37
37
  end
38
- r[1] + (data ? data[2] : r[2]) + r[4] + shell_quote(opt, force: force, double: double, override: override)
38
+ md[1] + (q ? q[2] : md[2]) + md[4] + shell_quote(opt, force: force, double: double, override: override)
39
39
  elsif option && val =~ /\A(-{0,2}[^=\s-][^=\s]*)=(.+)\z/m
40
40
  return val if $2.match?(QUOTE_VALUE)
41
41
 
@@ -56,15 +56,22 @@ module Squared
56
56
  def shell_quote(val, option: true, force: true, double: false, preserve: true, pass: false, override: false)
57
57
  val = val.to_s
58
58
  return val if (!force && !val.include?(' ')) || val.empty?
59
+ return val if option && val.match?(/\A(?:-[^=\s-](?:=|\s+)?|(--)?[^=\s-][^=\s]*(?(1)(?:=|\s+)|=))(["']).+\2\z/m)
59
60
 
60
- if option
61
- pat = /\A(?:-[^=\s-](?:=|\s+)?|(--)?[^=\s-][^=\s]*(?(1)(?:=|\s+)|=))(["']).+\2\z/m
62
- return val if val.match?(pat)
63
- end
64
61
  if val =~ QUOTE_VALUE
65
- return val if pass || ($1 == '"' && Rake::Win32.windows? && val.match?(/(?:[#{File::SEPARATOR} ]|\\")/o))
66
-
67
- base = $2 unless preserve
62
+ if pass == '"' || pass == "'"
63
+ return val if pass == $1
64
+ elsif pass || ($1 == '"' && Rake::Win32.windows? && val.match?(/([#{File::SEPARATOR} ]|\\")/o))
65
+ return val
66
+ end
67
+ case preserve
68
+ when false
69
+ base = $2
70
+ when '"'
71
+ base = $2 if $1 == "'"
72
+ when "'"
73
+ base = $2 if $1 == '"'
74
+ end
68
75
  end
69
76
  q = -> { (base || val).gsub("'\\\\''", "'") }
70
77
  if double || Rake::Win32.windows? || (ARG[:QUOTE] == '"' && !override)
@@ -155,11 +162,11 @@ module Squared
155
162
  end
156
163
 
157
164
  def shell_bin(name, env: true)
158
- require_relative 'base'
165
+ path = defined?(PATH) ? PATH : {}
159
166
  key = name.to_s.upcase
160
167
  key = File.basename(key, '.*') if Rake::Win32.windows?
161
- shell_quote((env && ENV["PATH_#{key}"]) || PATH[key] || PATH[key.to_sym] || PATH[key = key.downcase] ||
162
- PATH[key.to_sym] || name, option: false, force: false, double: true)
168
+ shell_quote((env && ENV["PATH_#{key}"]) || path[key] || path[key.to_sym] || path[key = key.downcase] ||
169
+ path[key.to_sym] || name, option: false, force: false, double: true)
163
170
  end
164
171
 
165
172
  def line_width(lines)
@@ -168,7 +175,7 @@ module Squared
168
175
 
169
176
  def fill_option(val, **kwargs)
170
177
  return val unless val.is_a?(::String)
171
- return "-#{val}" if val.match?(/\A(?:[a-z]\d*|\d)\z/i)
178
+ return "-#{val}" if val.match?(/\A([a-z]\d*|\d)\z/i)
172
179
 
173
180
  shell_escape(val.start_with?('-') ? val : "--#{val}", **kwargs)
174
181
  end