hackmac 1.2.1 → 1.3.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: 0a23e0590d9f48c2f7b18432140531bc240f91e67bb5e459c6786d451920db43
4
- data.tar.gz: efe3f22eb263b39b20722cb98bd249d3ef26f832ce4e77252a15a7bfcc3c8718
3
+ metadata.gz: 59f8d61d5c86ebfc3dc59e41fba9c82bde1ee0bb2aa95396ff6c878165ff37c6
4
+ data.tar.gz: 95932d40323add3994a44450337c9209be21f8378509c60ec512151e8a6ada31
5
5
  SHA512:
6
- metadata.gz: 81dc68295902e4a986c3356fc13645549df3c9fa1e2c49b465ce32911f99ceda5c8abd028f9aab41b5c4d87c2afaf9d6af98fc9fcb1c02dd415bd2c54ef35011
7
- data.tar.gz: fe12bed6b4bbabdfb002b16bfbc3c6d1bdc1c363da20b9d4d960c72d11fb9f8622ae3dd8dc8416de0388400167b3988c53ccc0d2b0f1fb5b98c2a63d91e5630a
6
+ metadata.gz: 8af76a612daf738c8d4fb8423f8570e053d5db96696d3627d1413f391d8e1a6028e0331e915860e96742c6abe88295df0b41b459aa7f2621e4cb4b12f3f91eda
7
+ data.tar.gz: e4ac35e14b25e5c111eb4fe7d4bb7a25edd602afb667beb94e3d8302e2974bdbf229776e2f418e0a27c5f1089abfa844c3398b30df376f08b7243424c7aa73f8
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.1
1
+ 1.3.0
data/bin/gfxmon CHANGED
@@ -45,18 +45,11 @@ def ps
45
45
  }
46
46
  end
47
47
 
48
- def format_bytes(n, v)
49
- if n =~ /bytes/i
50
- Tins::Unit.format(v, format: '%.3f%U', unit: '')
51
- else
52
- v.to_s
53
- end
54
- end
55
-
56
48
  def list(ps)
57
49
  max = ps.keys.max_by(&:size)&.size&.to_i
50
+ graph = Hackmac::Graph.new(title: '')
58
51
  puts ps.map { |n, v|
59
- ("%-#{max}s" % n) + " " + ("%s" % format_bytes(n, v)).bold
52
+ ("%-#{max}s" % n) + " " + ("%s" % graph.send(derive_formatter(n), v)).bold
60
53
  }
61
54
  end
62
55
 
@@ -87,75 +80,36 @@ def choose_metric(ps)
87
80
  fail "Metric #{metric} not known"
88
81
  end
89
82
 
83
+ def derive_formatter(metric)
84
+ case metric
85
+ when /bytes/i
86
+ :as_bytes
87
+ when /Hz/
88
+ :as_hertz
89
+ when /\(C\)/
90
+ :as_celsius
91
+ when /\(%\)/
92
+ :as_percent
93
+ else
94
+ :as_default
95
+ end
96
+ end
97
+
90
98
  def display_graph
91
99
  if metric = choose_metric(ps)
92
100
  sleep_duration = [ 1, ($opts[?n] || 10).to_i ].max
