nomono 1.0.7 → 1.1.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: 501b3c3f4a0cb5b0ba2b93dfbb5b0975d106080b364e336c1536bb574f9613e8
4
- data.tar.gz: 5c2fd908c041d8bb3fa264c06930a58d1f6b6d6530d85c7facb2bf89dd5aeda9
3
+ metadata.gz: 30a48c913f151ef3d5ef5986e2982c2a6e851a87f2ee684fcb7d850d3a0534be
4
+ data.tar.gz: b2b24aa72a8c07dc3b2b13e4a541f01438bf8749a4f3c4c4c68243a866da624a
5
5
  SHA512:
6
- metadata.gz: c4df22c76c1a022a6ca6b9713792f531d46cf8af5c23762218f1e12abf01d063ff9be0e14a8bbb2054477357a57072d658af64e4d230a4bcac136e18f217dce7
7
- data.tar.gz: 4c5034136463336d0a4ec63118bf0693d1c443887ca166fa2de0d9fc7128dff589a11a7363f1512bfc049a69cf776da8bc0d64731cc96e0b2ede48bb8cd2f298
6
+ metadata.gz: c7af0d405f221b78b03fab5fb7daa3adbabdc1a0761ce3e80eed907a7a7a59152412fa1ed15af0a7678813c97c146b29f624b246c1b660cb1f6173b41c77b136
7
+ data.tar.gz: 58efcac31f6647073ca1305b3e08020bf232e65e55490dd31fc4113cb2c13c8e2b59a31f8aee22a64057b7b07206421079a36767d15edc35325840d21dba86f1
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,56 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [1.1.0] - 2026-07-22
34
+
35
+ - TAG: [v1.1.0][1.1.0t]
36
+ - COVERAGE: 97.56% -- 120/123 lines in 7 files
37
+ - BRANCH COVERAGE: 86.67% -- 39/45 branches in 7 files
38
+ - 12.50% documented
39
+
40
+ ### Added
41
+
42
+ - Added opt-in path alias normalization so local sibling paths can be rewritten
43
+ to a configured canonical spelling before Bundler writes them to lockfiles.
44
+
45
+ ### Changed
46
+
47
+ - kettle-jem-template-20260716-001 - Shim gemspec manifests now include
48
+ `LICENSE.md` instead of nonexistent `LICENSE.txt`.
49
+ - kettle-jem-template-20260716-002 - Generated gemspec manifests now ship fewer
50
+ repository-only files by default to reduce downstream distro packaging churn.
51
+
52
+ - kettle-jem-template-20260720-001 - Generated READMEs can now render
53
+ template-managed corporate sponsor logos from project or family config.
54
+ - kettle-jem-template-20260720-002 - Generated development Gemfiles now use the
55
+ released `tree_sitter_language_pack` gem 1.13.3 or newer by default.
56
+ - kettle-jem-template-20260720-003 - Generated StructuredMerge Git diff driver
57
+ config now uses the installed `smorg-rb` Ruby driver name.
58
+ - kettle-jem-template-20260720-004 - Generated multi-engine workflow files now
59
+ omit JRuby and TruffleRuby jobs when project config declares MRI-only engines.
60
+ - kettle-jem-template-20260720-005 - Generated README Support & Community rows
61
+ now include a RubyForum help badge.
62
+
63
+ ### Fixed
64
+
65
+ - Documented why `nomono` uses an explicit Gemfile loader instead of the
66
+ Bundler plugin DSL or RubyGems plugin autoload hooks, and simplified
67
+ `nomono`'s own local Gemfiles to load the local Bundler integration directly.
68
+
69
+ - Addressed review feedback by keeping split license detail links pointed at
70
+ the source repository, keeping `tree_sitter_language_pack` in the templating
71
+ dependency path only, and regenerating YARD documentation.
72
+
73
+ - Local modular Gemfiles now load `nomono/bundler` with the normal Bundler
74
+ require path so RuboCop Gradual style checks pass under appraisal bundles.
75
+
76
+ ## [1.0.8] - 2026-07-13
77
+
78
+ - TAG: [v1.0.8][1.0.8t]
79
+ - COVERAGE: 100.00% -- 89/89 lines in 7 files
80
+ - BRANCH COVERAGE: 100.00% -- 28/28 branches in 7 files
81
+ - 12.50% documented
82
+
33
83
  ## [1.0.7] - 2026-07-01
34
84
 
