hackmac 1.3.0 → 1.4.1

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: 59f8d61d5c86ebfc3dc59e41fba9c82bde1ee0bb2aa95396ff6c878165ff37c6
4
- data.tar.gz: 95932d40323add3994a44450337c9209be21f8378509c60ec512151e8a6ada31
3
+ metadata.gz: 52eecabaaacf4b30bdfd2c2d49ca2521d45dd81da1c75f1b3a02af4b94a0d01c
4
+ data.tar.gz: d84925f226ff82966a7a42f21143ee273715f013ed7907ab3f28273797b241f6
5
5
  SHA512:
6
- metadata.gz: 8af76a612daf738c8d4fb8423f8570e053d5db96696d3627d1413f391d8e1a6028e0331e915860e96742c6abe88295df0b41b459aa7f2621e4cb4b12f3f91eda
7
- data.tar.gz: e4ac35e14b25e5c111eb4fe7d4bb7a25edd602afb667beb94e3d8302e2974bdbf229776e2f418e0a27c5f1089abfa844c3398b30df376f08b7243424c7aa73f8
6
+ metadata.gz: 0b13786a08e87c4f162d3ce6090115c286f3feaa476aedf354d94e6a74f4e4fb225769d4fb2a3c304eec4fa77423b96e19b5f401ee0631604e4fda816d1c51b8
7
+ data.tar.gz: b6bb795279266902645e82382f253c050d2eb0d74c0f2c3ad91f7cf02334f28767727baa86b49d99d9c46081f987c3f12034330b87a7e6a4dd6a5581ef1f57fd
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.3.0
1
+ 1.4.1
data/bin/gfxmon CHANGED
@@ -13,7 +13,7 @@ require 'amatch'
13
13
  require 'search_ui'
14
14
  include SearchUI
15
15
 
16
- $opts = go 'c:g:n:jlh', defaults: { ?s => true, ?n => 10 }
16
+ $opts = go 'c:m:n:jlh', defaults: { ?s => true, ?n => 5 }
17
17
 
18
18
  def usage
19
19
  puts <<~end
@@ -25,7 +25,7 @@ def usage
25
25
  -l output GPU performance data as list
26
26
  -j output GPU performance data as json
27
27
  -n SECONDS measure every SECONDS
28
- -g METRIC output graph for performance METRIC
28
+ -m METRIC output graph for performance METRIC
29
29
  -c COLOR output graph in this terminal COLOR (between 0 - 255)
30
30
 
31
31
  end
@@ -47,14 +47,14 @@ end
47
47
 
48
48
  def list(ps)
49
49
  max = ps.keys.max_by(&:size)&.size&.to_i
50
- graph = Hackmac::Graph.new(title: '')
50
+ include Hackmac::Graph::Formatters
51
51
  puts ps.map { |n, v|
52
- ("%-#{max}s" % n) + " " + ("%s" % graph.send(derive_formatter(n), v)).bold
52
+ ("%-#{max}s" % n) + " " + ("%s" % send(derive_formatter(n), v)).bold
53
53
  }
54
54
  end
55
55
 
56
56
  def choose_metric(ps)
57
- case metric = $opts[?g]
57
+ case metric = $opts[?m]
58
58
  when nil
59
59
  ps_names = ps.keys
