epitools 0.5.129 → 0.5.134

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: 74b341f10e9697a2d9e93aad5aa91b7f799e75a3cd817d712bce3e15cd18428d
4
- data.tar.gz: bce241006bd3b743410e3b6833145a5e72052637d7e918caa2562564b6ad4f5b
3
+ metadata.gz: 2aefbc7936ad578ce3f2ae8806e67be1815f4e2a55ddf43a915bcdaa0ca9f68a
4
+ data.tar.gz: 6d09789e434d7cda9b66e25ecf1ebf9db61d6236f1342b83743330e42d9ab09f
5
5
  SHA512:
6
- metadata.gz: ef8edebf3480e814c17e90f5c200fe1dc70a45827d8c2e52d2d7834291f61fb67824c5c5b6f869805f8751ea53d0eb95aa83e86daba42eb748d34ea66061ad6a
7
- data.tar.gz: 38abf237811351f91306dd1d1e66e9104040645aa3ff743d13609a155853aa6ffa80b9967961edda5f20e1ad67068ffc298beafac47857210eca9ebb6a4ec87f
6
+ metadata.gz: 4c98a36281937b7dd6e8f6154af595f5153d51803da0587eafc1a8dec26c96adac899e73c9ef49157b8fadcdf01fb845b60095d9ceb9722b5107c0eeaf6f8550
7
+ data.tar.gz: ccf09c13ef7df31e8d6994ba1c5550dc606fd61ac909c14f00c53788160a69cb53e7c425156a373732f4fbc7e021bde12c27e850be0ca1cf4735b86d9cf01285
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.129
1
+ 0.5.134
@@ -98,8 +98,11 @@ autoreq :Mechanize, 'mechanize'
98
98
  autoreq :HTTP, 'http'
99
99
 
100
100
  autoreq :Nokogiri, 'nokogiri'
101
- autoreq :Oga, 'oga'
102
101
  autoreq :Ox, 'ox'
102
+ autoreq :Oga do
103
+ require 'oga'
104
+ require 'epitools/gem_ext/oga'
105
+ end
103
106
 
104
107
  autoreq :ANSI, 'ansi'
105
108
 
@@ -247,3 +247,13 @@ end
247
247
  def curl_json(url)
248
248
  JSON.parse(curl(url))
249
249
  end
250
+
251
+ def cached_curl(url)
252
+ cache = "/tmp/curl-#{url.sha1}.cache"
253
+ if File.exist?(cache)
254
+ $stderr.puts "cached! => #{cache}"
255
+ else
256
+ File.write(cache, curl(url))
257
+ end
258
+ File.read(cache)
259
+ end
@@ -1,31 +1,17 @@
1
1
  class Class
2
2
 
3
- #
4
- # Return a copy of the class with modules mixed into it.
5
- #
6
- def self.using(*args)
7
- if block_given?
8
- yield using(*args)
9
- else
10
- copy = self.dup
11
- args.each { |arg| copy.send(:include, arg) }
12
- copy
13
- end
14
- end
15
-
16
-
17
3
  #
18
4
  # Trace the specified method calls (`meths`, as symbols) to descendends of this class (or all methods if `:*` is supplied).
19
5
  # Output is printed to $stderr.
20
6
  #
21
7
  def trace_messages_to(*meths)
22
8
  return unless $DEBUG
23
-
9
+
24
10
  tracers = Module.new
25
11
  parent = self
26
12
 
27
13
  $stderr.puts "[*] Tracing messages sent to #{parent} (messages: #{meths.join(", ")})"
28
-
14
+
29
15
  meths.each do |meth|
30
16
  case meth
31
17
  when :*
@@ -35,9 +21,9 @@ class Class
35
21
  end
36
22
  else
37
23
  tracers.define_method(meth) do |*args, &block|
38
- args = args.map(&:inspect)
39
- args << "&block" if block
40
- $stderr.puts "[*] #{parent}##{meth}(#{args.join(", ")})"
24
+ arg_names = args.map(&:inspect)
25
+ arg_names << "&block" if block
26
+ $stderr.puts "[*] #{parent}##{meth}(#{arg_names.join(", ")})"
41
27
  if block