35
85
  - TAG: [v1.0.7][1.0.7t]
@@ -50,9 +100,9 @@ Please file a bug if you notice a violation of semantic versioning.
50
100
 
51
101
  ### Fixed
52
102
 
53
- - Removed the unnecessary `version_gem` runtime dependency from nomono itself,
54
- allowing Gemfiles generated by `kettle-jem` to load `nomono/bundler` directly
55
- while Bundler is still evaluating local sibling-gem overrides.
103
+ - Removed `version_gem` from nomono's default load path, allowing Gemfiles
104
+ generated by `kettle-jem` to load `nomono/bundler` directly while Bundler is
105
+ still evaluating local sibling-gem overrides.
56
106
  - Split the runtime and Bundler entry points so `require "nomono"` loads the
57
107
  resolver API without mutating `Bundler::Dsl`, while `require "nomono/bundler"`
58
108
  remains the explicit Gemfile integration hook.
@@ -75,7 +125,7 @@ Please file a bug if you notice a violation of semantic versioning.
75
125
  ### Fixed
76
126
 
77
127
  - Corrected OpenCollective funding metadata to use the `kettle-dev` collective.
78
- - Updated the default local workspace root from `$HOME/src/kettle-rb` to
128
+ - Updated the default local workspace root from `$HOME/src/kettle-dev` to
79
129
  `$HOME/src/my`.
80
130
 
81
131
  ## [1.0.4] - 2026-06-14
@@ -171,7 +221,13 @@ Please file a bug if you notice a violation of semantic versioning.
171
221
  - TAG: [v1.0.0][1.0.0t]
172
222
  - 12.50% documented
173
223
 
174
- [Unreleased]: https://github.com/kettle-dev/nomono/compare/v1.0.7...HEAD
224
+ [Unreleased]: https://github.com/kettle-dev/nomono/compare/v1.1.0...HEAD
225
+ [1.1.0]: https://github.com/kettle-dev/nomono/compare/v1.0.9...v1.1.0
226
+ [1.1.0t]: https://github.com/kettle-dev/nomono/releases/tag/v1.1.0
227
+ [1.0.9]: https://github.com/kettle-dev/nomono/compare/v1.0.8...v1.0.9
228
+ [1.0.9t]: https://github.com/kettle-dev/nomono/releases/tag/v1.0.9
229
+ [1.0.8]: https://github.com/kettle-dev/nomono/compare/v1.0.7...v1.0.8
230
+ [1.0.8t]: https://github.com/kettle-dev/nomono/releases/tag/v1.0.8
175
231
  [1.0.7]: https://github.com/kettle-dev/nomono/compare/v1.0.6...v1.0.7
176
232
  [1.0.7t]: https://github.com/kettle-dev/nomono/releases/tag/v1.0.7
177
233
  [1.0.6]: https://github.com/kettle-dev/nomono/compare/v1.0.5...v1.0.6
data/LICENSE.md CHANGED
@@ -3,7 +3,7 @@
3
3
  This project is made available under the following license.
4
4
  Choose the option that best fits your use case:
5
5
 
6
- - [AGPL-3.0-only](AGPL-3.0-only.md)
6
+ - [AGPL-3.0-only](https://github.com/kettle-dev/nomono/blob/main/AGPL-3.0-only.md)
7
7
 
8
8
  If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license.
9
9
 
data/README.md CHANGED
@@ -40,8 +40,8 @@ Use `require "nomono/bundler"` from Gemfiles or modular Gemfiles; this is the ex
40
40
  | Works with Truffle Ruby | [![Truffle Ruby 24.2 Compat][💎truby-24.2i]][🚎truby-24.2-wf] [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎truby-25.0-wf] [![Truffle Ruby 33.0 Compat][💎truby-33.0i]][🚎truby-33.0-wf] [![Truffle Ruby current Compat][💎truby-c-i]][🚎9-t-wf] [![Truffle Ruby HEAD Compat][💎truby-headi]][🚎3-hd-wf]|
41
41
  | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
42
42
  | Works with MRI Ruby 3 | [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎ruby-3.2-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎ruby-3.3-wf] [![Ruby 3.4 Compat][💎ruby-3.4i]][🚎ruby-3.4-wf]|
43
- | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
44
- | Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] |
43
+ | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
44
+ | Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] |
45
45
  | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] |