93
- data = []
94
- print hide_cursor
95
- at_exit do
96
- print reset, clear_screen, move_home, show_cursor
97
- end
98
- trap(:SIGWINCH) {
99
- lines, cols = Tins::Terminal.winsize
100
- print clear_screen,
101
- move_to(lines / 2, (cols - "Zzz…".size) / 2) { "Zzz…".italic }
102
- }
103
- loop do
104
- print clear_screen
105
-
106
- lines, cols = Tins::Terminal.winsize
107
-
108
- as_title = -> t {
109
- move_to(lines, (cols - t.size) / 2) { t.bold }
110
- }
111
-
112
- case value = ps[metric]
113
- when Float
114
- data << value
115
- else
116
- data << value.to_i
117
- end
118
- data = data.last(cols)
119
-
120
- y_width = (data.max - data.min).to_f
121
- if y_width == 0
122
- print(
123
- as_title.("#{metric} / #{sleep_duration}s"),
124
- move_to(lines / 2, (cols - "no data".size) / 2) { "no data".italic }
125
- )
126
- sleep sleep_duration
127
- print clear_screen
128
- next
129
- end
130
-
131
- unless c = $opts[?c]
132
- cs = (21..226).select { |d|
133
- Term::ANSIColor::Attribute[d].to_rgb_triple.to_hsl_triple.
134
- lightness < 40
135
- }
136
- c = cs[ metric.bytes.reduce(0, :+) % cs.size ]
137
- end
138
- color = Term::ANSIColor::Attribute[c]
139
- color_light = color.to_rgb_triple.to_hsl_triple.lighten(15) rescue color
140
-
141
- data.each_with_index do |value, x|
142
- x = x + cols - data.size + 1
143
- y = lines - (((value - data.min) * lines / y_width)).round + 1
144
- y.upto(lines) do |iy|
145
- print move_to(iy, x) { ' '.on_color(y == iy ? color : color_light) }
146
- end
147
- end
148
-
149
- print(
150
- as_title.("#{metric} #{format_bytes(metric, data.last)} / #{sleep_duration}s"),
151
- move_home { format_bytes(metric, data.max).bold },
152
- move_to_line(lines) { format_bytes(metric, data.min).bold }
153
- )
154
-
155
- sleep sleep_duration
156
- end
101
+ format_value = derive_formatter(metric)
102
+ graph = Hackmac::Graph.new(
103
+ title: metric,
104
+ sleep: sleep_duration,
105
+ value: -> _ { ps[metric] },
106
+ color: $opts[?c],
107
+ format_value:
108
+ )
109
+ graph.start
157
110
  end
158
- rescue Interrupt
111
+ ensure
112
+ graph&.stop
159
113
  end
160
114
 
161
115
  case
data/hackmac.gemspec CHANGED
@@ -1,19 +1,19 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: hackmac 1.2.1 ruby lib
2
+ # stub: hackmac 1.3.0 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "hackmac".freeze
6
- s.version = "1.2.1"
6
+ s.version = "1.3.0"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Florian Frank".freeze]
11
- s.date = "2023-05-14"
11
+ s.date = "2023-05-27"
12
12
  s.description = "This ruby gem provides some useful tools for working with a Hackintosh.".freeze
13
13
  s.email = "flori@ping.de".freeze
14
14
  s.executables = ["efi".freeze, "gfxmon".freeze, "usb".freeze]
15
- s.extra_rdoc_files = ["README.md".freeze, "lib/hackmac.rb".freeze, "lib/hackmac/asset_tools.rb".freeze, "lib/hackmac/config.rb".freeze, "lib/hackmac/disks.rb".freeze, "lib/hackmac/github_source.rb".freeze, "lib/hackmac/kext.rb".freeze, "lib/hackmac/kext_upgrader.rb".freeze, "lib/hackmac/oc.rb".freeze, "lib/hackmac/oc_upgrader.rb".freeze, "lib/hackmac/oc_validator.rb".freeze, "lib/hackmac/plist.rb".freeze, "lib/hackmac/url_download.rb".freeze, "lib/hackmac/utils.rb".freeze, "lib/hackmac/version.rb".freeze]
16
- s.files = [".gitignore".freeze, "Gemfile".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "bin/efi".freeze, "bin/gfxmon".freeze, "bin/usb".freeze, "hackmac.gemspec".freeze, "lib/hackmac.rb".freeze, "lib/hackmac/asset_tools.rb".freeze, "lib/hackmac/config.rb".freeze, "lib/hackmac/disks.rb".freeze, "lib/hackmac/github_source.rb".freeze, "lib/hackmac/hackmac.yml".freeze, "lib/hackmac/kext.rb".freeze, "lib/hackmac/kext_upgrader.rb".freeze, "lib/hackmac/oc.rb".freeze, "lib/hackmac/oc_upgrader.rb".freeze, "lib/hackmac/oc_validator.rb".freeze, "lib/hackmac/plist.rb".freeze, "lib/hackmac/url_download.rb".freeze, "lib/hackmac/utils.rb".freeze, "lib/hackmac/version.rb".freeze]
15
+ s.extra_rdoc_files = ["README.md".freeze, "lib/hackmac.rb".freeze, "lib/hackmac/asset_tools.rb".freeze, "lib/hackmac/config.rb".freeze, "lib/hackmac/disks.rb".freeze, "lib/hackmac/github_source.rb".freeze, "lib/hackmac/graph.rb".freeze, "lib/hackmac/kext.rb".freeze, "lib/hackmac/kext_upgrader.rb".freeze, "lib/hackmac/oc.rb".freeze, "lib/hackmac/oc_upgrader.rb".freeze, "lib/hackmac/oc_validator.rb".freeze, "lib/hackmac/plist.rb".freeze, "lib/hackmac/url_download.rb".freeze, "lib/hackmac/utils.rb".freeze, "lib/hackmac/version.rb".freeze]
16
+ s.files = [".gitignore".freeze, "Gemfile".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "bin/efi".freeze, "bin/gfxmon".freeze, "bin/usb".freeze, "hackmac.gemspec".freeze, "lib/hackmac.rb".freeze, "lib/hackmac/asset_tools.rb".freeze, "lib/hackmac/config.rb".freeze, "lib/hackmac/disks.rb".freeze, "lib/hackmac/github_source.rb".freeze, "lib/hackmac/graph.rb".freeze, "lib/hackmac/hackmac.yml".freeze, "lib/hackmac/kext.rb".freeze, "lib/hackmac/kext_upgrader.rb".freeze, "lib/hackmac/oc.rb".freeze, "lib/hackmac/oc_upgrader.rb".freeze, "lib/hackmac/oc_validator.rb".freeze, "lib/hackmac/plist.rb".freeze, "lib/hackmac/url_download.rb".freeze, "lib/hackmac/utils.rb".freeze, "lib/hackmac/version.rb".freeze]
17
17
  s.homepage = "http://github.com/flori/hackmac".freeze
