hiiro 0.1.148 → 0.1.149

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: 6853495ad221de1f2f059def5cb33cab82c6e7466197d2a8bcc2ae9553b8b21f
4
- data.tar.gz: '08a332bb67dc2b0593d5673bb88470ac15b5ebe89fdfa278b176efe6ad3d95eb'
3
+ metadata.gz: f67c9b0a2688514af184098d8c69497f0fe09adb4a91a4e41b17596a4069e352
4
+ data.tar.gz: c6f3ef4544274739bdbdde419a25101948d5af2119d0da2b6015a580864d80ec
5
5
  SHA512:
6
- metadata.gz: afb939d7ac0dd3a8cabdbed74468962df605d3af66cdb485ff6d503cb46bed0e9fe0d23b854eef3a8b711fde269087fa3bc816ad60ca151d7d6e242a65621161
7
- data.tar.gz: 0db711deda38e8a804c0bcc9315329c3e944fc63872f4d319dfaa2ff2fd6f211eef1873202cd41219bb2906448f696945af518ad095012f98363a6bbf18e27d7
6
+ metadata.gz: 00e92bb9a9186cea72209f320df3b43c3e3f1537596ddecd78d740d0c87ba42b7f9ccd1c250b36e6fa331371875fdf15b2f0d8baf2d7b115b76ec64183aeb9aa
7
+ data.tar.gz: 16e4b2d2af8857cd4d1bd7739add2d919466d58b2c0c9806371079344d8c094a66c75c32f49766efc36eda4dde6a5113c3bfde1710719919912745709d210429
@@ -7,6 +7,7 @@ class Hiiro
7
7
  CONFIG_FILE = File.join(Dir.home, '.config', 'hiiro', 'services.yml')
8
8
  STATE_DIR = File.join(Dir.home, '.config', 'hiiro', 'services')
9
9
  STATE_FILE = File.join(STATE_DIR, 'running.yml')
10
+ ENV_TEMPLATES_DIR = File.join(Dir.home, '.config', 'hiiro', 'env_templates')
10
11
 
11
12
  attr_reader :config_file, :state_file
12
13
 
@@ -30,6 +31,94 @@ class Hiiro
30
31
  { name: svc_name, **symbolize_keys(configs[svc_name]) }
31
32
  end
32
33
 