46
46
  | Compliance | [![License: AGPL-3.0-only][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
47
47
  | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] |
@@ -139,16 +139,17 @@ Nomono has an *environment contract*. By default (`prefix: "NOMONO_GEMS"`):
139
139
  - Any other value — treated as an explicit workspace root path (`/absolute/path` used as-is; relative path prepended with `$HOME`)
140
140
  - `NOMONO_GEMS_VENDORED_GEMS` (or legacy `VENDORED_GEMS`) is a comma-delimited list of gem names resolved from a vendor directory. This is **independent** of `NOMONO_GEMS_DEV` — it applies when you have vendored copies of specific gems that should override both the workspace and released versions.
141
141
  - `NOMONO_GEMS_VENDOR_GEM_DIR` (or legacy `VENDOR_GEM_DIR`) is the base path of the vendor directory used for gems listed in `NOMONO_GEMS_VENDORED_GEMS`. Defaults to `$workspace_root/vendor`. This is **not** an alternative form of the workspace root — it only affects vendored gems.
142
+ - `NOMONO_GEMS_PATH_ALIASES` (or global fallback `NOMONO_PATH_ALIASES`) is a comma-delimited list of `source=canonical` absolute path aliases. Each pair must resolve to the same real directory. Matching local gem paths are rewritten to the canonical spelling before Bundler receives them, preventing `Gemfile.lock` churn from equivalent paths such as `/var/home/...` and `/home/...`.
142
143
  - `NOMONO_GEMS_DEBUG` enables debug output from nomono.
143
144
 
144
145
  ### Examples
145
146
 
146
- For example, in the `kettle-dev` family of gems, which nomono is a part of, the parameters used are `prefix: "KETTLE_RB"`, `path_env: "KETTLE_RB_DEV"`.
147
+ For example, in the `kettle-dev` family of gems, which nomono is a part of, the parameters used are `prefix: "KETTLE_DEV"`, `path_env: "KETTLE_DEV_DEV"`.
147
148
  This means that the following is true:
148
149
 
149
- - `KETTLE_RB_DEV=false` (or unset) — released gems from configured gem server (CI / single-gem development default)
150
- - `KETTLE_RB_DEV=true` — local sibling gems from `$HOME/src/kettle-dev/<gem>` (recommended for full-workspace development)
151
- - `KETTLE_RB_DEV=/custom/path` — local sibling gems from `/custom/path/<gem>` (non-standard workspace layout only)
150
+ - `KETTLE_DEV_DEV=false` (or unset) — released gems from configured gem server (CI / single-gem development default)
151
+ - `KETTLE_DEV_DEV=true` — local sibling gems from `$HOME/src/kettle-dev/<gem>` (recommended for full-workspace development)
152
+ - `KETTLE_DEV_DEV=/custom/path` — local sibling gems from `/custom/path/<gem>` (non-standard workspace layout only)
152
153
 
153
154
  You can override the env variable names via options. Here is an example for use with rubocop-lts gems:
154
155
 
@@ -172,10 +173,10 @@ when they are enabled:
172
173
  ```ruby
173
174
  source "https://gem.coop"
174
175
 
175
- if ENV.fetch("KETTLE_RB_DEV", "false").casecmp("false").zero?
176
+ if ENV.fetch("KETTLE_DEV_DEV", "false").casecmp("false").zero?
176
177
  gem "kettle-dev", "~> 2.2", ">= 2.2.15"
177
178
  gem "kettle-test", "~> 2.0", ">= 2.0.6"
178
- gem "kettle-soup-cover", "~> 3.0.a", ">= 3.0.0.rc4"
179
+ gem "kettle-soup-cover", "~> 3.0", ">= 3.0.1"
179
180
  else
180
181
  eval_gemfile "gemfiles/modular/local.gemfile"
181
182
  end
@@ -188,8 +189,11 @@ require "nomono/bundler"
188
189
 
189
190
  eval_nomono_gems(
190
191
  gems: %w[kettle-dev kettle-test kettle-soup-cover],
191
- prefix: "KETTLE_RB",
192
- path_env: "KETTLE_RB_DEV",
192
+ prefix: "KETTLE_DEV",
193
+ path_env: "KETTLE_DEV_DEV",
194
+ path_aliases: {
195
+ "/var/home/pboling" => "/home/pboling"
196
+ },
193
197
  vendored_gems_env: "VENDORED_GEMS",
194
198
  vendor_gem_dir_env: "VENDOR_GEM_DIR",
195
199
  debug_env: "KETTLE_DEV_DEBUG"
@@ -198,9 +202,22 @@ eval_nomono_gems(
198
202
 
199
203
  This is the pattern generated by `kettle-jem`: the Gemfile remains readable,
200
204
  and nomono owns the path normalization for sibling repositories. When
201
- `KETTLE_RB_DEV=false` or is unset, the modular local override is skipped and
205
+ `KETTLE_DEV_DEV=false` or is unset, the modular local override is skipped and
202
206
  Bundler resolves released gems normally.
203
207
 
208
+ `nomono` uses an explicit `require "nomono/bundler"` loader instead of the
209
+ Bundler plugin DSL. Bundler plugins are installed extensions for Bundler
210
+ commands, source handlers, and lifecycle hooks; `nomono` only needs to install
211
+ Gemfile macros while Bundler is evaluating a Gemfile. The root Gemfile should
212
+ declare the compatible `nomono` version, and modular local Gemfiles should fail
213
+ normally if that loader is unavailable or incompatible.
214
+
215
+ `nomono` also avoids RubyGems plugin autoload hooks for this path. Those hooks
216
+ are appropriate for gems that must globally patch RubyGems or Bundler before
217
+ dependency resolution can work. Local sibling overrides do not need cold-boot
218
+ global patches: the root Gemfile installs `nomono`, and the ENV-gated modular
219
+ Gemfile explicitly loads the macros only when it needs them.
220
+
204
221
  ## 🔐 Security
205
222
 
206
223
  See [SECURITY.md][🔐security].
@@ -286,7 +303,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases.
286
303
 
287
304
  ## 📄 License
288
305
 
289
- The gem is available under the following license: [AGPL-3.0-only](AGPL-3.0-only.md).
306
+ The gem is available under the following license: [AGPL-3.0-only](https://github.com/kettle-dev/nomono/blob/main/AGPL-3.0-only.md).
290
307
  See [LICENSE.md][📄license] for details.
291
308
 
292
309
  If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license.
@@ -356,6 +373,8 @@ Thanks for RTFM. ☺️
356
373
  [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
357
374
  [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white
358
375
  [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
376
+ [✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white
377
+ [✉️ruby-forum]: https://www.rubyforum.org/c/help/8
359
378
 
360
379
  [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
361
380
  [⛳️gem-namespace]: https://github.com/kettle-dev/nomono
@@ -401,7 +420,7 @@ Thanks for RTFM. ☺️
401
420
  [📜src-gl]: https://gitlab.com/kettle-dev/nomono
402
421
  [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
403
422
  [📜src-cb]: https://codeberg.org/kettle-dev/nomono
404
- [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
423
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green
405
424
  [📜src-gh]: https://github.com/kettle-dev/nomono
406
425
  [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
407
426
  [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
@@ -485,12 +504,12 @@ Thanks for RTFM. ☺️
485
504
  [📌gitmoji]: https://gitmoji.dev
486
505
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
487
506
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
488
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.088-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
507
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.123-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
489
508
  [🔐security]: https://github.com/kettle-dev/nomono/blob/main/SECURITY.md
490
509
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
491
510
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
492
511
  [📄license]: LICENSE.md
493
- [📄license-ref]: AGPL-3.0-only.md
512
+ [📄license-ref]: https://github.com/kettle-dev/nomono/blob/main/AGPL-3.0-only.md
494
513
  [📄license-img]: https://img.shields.io/badge/License-AGPL--3.0--only-259D6C.svg
495
514
  [📄license-compat]: https://www.apache.org/legal/resolved.html#category-x
496
515
  [📄license-compat-img]: https://img.shields.io/badge/Apache_Incompatible:_Category_X-%E2%9C%97-C0392B.svg?style=flat&logo=Apache
@@ -12,7 +12,7 @@ module Nomono
12
12
  end
13
13
 
14
14
  def gems(gems:, prefix: "NOMONO_GEMS", allowlist: gems, path_env: nil, vendored_gems_env: nil, vendor_gem_dir_env: nil,
15
- debug_env: nil, root: ["src", "my"], strict: true)
15
+ debug_env: nil, path_aliases: nil, path_aliases_env: nil, root: ["src", "my"], strict: true, **_options)
16
16
  requested = normalize_gems(gems)
17
17
  allowed = normalize_gems(allowlist)
18
18
  requested.each { |gem_name| validate_gem_name!(gem_name, allowed, strict: strict) }
@@ -25,10 +25,13 @@ module Nomono
25
25
  vendored = parse_vendored(fetch_with_fallback(vendored_gems_env || "#{prefix}_VENDORED_GEMS", "", "VENDORED_GEMS"), allowed)
26
26
  vendor_dir_value = fetch_with_fallback(vendor_gem_dir_env || "#{prefix}_VENDOR_GEM_DIR", File.join(dev_root, "vendor"), "VENDOR_GEM_DIR")
27
27
  vendor_dir = absolutize(vendor_dir_value)
28
+ aliases = normalize_path_aliases(
29
+ path_aliases || fetch_with_fallback(path_aliases_env || "#{prefix}_PATH_ALIASES", "", "NOMONO_PATH_ALIASES")
30
+ )
28
31
 
29
32
  gem_paths = requested.each_with_object({}) do |gem_name, memo|
30
33
  base = vendored.include?(gem_name) ? vendor_dir : dev_root
31
- memo[gem_name] = File.join(base, gem_name)
34
+ memo[gem_name] = normalize_path_alias(File.join(base, gem_name), aliases)
32
35
  end
33
36
 
34
37
  debug_key = debug_env || "#{prefix}_DEBUG"
@@ -86,6 +89,65 @@ module Nomono
86
89
  join_home(path)
87
90
  end
88
91
 
92
+ def normalize_path_aliases(value)
93
+ aliases = case value
94
+ when nil
95
+ []
96
+ when Hash
97
+ value.map { |source, canonical| [source.to_s, canonical.to_s] }
98
+ when Array
99
+ value.map do |entry|
100
+ unless entry.respond_to?(:to_ary) && entry.to_ary.size == 2
101
+ raise Error, "path aliases must be configured as source=canonical pairs"
102
+ end
103
+
104
+ entry.to_ary.map(&:to_s)
105
+ end
106
+ else
107
+ value.to_s.split(",").map do |entry|
108
+ next if entry.strip.empty?
109
+
110
+ source, canonical = entry.split("=", 2).map { |part| part.to_s.strip }
111
+ [source, canonical]
112
+ end.compact
113
+ end
114
+
115
+ aliases.map do |source, canonical|
116
+ validate_path_alias!(source, canonical)
117
+ [strip_trailing_slash(source), strip_trailing_slash(canonical)]
118
+ end.sort_by { |source, _canonical| -source.length }
119
+ end
120
+
121
+ def validate_path_alias!(source, canonical)
122
+ if source.to_s.empty? || canonical.to_s.empty?
123
+ raise Error, "path aliases must be configured as source=canonical pairs"
124
+ end
125
+ unless source.start_with?("/") && canonical.start_with?("/")
126
+ raise Error, "path aliases must use absolute paths"
127
+ end
128
+ return if File.realpath(source) == File.realpath(canonical)
129
+
130
+ raise Error, "path alias #{source}=#{canonical} does not resolve to the same directory"
131
+ rescue SystemCallError => e
132
+ raise Error, "path alias #{source}=#{canonical} cannot be verified: #{e.message}"
133
+ end
134
+
135
+ def normalize_path_alias(path, aliases)
136
+ aliases.each do |source, canonical|
137
+ next unless path == source || path.start_with?("#{source}/")
138
+
139
+ return "#{canonical}#{path.delete_prefix(source)}"
140
+ end
141
+
142
+ path
143
+ end
144
+
145
+ def strip_trailing_slash(path)
146
+ path = path.dup
147
+ path.chop! while path.end_with?("/")
148
+ path
149
+ end
150
+
89
151
  def join_home(*segments)
90
152
  File.join(home, *segments)
91
153
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Nomono
4
4
  module Version
5
- VERSION = "1.0.7"
5
+ VERSION = "1.1.0"
6
6
  end
7
7
  VERSION = Version::VERSION # Traditional Constant Location
8
8
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "version_gem"
4
+ require_relative "version"
5
+
6
+ Nomono::Version.class_eval do
7
+ extend VersionGem::Basic
8
+ end
data/lib/nomono.rb CHANGED
@@ -1,11 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # This gem
4
- require "version_gem"
5
-
6
3
  require_relative "nomono/version"
7
4
  require_relative "nomono/core"
8
-
9
- Nomono::Version.class_eval do
10
- extend VersionGem::Basic
11
- end
data/sig/nomono.rbs CHANGED
@@ -1,3 +1,7 @@
1
1
  module Nomono
2
2
  # See the writing guide of rbs: https://github.com/ruby/rbs#guides
3
+ module Version
4
+ VERSION: String
5
+ end
6
+ VERSION: String
3
7
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nomono
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -37,46 +37,26 @@ cert_chain:
37
37
  -----END CERTIFICATE-----
38
38
  date: 1980-01-02 00:00:00.000000000 Z
39
39
  dependencies:
40
- - !ruby/object:Gem::Dependency
41
- name: version_gem
42
- requirement: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: '1.1'
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: 1.1.13
50
- type: :runtime
51
- prerelease: false
52
- version_requirements: !ruby/object:Gem::Requirement
53
- requirements:
54
- - - "~>"
55
- - !ruby/object:Gem::Version
56
- version: '1.1'
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- version: 1.1.13
60
40
  - !ruby/object:Gem::Dependency
61
41
  name: kettle-dev
62
42
  requirement: !ruby/object:Gem::Requirement
63
43
  requirements:
64
44
  - - "~>"
65
45
  - !ruby/object:Gem::Version
66
- version: '2.2'
46
+ version: '2.3'
67
47
  - - ">="
68
48
  - !ruby/object:Gem::Version
69
- version: 2.2.24
49
+ version: 2.3.7
70
50
  type: :development
71
51
  prerelease: false
72
52
  version_requirements: !ruby/object:Gem::Requirement
73
53
  requirements:
74
54
  - - "~>"
75
55
  - !ruby/object:Gem::Version
76
- version: '2.2'
56
+ version: '2.3'
77
57
  - - ">="
78
58
  - !ruby/object:Gem::Version
79
- version: 2.2.24
59
+ version: 2.3.7
80
60
  - !ruby/object:Gem::Dependency
81
61
  name: bundler-audit
82
62
  requirement: !ruby/object:Gem::Requirement
@@ -131,20 +111,20 @@ dependencies:
131
111
  requirements:
132
112
  - - "~>"
133
113
  - !ruby/object:Gem::Version
134
- version: '3.1'
114
+ version: '3.2'
135
115
  - - ">="
136
116
  - !ruby/object:Gem::Version
137
- version: 3.1.3
117
+ version: 3.2.0
138
118
  type: :development
139
119
  prerelease: false
140
120
  version_requirements: !ruby/object:Gem::Requirement
141
121
  requirements:
142
122
  - - "~>"
143
123
  - !ruby/object:Gem::Version
144
- version: '3.1'
124
+ version: '3.2'
145
125
  - - ">="
146
126
  - !ruby/object:Gem::Version
147
- version: 3.1.3
127
+ version: 3.2.0
148
128
  - !ruby/object:Gem::Dependency
149
129
  name: kettle-test
150
130
  requirement: !ruby/object:Gem::Requirement
@@ -154,7 +134,7 @@ dependencies:
154
134
  version: '2.0'
155
135
  - - ">="
156
136
  - !ruby/object:Gem::Version
157
- version: 2.0.8
137
+ version: 2.0.12
158
138
  type: :development
159
139
  prerelease: false
160
140
  version_requirements: !ruby/object:Gem::Requirement
@@ -164,27 +144,27 @@ dependencies:
164
144
  version: '2.0'
165
145
  - - ">="
166
146
  - !ruby/object:Gem::Version
167
- version: 2.0.8
147
+ version: 2.0.12
168
148
  - !ruby/object:Gem::Dependency
169
149
  name: turbo_tests2
170
150
  requirement: !ruby/object:Gem::Requirement
171
151
  requirements:
172
152
  - - "~>"
173
153
  - !ruby/object:Gem::Version
174
- version: '3.1'
154
+ version: '3.2'
175
155
  - - ">="
176
156
  - !ruby/object:Gem::Version
177
- version: 3.1.5
157
+ version: 3.2.0
178
158
  type: :development
179
159
  prerelease: false
180
160
  version_requirements: !ruby/object:Gem::Requirement
181
161
  requirements:
182
162
  - - "~>"
183
163
  - !ruby/object:Gem::Version
184
- version: '3.1'
164
+ version: '3.2'
185
165
  - - ">="
186
166
  - !ruby/object:Gem::Version
187
- version: 3.1.5
167
+ version: 3.2.0
188
168
  - !ruby/object:Gem::Dependency
189
169
  name: ruby-progressbar
190
170
  requirement: !ruby/object:Gem::Requirement
@@ -208,7 +188,7 @@ dependencies:
208
188
  version: '1.0'
209
189
  - - ">="
210
190
  - !ruby/object:Gem::Version
211
- version: 1.0.4
191
+ version: 1.0.6
212
192
  type: :development
213
193
  prerelease: false
214
194
  version_requirements: !ruby/object:Gem::Requirement
@@ -218,7 +198,7 @@ dependencies:
218
198
  version: '1.0'
219
199
  - - ">="
220
200
  - !ruby/object:Gem::Version
221
- version: 1.0.4
201
+ version: 1.0.6
222
202
  - !ruby/object:Gem::Dependency
223
203
  name: gitmoji-regex
224
204
  requirement: !ruby/object:Gem::Requirement
@@ -228,7 +208,7 @@ dependencies:
228
208
  version: '2.0'
229
209
  - - ">="
230
210
  - !ruby/object:Gem::Version
231
- version: 2.0.3
211
+ version: 2.0.4
232
212
  type: :development
233
213
  prerelease: false
234
214
  version_requirements: !ruby/object:Gem::Requirement
@@ -238,52 +218,35 @@ dependencies:
238
218
  version: '2.0'
239
219
  - - ">="
240
220
  - !ruby/object:Gem::Version
241
- version: 2.0.3
221
+ version: 2.0.4
242
222
  description: 1️⃣ Provides nomono_gems and eval_nomono_gems to standardize local multi-repo
243
223
  dependency wiring in Gemfiles.
244
224
  email:
245
225
  - floss@galtzo.com
246
226
  executables: []
247
227
  extensions: []
248
- extra_rdoc_files:
249
- - CHANGELOG.md
250
- - CITATION.cff
251
- - CODE_OF_CONDUCT.md
252
- - CONTRIBUTING.md
253
- - FUNDING.md
254
- - LICENSE.md
255
- - README.md
256
- - RUBOCOP.md
257
- - SECURITY.md
228
+ extra_rdoc_files: []
258
229
  files:
259
- - AGPL-3.0-only.md
260
230
  - CHANGELOG.md
261
- - CITATION.cff
262
- - CODE_OF_CONDUCT.md
263
- - CONTRIBUTING.md
264
- - FUNDING.md
265
231
  - LICENSE.md
266
232
  - README.md
267
- - RUBOCOP.md
268
- - SECURITY.md
269
- - certs/pboling.pem
270
233
  - lib/nomono.rb
271
234
  - lib/nomono/bundler.rb
272
235
  - lib/nomono/core.rb
273
236
  - lib/nomono/dsl.rb
274
237
  - lib/nomono/resolver.rb
275
238
  - lib/nomono/version.rb
239
+ - lib/nomono/version_gem.rb
276
240
  - sig/nomono.rbs
277
- - sig/nomono/version.rbs
278
241
  homepage: https://github.com/kettle-dev/nomono
279
242
  licenses:
280
243
  - AGPL-3.0-only
281
244
  metadata:
282
245
  homepage_uri: https://nomono.galtzo.com/
283
- source_code_uri: https://github.com/kettle-dev/nomono/tree/v1.0.7
284
- changelog_uri: https://github.com/kettle-dev/nomono/blob/v1.0.7/CHANGELOG.md
246
+ source_code_uri: https://github.com/kettle-dev/nomono/tree/v1.1.0
247
+ changelog_uri: https://github.com/kettle-dev/nomono/blob/v1.1.0/CHANGELOG.md
285
248
  bug_tracker_uri: https://github.com/kettle-dev/nomono/issues
286
- documentation_uri: https://www.rubydoc.info/gems/nomono/1.0.7
249
+ documentation_uri: https://www.rubydoc.info/gems/nomono/1.1.0
287
250
  funding_uri: https://github.com/sponsors/pboling
288
251
  wiki_uri: https://github.com/kettle-dev/nomono/wiki
289
252
  news_uri: https://www.railsbling.com/tags/nomono
@@ -312,7 +275,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
312
275
  - !ruby/object:Gem::Version
313
276
  version: '0'
314
277
  requirements: []
315
- rubygems_version: 4.0.10
278
+ rubygems_version: 4.0.16
316
279
  specification_version: 4
317
280
  summary: 1️⃣ ENV-driven Gemfile macros for sibling gem path resolution
318
281
  test_files: []
metadata.gz.sig CHANGED
Binary file