18
18
  s.rdoc_options = ["--title".freeze, "Hackmac - Some useful tools for working with a Hackintosh".freeze, "--main".freeze, "README.md".freeze]
19
19
  s.rubygems_version = "3.3.26".freeze
@@ -0,0 +1,176 @@
1
+ require 'term/ansicolor'
2
+ require 'tins'
3
+
4
+ class Hackmac::Graph
5
+ include Term::ANSIColor
6
+
7
+ def initialize(title:, value: -> i { 0 }, format_value: nil, sleep: nil, color: nil)
8
+ @title = title
9
+ @value = value
10
+ @format_value = format_value
11
+ @sleep = sleep
12
+ @continue = false
13
+ @data = []
14
+ @color = color
15
+ end
16
+
17
+ def start
18
+ install_handlers
19
+ full_reset
20
+ perform hide_cursor
21
+ @continue = true
22
+ start_loop
23
+ end
24
+
25
+ def stop
26
+ full_reset
27
+ @continue = false
28
+ end
29
+
30
+ private
31
+
32
+ def start_loop
33
+ full_reset
34
+ color = pick_color
35
+ color_light = color.to_rgb_triple.to_hsl_triple.lighten(15) rescue color
36
+ i = 0
37
+ while @continue
38
+ @lines, @cols = winsize
39
+
40
+ @data << @value.(i)
41
+ @data = data.last(cols)
42
+
43
+ y_width = (data.max - data.min).to_f
44
+ if y_width == 0
45
+ perform(
46
+ clear_screen,
47
+ as_title("#@title / #{sleep_duration}"),
48
+ move_to(lines / 2, (cols - "no data".size) / 2) { italic{"no data"} }
49
+ )
50
+ maybe_sleep
51
+ next
52
+ end
53
+
54
+ perform clear_screen
55
+ data.each_with_index do |value, x|
56
+ x = x + cols - data.size + 1
57
+ y = lines - (((value - data.min) * lines / y_width)).round + 1
58
+ y.upto(lines) do |iy|
59
+ perform move_to(iy, x) { on_color(y == iy ? color : color_light){' '} }
60
+ end
61
+ end
62
+
63
+ perform(
64
+ as_title("#@title #{format_value(data.last)} / #{sleep_duration}"),
65
+ move_home { format_value(data.max).bold },
66
+ move_to_line(lines) { format_value(data.min).bold }
67
+ )
68
+
69
+ maybe_sleep
70
+ end
71
+ full_reset
72
+ rescue *[ Interrupt, defined?(IRB::Abort) && IRB::Abort ].compact
73
+ stop
74
+ end
75
+
76
+ def perform(*a)
77
+ print *a
78
+ end
79
+
80
+ attr_reader :cols
81
+
82
+ attr_reader :lines
83
+
84
+ attr_reader :data
85
+
86
+ def as_title(text)
87
+ move_to(lines, (cols - text.size) / 2) { bold{text} }
88
+ end
89
+
90
+ def sleep_duration
91
+ @sleep ? "#{@sleep}s" : "once"
92
+ end
93
+
94
+ def format_value(value)
95
+ case @format_value
96
+ when Proc
97
+ @format_value.(value)
98
+ when Symbol
99
+ send(@format_value, value)
100
+ else
101
+ send(:as_default, value)
102
+ end
103
+ end
104
+
105
+ def as_bytes(value)
106
+ Tins::Unit.format(value, prefix: :uc, format: '%.3f%U', unit: 'B')
107
+ end
108
+
109
+ def as_hertz(value)
110
+ Tins::Unit.format(value, prefix: :uc, format: '%.3f%U', unit: 'Hz')
111
+ end
112
+
113
+ def as_celsius(value)
114
+ "#{value}°"
115
+ end
116
+
117
+ def as_percent(value)
118
+ "#{value}%"
119
+ end
120
+
121
+ def as_default(value)
122
+ value.to_s
123
+ end
124
+
125
+ def pick_color
126
+ Term::ANSIColor::Attribute[
127
+ case @color
128
+ when Proc
129
+ @color.(@title)
130
+ when nil
131
+ cs = (21..226).select { |d|
132
+ Term::ANSIColor::Attribute[d].to_rgb_triple.to_hsl_triple.
133
+ lightness < 40
134
+ }
135
+ cs[ @title.bytes.reduce(0, :+) % cs.size ]
136
+ else
137
+ @color
138
+ end
139
+ ]
140
+ end
141
+
142
+ def maybe_sleep
143
+ if @sleep
144
+ sleep @sleep
145
+ else
146
+ @continue = false
147
+ end
148
+ end
149
+
150
+ def normalize_value(value)
151
+ case value
152
+ when Float
153
+ value
154
+ else
155
+ value.to_i
156
+ end
157
+ end
158
+
159
+ def full_reset
160
+ perform reset, clear_screen, move_home, show_cursor
161
+ end
162
+
163
+ def winsize
164
+ Tins::Terminal.winsize
165
+ end
166
+
167
+ def install_handlers
168
+ at_exit { full_reset }
169
+
170
+ trap(:SIGWINCH) {
171
+ lines, cols = winsize
172
+ perform clear_screen,
173
+ move_to(lines / 2, (cols - "Zzz…".size) / 2) { "Zzz…".italic }
174
+ }
175
+ end
176
+ end
@@ -1,6 +1,6 @@
1
1
  module Hackmac