34
+ def find_group(name)
35
+ configs = services
36
+ names = configs.keys.select { |k| configs[k].is_a?(Hash) && configs[k].key?('services') }
37
+ return nil if names.empty?
38
+
39
+ structs = names.map { |k| OpenStruct.new(name: k) }
40
+ result = Hiiro::Matcher.new(structs, :name).by_prefix(name)
41
+ match = result.resolved || result.first
42
+ return nil unless match
43
+
44
+ group_name = match.item.name
45
+ { name: group_name, **symbolize_keys(configs[group_name]) }
46
+ end
47
+
48
+ def prepare_env(svc_name, variation_overrides: {})
49
+ svc = find_service(svc_name)
50
+ return unless svc
51
+
52
+ env_vars = svc[:env_vars]
53
+ return unless env_vars || svc[:base_env]
54
+
55
+ base_dir = svc[:base_dir]
56
+ env_file = svc[:env_file]
57
+ base_env = svc[:base_env]
58
+
59
+ # Copy base env template if configured
60
+ if base_env && env_file && base_dir
61
+ src = File.join(ENV_TEMPLATES_DIR, base_env)
62
+ dest = File.join(base_dir, env_file)
63
+ if File.exist?(src)
64
+ FileUtils.mkdir_p(File.dirname(dest))
65
+ FileUtils.cp(src, dest)
66
+ end
67
+ end
68
+
69
+ # Inject variation values into env file
70
+ return unless env_vars && env_file && base_dir
71
+
72
+ dest = File.join(base_dir, env_file)
73
+ lines = File.exist?(dest) ? File.readlines(dest) : []
74
+
75
+ env_vars.each do |var_name, var_config|
76
+ next unless var_config.is_a?(Hash) && var_config['variations']
77
+
78
+ variation = (variation_overrides[var_name] || variation_overrides[var_name.to_sym] || 'local').to_s
79
+ value = var_config['variations'][variation]
80
+ next unless value
81
+
82
+ # Replace existing line or append
83
+ replaced = false
84
+ lines.map! do |line|
85
+ if line.match?(/\A#{Regexp.escape(var_name)}=/)
86
+ replaced = true
87
+ "#{var_name}=#{value}\n"
88
+ else
89
+ line
90
+ end
91
+ end
92
+ lines << "#{var_name}=#{value}\n" unless replaced
93
+ end
94
+
95
+ File.write(dest, lines.join)
96
+ end
97
+
98
+ def start_group(name, tmux_info: {}, task_info: {})
99
+ group = find_group(name)
100
+ unless group
101
+ puts "Group '#{name}' not found"
102
+ return false
103
+ end
104
+
105
+ members = group[:services]
106
+ unless members && !members.empty?
107
+ puts "Group '#{group[:name]}' has no services"
108
+ return false
109
+ end
110
+
111
+ puts "Starting group '#{group[:name]}'..."
112
+ members.each do |member|
113
+ member_name = member['name'] || member[:name]
114
+ use_overrides = member['use'] || member[:use] || {}
115
+
116
+ prepare_env(member_name, variation_overrides: use_overrides)
117
+ start(member_name, tmux_info: tmux_info, task_info: task_info, skip_env: true)
118
+ end
119
+ true
120
+ end
121
+
33
122
  def running?(name)
34
123
  state = load_state
35
124
  state.key?(name)
@@ -39,7 +128,7 @@ class Hiiro
39
128
  load_state
40
129
  end
41
130
 
42
- def start(name, tmux_info: {}, task_info: {})
131
+ def start(name, tmux_info: {}, task_info: {}, variation_overrides: {}, skip_env: false)
43
132
  svc = find_service(name)
44
133
  unless svc
45
134
  puts "Service '#{name}' not found"
@@ -54,6 +143,11 @@ class Hiiro
54
143
  return false
55
144
  end
56
145
 
146
+ # Prepare env file unless already handled by start_group
147
+ unless skip_env
148
+ prepare_env(svc_name, variation_overrides: variation_overrides)
149
+ end
150
+
57
151
  # Run init commands
58
152
  if svc[:init]
59
153
  svc[:init].each do |cmd|
@@ -283,12 +377,24 @@ class Hiiro
283
377
  h.run_subcmd(:ls)
284
378
  end
285
379
 
286
- h.add_subcmd(:start) do |svc_name=nil|
380
+ h.add_subcmd(:start) do |svc_name=nil, *extra_args|
287
381
  unless svc_name
288
- puts "Usage: service start <name>"
382
+ puts "Usage: service start <name> [--use VAR=variation ...]"
289
383
  next
290
384
  end
291
385
 
386
+ # Parse --use flags from extra_args
387
+ variation_overrides = {}
388
+ extra_args.each_with_index do |arg, i|
389
+ if arg == '--use' && extra_args[i + 1]
390
+ key, val = extra_args[i + 1].split('=', 2)
391
+ variation_overrides[key] = val if key && val
392
+ elsif arg.start_with?('--use=')
393
+ key, val = arg.sub('--use=', '').split('=', 2)
394
+ variation_overrides[key] = val if key && val
395
+ end
396
+ end
397
+
292
398
  tmux_info = {
293
399
  session: ENV['TMUX'] ? `tmux display-message -p '#S'`.chomp : nil,
294
400
  window: ENV['TMUX'] ? `tmux display-message -p '#I'`.chomp : nil,
@@ -308,7 +414,13 @@ class Hiiro
308
414
  end
309
415
  end
310
416
 
311
- sm.start(svc_name, tmux_info: tmux_info, task_info: task_info)
417
+ # Check if it's a group or individual service
418
+ group = sm.find_group(svc_name)
419
+ if group
420
+ sm.start_group(svc_name, tmux_info: tmux_info, task_info: task_info)
421
+ else
422
+ sm.start(svc_name, tmux_info: tmux_info, task_info: task_info, variation_overrides: variation_overrides)
423
+ end
312
424
  end
313
425
 
314
426
  h.add_subcmd(:stop) do |svc_name=nil|
@@ -433,6 +545,61 @@ class Hiiro
433
545
  editor = ENV['EDITOR'] || 'nvim'
434
546
  system(editor, sm.config_file)
435
547
  end
548
+
549
+ h.add_subcmd(:groups) do
550
+ configs = sm.services
551
+ groups = configs.select { |_, v| v.is_a?(Hash) && v.key?('services') }
552
+
553
+ if groups.empty?
554
+ puts "No service groups configured."
555
+ next
556
+ end
557
+
558
+ puts "Service groups:"
559
+ puts
560
+ groups.each do |name, cfg|
561
+ members = (cfg['services'] || []).map { |m| m['name'] || m[:name] }.compact
562
+ puts format(" %-20s %s", name, members.join(', '))
563
+ end
564
+ end
565
+
566
+ h.add_subcmd(:env) do |svc_name=nil|
567
+ unless svc_name
568
+ puts "Usage: service env <name>"
569
+ next
570
+ end
571
+
572
+ svc = sm.find_service(svc_name)
573
+ unless svc
574
+ puts "Service '#{svc_name}' not found"
575
+ next
576
+ end
577
+
578
+ env_vars = svc[:env_vars]
579
+ unless env_vars
580
+ puts "No env_vars configured for '#{svc[:name]}'"
581
+ next
582
+ end
583
+
584
+ puts "Env vars for '#{svc[:name]}':"
585
+ puts
586
+ env_vars.each do |var_name, var_config|
587
+ next unless var_config.is_a?(Hash) && var_config['variations']
588
+
589
+ puts " #{var_name}:"
590
+ var_config['variations'].each do |variation, value|
591
+ puts " #{variation}: #{value}"
592
+ end
593
+ end
594
+
595
+ if svc[:base_env]
596
+ puts
597
+ puts "Base env template: #{svc[:base_env]}"
598
+ end
599
+ if svc[:env_file]
600
+ puts "Env file: #{svc[:env_file]}"
601
+ end
602
+ end
436
603
  end
437
604
  end
438
605
 
data/lib/hiiro/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Hiiro
2
- VERSION = "0.1.148"
2
+ VERSION = "0.1.149"
3
3
  end
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.148
4
+ version: 0.1.149
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Toyota