60
60
  metric = Search.new(
data/hackmac.gemspec CHANGED
@@ -1,19 +1,19 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: hackmac 1.3.0 ruby lib
2
+ # stub: hackmac 1.4.1 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "hackmac".freeze
6
- s.version = "1.3.0"
6
+ s.version = "1.4.1"
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-27"
11
+ s.date = "2023-05-28"
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/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]
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/graph/display.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/graph/display.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,200 @@
1
+ class Hackmac::Graph
2
+ class Display
3
+ ANSI = Term::ANSIColor
4
+
5
+ class Cell < Struct.new(:char, :color, :on_color, :styles)
6
+ def ==(other)
7
+ to_a == other.to_a
8
+ end
9
+
10
+ def to_s
11
+ ANSI.color(color) {
12
+ ANSI.on_color(on_color) {
13
+ styles.inject(char) { |c, s|
14
+ ANSI.send(s) { c }
15
+ }
16
+ }
17
+ }
18
+ end
19
+ end
20
+
21
+ def initialize(lines, columns)
22
+ @lines_range = 1..lines
23
+ @columns_range = 1..columns
24
+ clear
25
+ end
26
+
27
+ def clear
28
+ @x = 1
29
+ @y = 1
30
+ @color = 15
31
+ @on_color = 0
32
+ @styles = []
33
+ @cells =
34
+ Array.new(lines) {
35
+ Array.new(columns) {
36
+ Cell.new(' ', @color, @on_color, @styles)
37
+ }
38
+ }
39
+ reset
40
+ end
41
+
42
+ def reset
43
+ @color = 15
44
+ @on_color = 0
45
+ @styles = []
46
+ self
47
+ end
48
+
49
+ def each(&block)
50
+ Enumerator.new do |enum|
51
+ @lines_range.each do |y|
52
+ @columns_range.each do |x|
53
+ enum.yield y, x, @cells[y - 1][x - 1]
54
+ end
55
+ end
56
+ end.each(&block)
57
+ end
58
+
59
+ def -(old)
60
+ dimensions != old.dimensions and raise ArgumentError,
61
+ "old dimensions #{old.dimensions.inspect} don't match #{dimensions.inspect}"
62
+ result = ''
63
+ each.zip(old.each) do |(my, mx, me), (_, _, old)|
64
+ if me != old
65
+ result << ANSI.move_to(my, mx) << me.to_s
66
+ end
67
+ end
68
+ result
69
+ end
70
+
71
+ def to_s
72
+ each.inject(ANSI.clear_screen) do |s, (y, x, c)|
73
+ s << ANSI.move_to(y, x) << c.to_s
74
+ end
75
+ end
76
+
77
+ def inspect
78
+ "#<#{self.class}: #{columns}×#{lines}>"
79
+ end
80
+
81
+ attr_reader :x
82
+
83
+ attr_reader :y
84
+
85
+ def lines
86
+ @lines_range.end
87
+ end
88
+
89
+ def columns
90
+ @columns_range.end
91
+ end
92
+
93
+ def dimensions
94
+ [ lines, columns ]
95
+ end
96
+
97
+ def styled(*s)
98
+ if nope = s.find { !style?(_1) }
99
+ raise ArgumentError, "#{nope} is not a style"
100
+ end
101
+ @styles = s
102
+ self
103
+ end
104
+
105
+ def at(y, x)
106
+ @lines_range.include?(y) or
107
+ raise ArgumentError, "y #{y} out of lines range #@lines_range"
108
+ @columns_range.include?(x) or
109
+ raise ArgumentError, "x #{x} out of columns range #@columns_range"
110
+ @y, @x = y, x
111
+ self
112
+ end
113
+
114
+ def put(char)
115
+ char.size == 1 or
116
+ raise ArgumentError, "#{char} is not single character"
117
+ @cells[@y - 1][@x - 1] = Cell.new(char, @color, @on_color, @styles)
118
+ self
119
+ end
120
+
121
+ def write(string)
122
+ string.each_char do |char|
123
+ put(char)
124
+ if x < columns - 1
125
+ at(y, x + 1)
126
+ else
127
+ break
128
+ end
129
+ end
130
+ self
131
+ end
132
+
133
+ def top
134
+ at(1, x)
135
+ end
136
+
137
+ def bottom
138
+ at(lines, x)
139
+ end
140
+
141
+ def left
142
+ at(y, 1)
143
+ end
144
+
145
+ def right
146
+ at(y, columns)
147
+ end
148
+
149
+ def centered
150
+ at(lines / 2, columns / 2)
151
+ end
152
+
153
+ def write_centered(string)
154
+ at(@y, (columns - string.size) / 2).write(string)
155
+ end
156
+
157
+ def get
158
+ @cells[@y - 1][@x - 1]
159
+ end
160
+
161
+ def color(color)
162
+ @color = attribute!(color)
163
+ self
164
+ end
165
+
166
+ def on_color(on_color)
167
+ @on_color = attribute!(on_color)
168
+ self
169
+ end
170
+
171
+ private
172
+
173
+ def style?(s)
174
+ [
175
+ :bold,
176
+ :dark,
177
+ :faint,
178
+ :italic,
179
+ :underline,
180
+ :underscore,
181
+ :blink,
182
+ :rapid_blink,
183
+ :reverse,
184
+ :negative,
185
+ :concealed,
186
+ :conceal,
187
+ :strikethrough,
188
+ ].member?(s)
189
+ end
190
+
191
+ def attribute?(a)
192
+ Term::ANSIColor::Attribute[a]
193
+ end
194
+
195
+ def attribute!(a)
196
+ attribute?(a) or
197
+ raise ArgumentError, "#{a.inspect} is not a color attribute"
198
+ end
199
+ end
200
+ end
data/lib/hackmac/graph.rb CHANGED
@@ -4,7 +4,39 @@ require 'tins'
4
4
  class Hackmac::Graph