2
2
  # Hackmac version
3
- VERSION = '1.2.1'
3
+ VERSION = '1.3.0'
4
4
  VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
data/lib/hackmac.rb CHANGED
@@ -17,3 +17,4 @@ require 'hackmac/oc_upgrader'
17
17
  require 'hackmac/oc_validator'
18
18
  require 'hackmac/config'
19
19
  require 'hackmac/utils'
20
+ require 'hackmac/graph'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hackmac
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-14 00:00:00.000000000 Z
11
+ date: 2023-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gem_hadar
@@ -150,6 +150,7 @@ extra_rdoc_files:
150
150
  - lib/hackmac/config.rb
151
151
  - lib/hackmac/disks.rb
152
152
  - lib/hackmac/github_source.rb
153
+ - lib/hackmac/graph.rb
153
154
  - lib/hackmac/kext.rb
154
155
  - lib/hackmac/kext_upgrader.rb
155
156
  - lib/hackmac/oc.rb
@@ -174,6 +175,7 @@ files:
174
175
  - lib/hackmac/config.rb
175
176
  - lib/hackmac/disks.rb
176
177
  - lib/hackmac/github_source.rb
178
+ - lib/hackmac/graph.rb
177
179
  - lib/hackmac/hackmac.yml
178
180
  - lib/hackmac/kext.rb
179
181
  - lib/hackmac/kext_upgrader.rb