hiiro 0.1.276 → 0.1.277

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: dbb35ade8607567d50414b9afd843402eb78317a3c3c2354a3361e582050850d
4
- data.tar.gz: d2f02c76fc3121282ab489c7e997b3b54e60ab8f8103e7a1f7fb69ccdd65313b
3
+ metadata.gz: 3c0ebae864202a90016b7b7df7f65a32836cc11c144ea85638a9c75b22279b72
4
+ data.tar.gz: 9a5e414ec3dc428f932acdaf47f989c80d2ca50a1fd19fe4d2d7fa9e4c634a76
5
5
  SHA512:
6
- metadata.gz: 69a8cf3d7cdf9cac920e4c9c7ab671931918f58e6b83bf431eeff7548729cda101466b00d8e04eb2697ce9048511e9af48580ab5983eccf5b953547e308868aa
7
- data.tar.gz: c8a03d151fdd60e32325f00f5a93b3cca71297eb215cd22f059db913325cbfef9fde163b368bfc0fd7f7e109a929ff2752c8a82653192c07f7fc965741a9b5b6
6
+ metadata.gz: 4cbdc7c7029c4acfbf6720c47d63d330bb71c270ba1546d76e743a6c05fef40f98229458a39d981627fb49767fac3c63e745b681e12ddde30e180b251ac94087
7
+ data.tar.gz: 3a95e13a5ebc85325d8426d398812499924bc8605f7e5e0e785cbb16b3ffafa6161ec7d04d1ff72387286779f8142bcff3f338348c35791192b1d97c72e5f780
data/CHANGELOG.md CHANGED
@@ -1 +1,6 @@
1
- Done. CHANGELOG.md updated with v0.1.276 entry at the top.
1
+ Done. Updated CHANGELOG.md:
2
+
3
+ - Moved `Hiiro#add_resolver` and `Hiiro#resolve` from the Unreleased section to the new v0.1.277 release section (2026-03-24)
4
+ - Added them to the Added subsection of v0.1.277
5
+ - Added a Changed entry documenting the `h pr` refactoring that uses these new methods
6
+ - Updated the Unreleased section to remove these items and add a note in Changed about the `h pr` refactoring
data/bin/h-pr CHANGED
@@ -589,46 +589,48 @@ FILTER_OPTS = Proc.new {
589
589
  Hiiro.run(*ARGV, plugins: [Pins]) do
590
590
  pinned_manager = PinnedPRManager.new
591
591
 
592
- resolve_pr = ->(ref) {
593
- if ref.nil?
592
+ add_resolver(:pr,
593
+ -> {
594
594
  pinned = pinned_manager.load_pinned
595
595
  if pinned.empty?
596
596
  STDERR.puts "No tracked PRs. Use a PR number or 'h pr track' to track PRs."
597
- return nil
598
- end
599
- lines = pinned.each_with_index.each_with_object({}) do |(pr, idx), h|
600
- h[pinned_manager.strip_ansi(pinned_manager.display_pinned(pr, idx, oneline: true))] = pr.number.to_s
597
+ nil
598
+ else
599
+ lines = pinned.each_with_index.each_with_object({}) do |(pr, idx), h|
600
+ h[pinned_manager.strip_ansi(pinned_manager.display_pinned(pr, idx, oneline: true))] = pr.number.to_s
601
+ end
602
+ fuzzyfind_from_map(lines)
601
603
  end
602
- return fuzzyfind_from_map(lines)
603
- end
604
-
604
+ }
605
+ ) do |ref|
605
606
  if (pin_value = pins.get(ref.to_s))
606
- return pin_value
607
- end
608
-
609
- pinned = pinned_manager.load_pinned
610
-
611
- if pinned.any? { |pr| pr.number.to_s == ref.to_s }
612
- return ref.to_s
613
- end
614
-
615
- if ref.to_s =~ /^\d+$/ && ref.to_i > 0
616
- slot = ref.to_i
617
- by_slot = pinned.find { |p| p.slot.to_i == slot }
618
- return by_slot.number.to_s if by_slot
619
- # Fall back to 1-based index for unslotted data
620
- idx = slot - 1
621
- return pinned[idx].number.to_s if idx < pinned.length
607
+ pin_value
608
+ else
609
+ pinned = pinned_manager.load_pinned
610
+ if pinned.any? { |pr| pr.number.to_s == ref.to_s }
611
+ ref.to_s
612
+ elsif ref.to_s =~ /^\d+$/ && ref.to_i > 0
613
+ slot = ref.to_i
614
+ by_slot = pinned.find { |p| p.slot.to_i == slot }
615
+ if by_slot
616
+ by_slot.number.to_s
617
+ elsif slot - 1 < pinned.length
618
+ # Fall back to 1-based index for unslotted data
619
+ pinned[slot - 1].number.to_s
620
+ else
621
+ ref.to_s
622
+ end
623
+ else
624
+ ref.to_s
625
+ end
622
626
  end
623
-
624
- ref.to_s
625
- }
627
+ end
626
628
 
627
629
  watch_block = ->(original_pr_number=nil, *watch_args) {
628
630
  watch = get_value(:watch)
629
631
  fail_fast = get_value(:fail_fast)
630
632
 
631
- pr_number = resolve_pr.call(original_pr_number)
633
+ pr_number = resolve(:pr, original_pr_number)
632
634
  return unless pr_number
633
635
 
634
636
  base_cmd = %w[gh pr checks]
@@ -678,7 +680,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
678
680
  }
679
681
 
680
682
  add_subcmd(:link) { |ref=nil|
681
- pr_number = resolve_pr.call(ref)
683
+ pr_number = resolve(:pr, ref)
682
684
  next unless pr_number
683
685
 
684
686
  pinned = pinned_manager.load_pinned
@@ -709,14 +711,14 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
709
711
  next
710
712
  end
711
713
  end
712
- pr_number = resolve_pr.call(pr_number)
714
+ pr_number = resolve(:pr, pr_number)
713
715
  next unless pr_number
714
716
  pinned = pinned_manager.load_pinned
715
717
  pr = pinned.find { |p| p.number.to_s == pr_number.to_s }
716
718
  pr&.url ? system('open', pr.url) : system('gh', 'pr', 'view', pr_number.to_s, '--web')
717
719
  }
718
720
  add_subcmd(:view) { |pr_number=nil|
719
- pr_number = resolve_pr.call(pr_number)
721
+ pr_number = resolve(:pr, pr_number)
720
722
  system('gh', 'pr', 'view', pr_number.to_s) if pr_number
721
723
  }
722
724
 
@@ -1124,7 +1126,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
1124
1126
  end
1125
1127
 
1126
1128
  add_subcmd(:attach) do |ref = nil|
1127
- pr_number = resolve_pr.call(ref)
1129
+ pr_number = resolve(:pr, ref)
1128
1130
  next unless pr_number
1129
1131
 
1130
1132
  pinned = pinned_manager.load_pinned
@@ -1222,13 +1224,13 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
1222
1224
  # === PR State ===
1223
1225
 
1224
1226
  add_subcmd(:ready) do |ref = nil|
1225
- pr_number = resolve_pr.call(ref)
1227
+ pr_number = resolve(:pr, ref)
1226
1228
  next unless pr_number
1227
1229
  system('gh', 'pr', 'ready', pr_number.to_s)
1228
1230
  end
1229
1231
 
1230
1232
  add_subcmd(:'to-draft') do |ref = nil|
1231
- pr_number = resolve_pr.call(ref)
1233
+ pr_number = resolve(:pr, ref)
1232
1234
  next unless pr_number
1233
1235
  system('gh', 'pr', 'ready', '--draft', pr_number.to_s)
1234
1236
  end
@@ -1236,25 +1238,25 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
1236
1238
  # === PR Actions ===
1237
1239
 
1238
1240
  add_subcmd(:diff) do |ref = nil|
1239
- pr_number = resolve_pr.call(ref)
1241
+ pr_number = resolve(:pr, ref)
1240
1242
  next unless pr_number
1241
1243
  system('gh', 'pr', 'diff', pr_number.to_s)
1242
1244
  end
1243
1245
 
1244
1246
  add_subcmd(:checkout) do |ref = nil|
1245
- pr_number = resolve_pr.call(ref)
1247
+ pr_number = resolve(:pr, ref)
1246
1248
  next unless pr_number
1247
1249
  system('gh', 'pr', 'checkout', pr_number.to_s)
1248
1250
  end
1249
1251
 
1250
1252
  add_subcmd(:merge) do |ref = nil, *merge_args|
1251
- pr_number = resolve_pr.call(ref)
1253
+ pr_number = resolve(:pr, ref)
1252
1254
  next unless pr_number
1253
1255
  system('gh', 'pr', 'merge', pr_number.to_s, *merge_args)
1254
1256
  end
1255
1257
 
1256
1258
  add_subcmd(:sync) do |ref = nil|
1257
- pr_number = resolve_pr.call(ref)
1259
+ pr_number = resolve(:pr, ref)
1258
1260
  next unless pr_number
1259
1261
 
1260
1262
  print "Syncing ##{pr_number} with base branch (rebase)... "
@@ -1299,7 +1301,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
1299
1301
  else
1300
1302
  # Resolve each positional arg as a PR ref
1301
1303
  opts.args.map { |ref|
1302
- pr_num = resolve_pr.call(ref)
1304
+ pr_num = resolve(:pr, ref)
1303
1305
  next nil unless pr_num
1304
1306
  pinned.find { |p| p.number.to_s == pr_num.to_s }
1305
1307
  }.compact
@@ -1343,7 +1345,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
1343
1345
  end
1344
1346
 
1345
1347
  add_subcmd(:comment) do |ref = nil|
1346
- pr_number = resolve_pr.call(ref)
1348
+ pr_number = resolve(:pr, ref)
1347
1349
  next unless pr_number
1348
1350
 
1349
1351
  tmpfile = Tempfile.new(['pr-comment-', '.md'])
@@ -1419,7 +1421,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
1419
1421
  template_path = fuzzyfind_from_map(template_map)
1420
1422
  next unless template_path
1421
1423
 
1422
- pr_number = resolve_pr.call(ref)
1424
+ pr_number = resolve(:pr, ref)
1423
1425
  next unless pr_number
1424
1426
 
1425
1427
  body = File.read(template_path).strip
@@ -1525,7 +1527,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
1525
1527
  next
1526
1528
  end
1527
1529
 
1528
- pr_number = resolve_pr.call(ref)
1530
+ pr_number = resolve(:pr, ref)
1529
1531
  next unless pr_number
1530
1532
 
1531
1533
  pinned = pinned_manager.load_pinned
@@ -1548,7 +1550,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
1548
1550
  next
1549
1551
  end
1550
1552
 
1551
- pr_number = resolve_pr.call(ref)
1553
+ pr_number = resolve(:pr, ref)
1552
1554
  next unless pr_number
1553
1555
 
1554
1556
  pinned = pinned_manager.load_pinned
@@ -1900,10 +1902,10 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
1900
1902
  next
1901
1903
  end
1902
1904
 
1903
- pr_number = resolve_pr.call(ref)
1905
+ pr_number = resolve(:pr, ref)
1904
1906
  next unless pr_number
1905
1907
 
1906
- dep_numbers = dep_refs.map { |r| resolve_pr.call(r) }.compact
1908
+ dep_numbers = dep_refs.map { |r| resolve(:pr, r) }.compact
1907
1909
  if dep_numbers.empty?
1908
1910
  puts "No valid dependency PRs resolved"
1909
1911
  next
@@ -1927,7 +1929,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
1927
1929
  next
1928
1930
  end
1929
1931
 
1930
- pr_number = resolve_pr.call(ref)
1932
+ pr_number = resolve(:pr, ref)
1931
1933
  next unless pr_number
1932
1934
 
1933
1935
  pinned = pinned_manager.load_pinned
@@ -1941,7 +1943,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
1941
1943
  pr.depends_on = nil
1942
1944
  puts "Cleared all dependencies from ##{pr_number}"
1943
1945
  else
1944
- dep_numbers = dep_refs.map { |r| resolve_pr.call(r) }.compact.map(&:to_i)
1946
+ dep_numbers = dep_refs.map { |r| resolve(:pr, r) }.compact.map(&:to_i)
1945
1947
  pr.depends_on = (Array(pr.depends_on) - dep_numbers).then { |d| d.empty? ? nil : d }
1946
1948
  puts "Removed dep(s) #{dep_numbers.map { |n| "##{n}" }.join(', ')} from ##{pr_number}"
1947
1949
  puts " Remaining: #{Array(pr.depends_on).map { |n| "##{n}" }.join(', ').then { |s| s.empty? ? '(none)' : s }}"
@@ -1954,7 +1956,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
1954
1956
  pinned = pinned_manager.load_pinned
1955
1957
 
1956
1958
  if ref
1957
- pr_number = resolve_pr.call(ref)
1959
+ pr_number = resolve(:pr, ref)
1958
1960
  next unless pr_number
1959
1961
  pr = pinned.find { |p| p.number.to_s == pr_number.to_s }
1960
1962
  unless pr
data/lib/hiiro/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Hiiro
2
- VERSION = "0.1.276"
2
+ VERSION = "0.1.277"
3
3
  end
data/lib/hiiro.rb CHANGED
@@ -199,7 +199,14 @@ class Hiiro
199
199
 
200
200
  child_bin_name = [bin, child_subcmd.to_s].join(?-)
201
201
 
202
- Hiiro.init(bin_name: child_bin_name, args: child_args, **kwargs, &block)
202
+ parent_resolvers = @resolvers&.dup
203
+
204
+ wrapper = lambda do |h|
205
+ h.instance_variable_set(:@resolvers, parent_resolvers.dup) if parent_resolvers
206
+ block.arity == 1 ? block.call(h) : h.instance_eval(&block) if block
207
+ end
208
+
209
+ Hiiro.init(bin_name: child_bin_name, args: child_args, **kwargs, &wrapper)
203
210
  end
204
211
 
205
212
  def run_child(custom_subcmd=nil, custom_args=nil, **kwargs, &block)
@@ -286,6 +293,22 @@ class Hiiro
286
293
  options.flag(name, **kwargs)
287
294
  end
288
295
 
296
+ def add_resolver(name, current = nil, &lookup)
297
+ @resolvers ||= {}
298
+ @resolvers[name.to_sym] = { current:, lookup: }
299
+ end
300
+
301
+ def resolve(name, ref = nil)
302
+ @resolvers ||= {}
303
+ r = @resolvers[name.to_sym] or raise "No resolver registered for :#{name}"
304
+ if ref.nil?
305
+ c = r[:current]
306
+ c.respond_to?(:call) ? c.call : c
307
+ else
308
+ r[:lookup]&.call(ref)
309
+ end
310
+ end
311
+
289
312
  def add_cmd(*names, args: [], opts: [], &block)
290
313
  cmd_opts = options.select(opts)
291
314
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hiiro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.276
4
+ version: 0.1.277
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Toyota