5
5
  include Term::ANSIColor
6
6
 
7
- def initialize(title:, value: -> i { 0 }, format_value: nil, sleep: nil, color: nil)
7
+ include\
8
+ module Formatters
9
+ def as_bytes(value)
10
+ Tins::Unit.format(value, prefix: :uc, format: '%.3f%U', unit: 'B')
11
+ end
12
+
13
+ def as_hertz(value)
14
+ Tins::Unit.format(value, prefix: :uc, format: '%.3f%U', unit: 'Hz')
15
+ end
16
+
17
+ def as_celsius(value)
18
+ "#{value}°"
19
+ end
20
+
21
+ def as_percent(value)
22
+ "#{value}%"
23
+ end
24
+
25
+ def as_default(value)
26
+ value.to_s
27
+ end
28
+
29
+ self
30
+ end
31
+
32
+ def initialize(
33
+ title:,
34
+ value: -> i { 0 },
35
+ format_value: nil,
36
+ sleep: nil,
37
+ color: nil
38
+ )
39
+ sleep >= 0 or raise ArgumentError, 'sleep has to be >= 0'
8
40
  @title = title
9
41
  @value = value
10
42
  @format_value = format_value
@@ -12,13 +44,12 @@ class Hackmac::Graph
12
44
  @continue = false
13
45
  @data = []
14
46
  @color = color
47
+ @mutex = Mutex.new
15
48
  end
16
49
 
17
50
  def start
18
51
  install_handlers
19
52
  full_reset
20
- perform hide_cursor
21
- @continue = true
22
53
  start_loop
23
54
  end
24
55
 
@@ -34,42 +65,45 @@ class Hackmac::Graph
34
65
  color = pick_color
35
66
  color_light = color.to_rgb_triple.to_hsl_triple.lighten(15) rescue color
36
67
  i = 0
68
+ @continue = true
37
69
  while @continue
38
- @lines, @cols = winsize
70
+ @full_reset and full_reset
71
+ perform hide_cursor
39
72
 
40
73
  @data << @value.(i)
41
- @data = data.last(cols)
74
+ @data = data.last(columns)
42
75
 
43
76
  y_width = (data.max - data.min).to_f
44
77
  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
78
+ @display.reset.bottom.styled(:bold).
79
+ write_centered("#@title / #{sleep_duration}").
80
+ reset.centered.styled(:italic).write_centered("no data")
81
+ perform_display_diff
82
+ sleep_now
51
83
  next
52
84
  end
53
85
 
54
- perform clear_screen
86
+ @display.reset
55
87
  data.each_with_index do |value, x|
56
- x = x + cols - data.size + 1
88
+ x = x + columns - data.size + 1
57
89
  y = lines - (((value - data.min) * lines / y_width)).round + 1
58
90
  y.upto(lines) do |iy|
59
- perform move_to(iy, x) { on_color(y == iy ? color : color_light){' '} }
91
+ @display.at(iy, x).on_color(
92
+ y == iy ? color : color_light
93
+ ).write(' ')
60
94
  end
61
95
  end
62
96
 
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
- )
97
+ @display.reset.bottom.styled(:bold).
98
+ write_centered("#@title #{format_value(data.last)} / #{sleep_duration}")
99
+ @display.reset.styled(:bold).
100
+ left.top.write(format_value(data.max)).
101
+ left.bottom.write(format_value(data.min))
68
102
 
69
- maybe_sleep
103
+ perform_display_diff
104
+ sleep_now
70
105
  end
71
- full_reset
72
- rescue *[ Interrupt, defined?(IRB::Abort) && IRB::Abort ].compact
106
+ ensure
73
107
  stop
74
108
  end
75
109
 
@@ -77,18 +111,18 @@ class Hackmac::Graph
77
111
  print *a
78
112
  end
79
113
 
80
- attr_reader :cols
114
+ def columns
115
+ @display.columns
116
+ end
81
117
 
82
- attr_reader :lines
118
+ def lines
119
+ @display.lines
120
+ end
83
121
 
84
122
  attr_reader :data
85
123
 
86
- def as_title(text)
87
- move_to(lines, (cols - text.size) / 2) { bold{text} }
88
- end
89
-
90
124
  def sleep_duration