42
28
  super(*args, &block)
43
29
  else
@@ -1,5 +1,5 @@
1
1
 
2
- Number = Numeric # "obj.is_a? Number" just sounds better.
2
+ Number = Numeric # because "obj.is_a? Number" sounds better!
3
3
 
4
4
  class Numeric
5
5
 
@@ -84,7 +84,8 @@ class Numeric
84
84
  end
85
85
  end
86
86
 
87
- [:cos,
87
+ [
88
+ :cos,
88
89
  :sin,
89
90
  :tan,
90
91
  :acos,
@@ -186,7 +187,8 @@ class Numeric
186
187
  end
187
188
 
188
189
  BYTE_SIZE_TABLE = {
189
- # power # units
190
+ # power
191
+ # of 1024 # units
190
192
  0 => "",
191
193
  1 => "KB",
192
194
  2 => "MB",
@@ -213,8 +215,8 @@ class Numeric
213
215
  def to_hms
214
216
  seconds = self
215
217
 
216
- days, seconds = seconds.divmod(86400)
217
- hours, seconds = seconds.divmod(3600)
218
+ days, seconds = seconds.divmod(86400)
219
+ hours, seconds = seconds.divmod(3600)
218
220
  minutes, seconds = seconds.divmod(60)
219
221
  seconds, frac = seconds.divmod(1)
220
222
 
@@ -229,8 +231,8 @@ class Numeric
229
231
  def to_hms_in_words
230
232
  seconds = self
231
233
 
232
- days, seconds = seconds.divmod(86400)
233
- hours, seconds = seconds.divmod(3600)
234
+ days, seconds = seconds.divmod(86400)
235
+ hours, seconds = seconds.divmod(3600)
234
236
  minutes, seconds = seconds.divmod(60)
235
237
  seconds, frac = seconds.divmod(1)
236
238
 
@@ -243,6 +245,22 @@ class Numeric
243
245
  result
244
246
  end
245
247
 
248
+ def to_farenheit
249
+ (self * 9.0 / 5.0) + 32
250
+ end
251
+
252
+ def to_celcius
253
+ (self - 32) * 5.0 / 9.0
254
+ end
255
+
256
+ def to_lbs
257
+ self / 0.45359237
258
+ end
259
+
260
+ def to_kg
261
+ self * 0.45359237
262
+ end
263
+
246
264
  end
247
265
 
248
266
 
@@ -442,7 +460,8 @@ end
442
460
  class Prime
443
461
 
444
462
  #
445
- # Return an array of prime numbers within the specified range
463
+ # Return an array of prime numbers within the specified range.
464
+ # (It still has to generate all the primes less than the lower bound, so, yeah... be warned.)
446
465
  #
447
466
  def [](range)
448
467
  ubound = range.end
@@ -130,10 +130,9 @@ class String
130
130
  #
131
131
  # Is there anything in the string? (ignoring whitespace/newlines)
132
132
  #
133
- def any?
133
+ def present?
134
134
  not blank?
135
135
  end
136
- alias_method :present?, :any?
137
136
 
138
137
  #
139
138
  # Does this string contain something that means roughly "true"?
@@ -1,37 +1,47 @@
1
1
  require 'uri'
2
2
 
3
- module URI
3
+ class URI::Generic
4
4
 
5
5
  #
6
- # Return a Hash of the variables in the query string
6
+ # Get the query string
7
7
  #
8
- def params
9
- (@query ? @query.to_params : {})
8
+ def query
9
+ params.to_query
10
10
  end
11
11
 
12
12
  #
13
- # Update all the params at once
13
+ # Set the query string
14
14
  #
15
- def params=(new_params)
16
- self.query = new_params.to_params
15
+ def query=(new_query)
16
+ @params = new_query&.to_params
17
+ @query = new_query
17
18
  end
18
19
 
19
20
  #
20
- # Update one URI parameter
21
+ # Return a Hash of the variables in the query string
21
22
  #
22
- def set_param(key, value)
23
- current = params
24
- current[key] = value
25
- self.query = current.to_query
23
+ def params
24
+ @params ||= (@query ? @query.to_params : {})
26
25
  end
27
26
 
28
27
  #
29
- # Get the query string
28
+ # Update all the params at once
30
29
  #
31
- def query
32
- params.to_query
30
+ def params=(new_params)
31
+ # self.query = new_params.to_params
32
+ raise "params must be a Hash" unless new_params.is_a? Hash
33
+ @params = new_params
33
34
  end
34
35
 
36
+ # #
37
+ # # Update one URI parameter
38
+ # #
39
+ # def set_param(key, value)
40
+ # current = params
41
+ # current[key] = value
42
+ # self.query = current.to_query
43
+ # end
44
+
35
45
  #
36
46
  # URIs *are* strings, dammit!
37
47
  #
@@ -39,6 +49,10 @@ module URI
39
49
  to_s
40
50
  end
41
51
 
52
+ end
53
+
54
+ module URI
55
+
42
56
  #
43
57
  # Default user agent for the 'get' method
44
58
  #
@@ -0,0 +1,31 @@
1
+
2
+ module Oga
3
+ module XML
4
+ # Serialize this node to HAML
5
+ module ElementToHAML
6
+ def to_haml
7
+ require 'html2haml'
8
+ require 'html2haml/html'
9
+ Html2haml::HTML.new(to_xml, {}).render.rstrip
10
+ end
11
+ alias_method :haml, :to_haml
12
+
13
+ def pretty
14
+ require 'coderay'
15
+ puts CodeRay.scan(haml, :haml).term
16
+ end
17
+ #alias_method :pp, :pretty
18
+ end
19
+
20
+ module PrettyNodeSet
21
+ def pretty
22
+ require 'coderay'
23
+ lesspipe(wrap: true) { |less| each { |node| less.puts CodeRay.scan(node.to_haml, :haml).term; less.puts; less.puts } }
24
+ end
25
+ end
26
+
27
+ end
28
+ end
29
+
30
+ Oga::XML::Element.include Oga::XML::ElementToHAML
31
+ Oga::XML::NodeSet.include Oga::XML::PrettyNodeSet
@@ -26,11 +26,12 @@
26
26
  # end
27
27
  #
28
28
  class JobRunner
29
- def initialize(*blocks)
29
+ def initialize(*blocks, debug: false)
30
30
  @threads = []
31
31
  @results = Thread::Queue.new
32
32
  @jobs = []
33
33
  @started = false
34
+ @debug = debug
34
35
 
35
36
  if blocks.any?
36
37
  blocks.each { |block| add &block }
@@ -39,20 +40,37 @@ class JobRunner
39
40
  end
40
41
  end
41
42
 
43
+ def dmsg(msg)
44
+ puts "[#{Time.now}] #{msg}" if @debug
45
+ end
46
+
42
47
  def add(&block)
48
+ dmsg("added job #{block}")
43
49
  @jobs << block
44
50
  end
45
51
 
46
52
  def reap!
47
- @threads.delete_if { |t| not t.alive? } if @threads.any?
53
+ if @threads.any?
54
+ dmsg("reaping #{@threads.size} threads")
55
+ @threads.delete_if { |t| not t.alive? }
56
+ else
57
+ dmsg("reap failed: no threads")
58
+ end
48
59
  end
49
60
 
50
61
  def go!
51
- raise "Error: already started" if @started
62
+ if @started
63
+ raise "Error: already started"
64
+ else
65
+ dmsg("starting #{@threads.size} jobs")
66
+ end
67
+
52
68
  @started = true
53
69
  @jobs.each do |job|
70
+ dmsg("adding #{job}")
54
71
  @threads << Thread.new do
55
72
  @results << job.call
73
+ dmsg("job #{job} complete")
56
74
  end
57
75
  end
58
76
  end
@@ -72,7 +90,7 @@ end
72
90
 
73
91
 
74
92
  if __FILE__ == $0
75
- JobRunner.new do |jr|
93
+ JobRunner.new(debug: true) do |jr|
76
94
  jr.add { 3 }
77
95
  jr.add { sleep 0.1; 2 }
78
96
  jr.add { sleep 0.2; 1 }
@@ -24,7 +24,7 @@ class Numeric
24
24
 
25
25
  # 20-90
26
26
  NAMES_MEDIUM = [
27
- "twenty", "thirty", "fourty", "fifty", "sixty", "seventy", "eighty", "ninety"
27
+ "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"
28
28
  ]
29
29
 
30
30
  # >= 100
data/lib/epitools/path.rb CHANGED
@@ -119,11 +119,20 @@ class Path
119
119
  # The file extension, including the . (eg: ".mp3")
120
120
  attr_reader :ext
121
121
 
122
+ URI_RE = %r{^[a-z\-]+://}i
122
123
 
123
124
  ###############################################################################
124
125
  # Initializers
125
126
  ###############################################################################
126
127
 
128
+ def self.new(*args)
129
+ if args.first =~ URI_RE and self != Path::URI
130
+ Path::URI.new(args.first)
131
+ else
132
+ super(*args)
133
+ end
134
+ end
135
+
127
136
  def initialize(newpath, hints={})
128
137
  send("path=", newpath, hints)
129
138
 
@@ -156,8 +165,8 @@ class Path
156
165
  path
157
166
  when String
158
167
 
159
- if path =~ %r{^[a-z\-]+://}i # URL?
160
- Path::URI.new(path)
168
+ if path =~ URI_RE
169
+ Path.new(path)
161
170
 
162
171
  else
163
172
  # TODO: highlight backgrounds of codeblocks to show indent level & put boxes (or rules?) around (between?) double-spaced regions
@@ -186,7 +195,7 @@ class Path
186
195
  # Note: The `hints` parameter contains options so `path=` doesn't have to touch the filesytem as much.
187
196
  #
188
197
  def path=(newpath, hints={})
189
- if hints[:type] or File.exists? newpath
198
+ if hints[:type] or File.exist? newpath
190
199
  if hints[:type] == :dir or File.directory? newpath
191
200
  self.dir = newpath
192
201
  else
@@ -357,7 +366,7 @@ class Path
357
366
  ###############################################################################
358
367
 
359
368
  def exists?
360
- File.exists? path
369
+ File.exist? path
361
370
  end
362
371
 
363
372
  def size
@@ -430,7 +439,7 @@ class Path
430
439
  end
431
440
 
432
441
  def broken_symlink?
433
- File.symlink?(path) and not File.exists?(path)
442
+ File.symlink?(path) and not File.exist?(path)
434
443
  end
435
444
 
436
445
  def symlink_target
@@ -930,7 +939,7 @@ class Path
930
939
 
931
940
  # Parse the file as CSV
932
941
  def read_csv(io=self.io, opts={})
933
- open { |io| CSV.new(io.read, opts).each }
942
+ CSV.new(io.read, **opts).each
934
943
  end
935
944
  alias_method :from_csv, :read_csv
936
945
 
@@ -1638,9 +1647,9 @@ class Path::URI < Path
1638
1647
  #
1639
1648
  # When this is: http://host.com:port/path/filename.ext?param1=value1&param2=value2&...
1640
1649
  #
1641
- def to_s
1642
- uri.to_s
1643
- end
1650
+ def to_s; uri.to_s; end
1651
+ def to_path; to_s; end
1652
+ def to_str; to_s; end
1644
1653
 
1645
1654
  def inspect
1646
1655
  "#<Path::URI:#{to_s}>"
@@ -1693,9 +1702,9 @@ class Path::URI < Path
1693
1702
  def open(mode="r", &block)
1694
1703
  require 'open-uri'
1695
1704
  if block_given?
1696
- Kernel.open(to_s, mode, &block)
1705
+ ::URI.open(to_s, mode, &block)
1697
1706
  else
1698
- Kernel.open(to_s, mode)
1707
+ ::URI.open(to_s, mode)
1699
1708
  end
1700
1709
  end
1701
1710
 
data/lib/epitools/sys.rb CHANGED
@@ -4,6 +4,7 @@ require 'epitools/minimal'
4
4
  # Cross-platform operating system functions.
5
5
  # Includes: process listing, platform detection, etc.
6
6
  #
7
+ require 'epitools/sys/os'
7
8
  require 'epitools/sys/ps'
8
9
  require 'epitools/sys/mounts'
9
10
  require 'epitools/sys/misc'
@@ -127,26 +127,6 @@ end
127
127
 
128
128
  describe Class do
129
129
 
130
- it "uses" do
131
- module Test1
132
- def test1; :test1; end
133
- end
134
-
135
- module Test2
136
- def test2; :test2; end
137
- end
138
-
139
- Hash.using(Test1).new.test1.should == :test1
140
- Hash.using(Test2).new.test2.should == :test2
141
- h = Hash.using(Test1, Test2).new
142
- h.test1.should == :test1
143
- h.test2.should == :test2
144
-
145
- Hash.using(Test1) do |h|
146
- h.new.test1.should == :test1
147
- end
148
- end
149
-
150
130
  it "traces messages (when $DEBUG is set)" do
151
131
  $DEBUG = true
152
132
 
@@ -166,10 +146,10 @@ describe Class do
166
146
  class ButtTest
167
147
  trace_messages_to :*
168
148
 
169
- def d
149
+ def a
170
150
  end
171
151
 
172
- def e
152
+ def b
173
153
  end
174
154
  end
175
155
 
@@ -197,7 +177,7 @@ describe Numeric do
197
177
  -12983287123.commatize.should == "-12,983,287,123"
198
178
  -12983287123.4411.commatize.should == "-12,983,287,123.4411"
199
179
  1111.1234567.commatize.should == "1,111.1234567"
200
- BigDecimal.new("1111.1234567").commatize.should == "1,111.1234567"
180
+ BigDecimal("1111.1234567").commatize.should == "1,111.1234567"
201
181
  -1234567.1234567.underscorize.should == "-1_234_567.1234567"
202
182
  end
203
183
 
@@ -237,6 +217,11 @@ describe Numeric do
237
217
  32583128.human_size(2).should == "31.07MB"
238
218
  end
239
219
 
220
+ it "temperatures" do
221
+ t = 18.0
222
+ t.to_farenheit.to_celcius.should be_within(0.001).of(t)
223
+ end
224
+
240
225
  end
241
226
 
242
227
 
@@ -1311,18 +1296,24 @@ describe URI do
1311
1296
  uri.params.should == opts
1312
1297
  end
1313
1298
 
1314
- it "gets" do
1315
- response = URI("http://google.com/").get
1316
- response.body.size
1317
- (response.size > 0).should == true
1318
- end
1299
+ # it "gets" do
1300
+ # response = URI("http://google.com/").get
1301
+ # response.body.size
1302
+ # (response.size > 0).should == true
1303
+ # end
1319
1304
 
1320
1305
  it "params=" do
1321
- u = "http://butt.com/?q=1".to_uri
1306
+ u = "http://butt.cx/?q=1".to_uri
1322
1307
  u.query.should == "q=1"
1308
+ u.params.should == {"q" => "1"}
1323
1309
  u.params["q"] = 2
1324
1310
  u.params["q"].should == 2
1311
+ u.params.should == {"q" => 2}
1325
1312
  u.query.should == "q=2"
1313
+
1314
+ subbed = u.with(query: u.params.reject{|k,v| u.params.keys.include? 'q' }.to_query)
1315
+ subbed.params.should == {}
1316
+ subbed.query.should == ""
1326
1317
  end
1327
1318
 
1328
1319
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: epitools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.129
4
+ version: 0.5.134
5
5
  platform: ruby
6
6
  authors:
7
7
  - epitron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-25 00:00:00.000000000 Z
11
+ date: 2021-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -69,6 +69,7 @@ files:
69
69
  - lib/epitools/core_ext/truthiness.rb
70
70
  - lib/epitools/core_ext/uri.rb
71
71
  - lib/epitools/daemonize.rb
72
+ - lib/epitools/gem_ext/oga.rb
72
73
  - lib/epitools/hexdump.rb
73
74
  - lib/epitools/iter.rb
74
75
  - lib/epitools/its.rb
@@ -142,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
143
  - !ruby/object:Gem::Version
143
144
  version: '0'
144
145
  requirements: []
145
- rubygems_version: 3.1.4
146
+ rubygems_version: 3.2.21
146
147
  signing_key:
147
148
  specification_version: 3
148
149
  summary: Not utils... METILS!