91
- @sleep ? "#{@sleep}s" : "once"
125
+ "#{@sleep}s"
92
126
  end
93
127
 
94
128
  def format_value(value)
@@ -102,26 +136,6 @@ class Hackmac::Graph
102
136
  end
103
137
  end
104
138
 
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
139
  def pick_color
126
140
  Term::ANSIColor::Attribute[
127
141
  case @color
@@ -139,14 +153,22 @@ class Hackmac::Graph
139
153
  ]
140
154
  end
141
155
 
142
- def maybe_sleep
143
- if @sleep
144
- sleep @sleep
145
- else
146
- @continue = false
156
+ def sleep_now
157
+ sleep @sleep
158
+ end
159
+
160
+ def perform_display_diff
161
+ @mutex.synchronize do
162
+ unless @old_display && @old_display.dimensions == @display.dimensions
163
+ @old_display = @display.dup.clear
164
+ end
165
+ perform @display - @old_display
166
+ @display, @old_display = @old_display.clear, @display
167
+ perform move_to(lines, columns)
147
168
  end
148
169
  end
149
170
 
171
+
150
172
  def normalize_value(value)
151
173
  case value
152
174
  when Float
@@ -157,20 +179,23 @@ class Hackmac::Graph
157
179
  end
158
180
 
159
181
  def full_reset
160
- perform reset, clear_screen, move_home, show_cursor
161
- end
162
-
163
- def winsize
164
- Tins::Terminal.winsize
182
+ @mutex.synchronize do
183
+ perform reset, clear_screen, move_home, show_cursor
184
+ winsize = Tins::Terminal.winsize
185
+ @display = Hackmac::Graph::Display.new(*winsize)
186
+ @old_display = Hackmac::Graph::Display.new(*winsize)
187
+ perform @display
188
+ @full_reset = false
189
+ end
165
190
  end
166
191
 
167
192
  def install_handlers
168
193
  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
- }
194
+ trap(:SIGWINCH) do
195
+ @full_reset = true
196
+ perform reset, clear_screen, move_home, 'Zzz…'
197
+ end
175
198
  end
176
199
  end
200
+
201
+ require 'hackmac/graph/display'
data/lib/hackmac/utils.rb CHANGED
@@ -13,17 +13,16 @@ module Hackmac
13
13
 
14
14
  def x(cmd, verbose: true)
15
15
  prompt = cmd =~ /\A\s*sudo/ ? ?# : ?$
16
+ print "#{prompt} #{cmd}".color(27)
17
+ puts verbose ? "" : " >/dev/null".yellow
16
18
  output = `#{cmd} 2>&1`
17
19
  if $?.success?
18
- print "#{prompt} #{cmd}".green
19
- puts verbose ? "" : " >/dev/null".yellow
20
+ puts " Command succeded!".green
20
21
  else
21
- print "#{prompt} #{cmd}".red
22
- puts verbose ? "" : " >/dev/null".yellow
23
- STDERR.puts "command #{cmd.inspect} failed with exit status #{$?.exitstatus}".on_red.white
22
+ puts "⚠️ Command #{cmd.inspect} failed with exit status #{$?.exitstatus}".on_red.white
24
23
  end
25
24
  if verbose
26
- print output.italic
25
+ puts output.italic
27
26
  end
28
27
  output
29
28
  end
@@ -1,6 +1,6 @@
1
1
  module Hackmac
2
2
  # Hackmac version
3
- VERSION = '1.3.0'
3
+ VERSION = '1.4.1'
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:
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.3.0
4
+ version: 1.4.1
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-27 00:00:00.000000000 Z
11
+ date: 2023-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gem_hadar
@@ -151,6 +151,7 @@ extra_rdoc_files:
151
151
  - lib/hackmac/disks.rb
152
152
  - lib/hackmac/github_source.rb
153
153
  - lib/hackmac/graph.rb
154
+ - lib/hackmac/graph/display.rb
154
155
  - lib/hackmac/kext.rb
155
156
  - lib/hackmac/kext_upgrader.rb
156
157
  - lib/hackmac/oc.rb
@@ -176,6 +177,7 @@ files:
176
177
  - lib/hackmac/disks.rb
177
178
  - lib/hackmac/github_source.rb
178
179
  - lib/hackmac/graph.rb
180
+ - lib/hackmac/graph/display.rb
179
181
  - lib/hackmac/hackmac.yml
180
182
  - lib/hackmac/kext.rb
181
183
  - lib/hackmac/kext_upgrader.rb