super_random 3.2.230116 → 3.2.230213
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 +4 -4
- data/README.md +3 -3
- data/lib/super_random.rb +20 -22
- metadata +126 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 22e0311c10d4d5713318a8d42b1710477c60f93ffbcda9014d125761246d4c94
|
|
4
|
+
data.tar.gz: a703a7dc1eebb662736a6f45645dc18091cb4c0c717062a83c6285f51c085099
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 44b375eae14a0ef677074d24b1b3c60fcf0021f9ab6074f9e0ad4237a8f92acf7aba25735d3fe314376d3675beb0f43e94b18bd62dbb3541a93f9cb887dd8185
|
|
7
|
+
data.tar.gz: 3af65a15f411e9c02d729131a9002d34de5cb4a342a6cc6df72f9732ce2419a4ba4e016c3bc330025d03a077573250cc3ac0eb8e28ef1d8126d7e78a1903b09d
|
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# SuperRandom
|
|
2
2
|
|
|
3
|
-
* [VERSION 3.2.
|
|
3
|
+
* [VERSION 3.2.230213](https://github.com/carlosjhr64/super_random/releases)
|
|
4
4
|
* [github](https://github.com/carlosjhr64/super_random)
|
|
5
5
|
* [rubygems](https://rubygems.org/gems/super_random)
|
|
6
6
|
|
|
@@ -17,7 +17,7 @@ You can't get more random than random, but you can try really, really, really ha
|
|
|
17
17
|
## SYNOPSIS:
|
|
18
18
|
```ruby
|
|
19
19
|
require 'super_random'
|
|
20
|
-
SuperRandom::VERSION
|
|
20
|
+
SuperRandom::VERSION #~> ^3.\d+.\d+$
|
|
21
21
|
SuperRandom::DEFAULT_SOURCES #~> www.random.org
|
|
22
22
|
super_random = SuperRandom.new
|
|
23
23
|
super_random.sources #~> www.random.org
|
|
@@ -83,7 +83,7 @@ super_random.sources
|
|
|
83
83
|
|
|
84
84
|
(The MIT License)
|
|
85
85
|
|
|
86
|
-
Copyright (c) 2023
|
|
86
|
+
Copyright (c) 2023 CarlosJHR64
|
|
87
87
|
|
|
88
88
|
Permission is hereby granted, free of charge, to any person obtaining
|
|
89
89
|
a copy of this software and associated documentation files (the
|
data/lib/super_random.rb
CHANGED
|
@@ -6,27 +6,30 @@ require 'digest'
|
|
|
6
6
|
#`ruby`
|
|
7
7
|
|
|
8
8
|
class SuperRandom
|
|
9
|
-
VERSION = '3.2.
|
|
9
|
+
VERSION = '3.2.230213'
|
|
10
10
|
DEFAULT_SOURCES = [
|
|
11
|
-
'https://www.random.org/strings/?
|
|
11
|
+
'https://www.random.org/strings/?' \
|
|
12
|
+
'num=10&len=20&digits=on&upperalpha=on&loweralpha=on&unique=on&' \
|
|
13
|
+
'format=plain&rnd=new'
|
|
12
14
|
]
|
|
13
15
|
MUTEX = Mutex.new
|
|
14
16
|
DIV = 128.times.inject(''){|h,_|h<<'f'}.to_i(16)
|
|
15
17
|
RATE_LIMIT = 60 # One minute, be nice!
|
|
16
|
-
@@
|
|
18
|
+
@@last_time = Time.now.to_i - RATE_LIMIT - 1
|
|
17
19
|
|
|
18
20
|
attr_accessor :first_timeout, :second_timeout, :nevermind
|
|
19
21
|
attr_reader :sources, :source_count, :byte_count
|
|
22
|
+
|
|
20
23
|
def initialize(*sources)
|
|
21
24
|
@sources = sources.empty? ? DEFAULT_SOURCES.dup : sources
|
|
22
25
|
@byte_count,@source_count = 0,0
|
|
23
|
-
@first_timeout,@second_timeout,@nevermind = 3,
|
|
26
|
+
@first_timeout,@second_timeout,@nevermind = 3,3,true
|
|
24
27
|
end
|
|
25
28
|
|
|
26
29
|
# Returns 64 random bytes(at least from SecureRandom's)
|
|
27
30
|
def bytes
|
|
28
31
|
@byte_count,@source_count = 0,0
|
|
29
|
-
_do_updates if Time.now.to_i - @@
|
|
32
|
+
_do_updates if Time.now.to_i - @@last_time > RATE_LIMIT
|
|
30
33
|
_get_bytes
|
|
31
34
|
end
|
|
32
35
|
|
|
@@ -42,7 +45,7 @@ class SuperRandom
|
|
|
42
45
|
hex = hexadecimal
|
|
43
46
|
x = hex[0...64].to_i(16)
|
|
44
47
|
y = hex[64..128].to_i(16)
|
|
45
|
-
|
|
48
|
+
[x,y]
|
|
46
49
|
end
|
|
47
50
|
|
|
48
51
|
def integer2
|
|
@@ -60,11 +63,7 @@ class SuperRandom
|
|
|
60
63
|
# An alternate way to generate a float...
|
|
61
64
|
x,y = xy
|
|
62
65
|
# ...but what distribution is this?
|
|
63
|
-
Rational(x,y).to_f
|
|
64
|
-
rescue ZeroDivisionError
|
|
65
|
-
# Fat chance!
|
|
66
|
-
return 0 if x == 0
|
|
67
|
-
1.0/0.0
|
|
66
|
+
Rational(x+1,y+1).to_f
|
|
68
67
|
end
|
|
69
68
|
|
|
70
69
|
def random_number(scale=1.0)
|
|
@@ -74,7 +73,7 @@ class SuperRandom
|
|
|
74
73
|
when Integer
|
|
75
74
|
return ((integer + SecureRandom.random_number(scale)) % scale)
|
|
76
75
|
end
|
|
77
|
-
raise
|
|
76
|
+
raise 'rand(scale Integer|Float)'
|
|
78
77
|
end
|
|
79
78
|
alias rand random_number
|
|
80
79
|
|
|
@@ -88,9 +87,9 @@ class SuperRandom
|
|
|
88
87
|
end
|
|
89
88
|
def roll
|
|
90
89
|
@big,roll = @big.divmod(@sides)
|
|
91
|
-
|
|
90
|
+
roll+@minimum
|
|
92
91
|
ensure
|
|
93
|
-
set_big unless @big
|
|
92
|
+
set_big unless @big.positive?
|
|
94
93
|
end
|
|
95
94
|
end
|
|
96
95
|
def dice(sides, minimum:1)
|
|
@@ -103,12 +102,13 @@ class SuperRandom
|
|
|
103
102
|
def _get_bytes
|
|
104
103
|
MUTEX.synchronize do
|
|
105
104
|
SHASUM.update SecureRandom.bytes(64)
|
|
106
|
-
SHASUM.digest.chars.map
|
|
105
|
+
SHASUM.digest.chars.map(&:ord)
|
|
107
106
|
end
|
|
108
107
|
ensure
|
|
109
108
|
MUTEX.synchronize{SHASUM.update SecureRandom.bytes(64)}
|
|
110
109
|
end
|
|
111
110
|
|
|
111
|
+
# source in @sources may be anything URI.open can handle:
|
|
112
112
|
def _update_with(source)
|
|
113
113
|
URI.open(source) do |tmp|
|
|
114
114
|
MUTEX.synchronize do
|
|
@@ -120,26 +120,24 @@ class SuperRandom
|
|
|
120
120
|
end
|
|
121
121
|
end
|
|
122
122
|
rescue
|
|
123
|
-
|
|
123
|
+
warn $!.message
|
|
124
124
|
end
|
|
125
125
|
|
|
126
126
|
def _do_updates
|
|
127
|
-
@@
|
|
127
|
+
@@last_time = Time.now.to_i
|
|
128
128
|
threads = @sources.inject([]){|t,s|t.push Thread.new{_update_with s}}
|
|
129
129
|
begin
|
|
130
130
|
# Initially, would like to get them all.
|
|
131
|
-
Timeout.timeout(@first_timeout){threads.each
|
|
131
|
+
Timeout.timeout(@first_timeout){threads.each(&:join)}
|
|
132
132
|
rescue Timeout::Error
|
|
133
133
|
begin
|
|
134
134
|
Timeout.timeout(@second_timeout) do
|
|
135
135
|
# But at this point,
|
|
136
136
|
# would like to get at least one.
|
|
137
|
-
while @
|
|
138
|
-
Thread.pass
|
|
139
|
-
end
|
|
137
|
+
Thread.pass while @source_count.zero? && threads.any?(&:alive?)
|
|
140
138
|
end
|
|
141
139
|
rescue Timeout::Error
|
|
142
|
-
|
|
140
|
+
MUTEX.synchronize{threads.each(&:exit)} # Exit each thread
|
|
143
141
|
raise $! unless @nevermind # Go on if never-minding
|
|
144
142
|
end
|
|
145
143
|
end
|
metadata
CHANGED
|
@@ -1,15 +1,135 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: super_random
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.2.
|
|
4
|
+
version: 3.2.230213
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- CarlosJHR64
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
12
|
-
dependencies:
|
|
11
|
+
date: 2023-02-13 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: colorize
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0.8'
|
|
20
|
+
- - ">="
|
|
21
|
+
- !ruby/object:Gem::Version
|
|
22
|
+
version: 0.8.1
|
|
23
|
+
type: :development
|
|
24
|
+
prerelease: false
|
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
26
|
+
requirements:
|
|
27
|
+
- - "~>"
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '0.8'
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: 0.8.1
|
|
33
|
+
- !ruby/object:Gem::Dependency
|
|
34
|
+
name: cucumber
|
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '8.0'
|
|
40
|
+
- - ">="
|
|
41
|
+
- !ruby/object:Gem::Version
|
|
42
|
+
version: 8.0.0
|
|
43
|
+
type: :development
|
|
44
|
+
prerelease: false
|
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
46
|
+
requirements:
|
|
47
|
+
- - "~>"
|
|
48
|
+
- !ruby/object:Gem::Version
|
|
49
|
+
version: '8.0'
|
|
50
|
+
- - ">="
|
|
51
|
+
- !ruby/object:Gem::Version
|
|
52
|
+
version: 8.0.0
|
|
53
|
+
- !ruby/object:Gem::Dependency
|
|
54
|
+
name: help_parser
|
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
|
56
|
+
requirements:
|
|
57
|
+
- - "~>"
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: '8.2'
|
|
60
|
+
- - ">="
|
|
61
|
+
- !ruby/object:Gem::Version
|
|
62
|
+
version: 8.2.230210
|
|
63
|
+
type: :development
|
|
64
|
+
prerelease: false
|
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
66
|
+
requirements:
|
|
67
|
+
- - "~>"
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '8.2'
|
|
70
|
+
- - ">="
|
|
71
|
+
- !ruby/object:Gem::Version
|
|
72
|
+
version: 8.2.230210
|
|
73
|
+
- !ruby/object:Gem::Dependency
|
|
74
|
+
name: parser
|
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
|
76
|
+
requirements:
|
|
77
|
+
- - "~>"
|
|
78
|
+
- !ruby/object:Gem::Version
|
|
79
|
+
version: '3.2'
|
|
80
|
+
- - ">="
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: 3.2.1
|
|
83
|
+
type: :development
|
|
84
|
+
prerelease: false
|
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '3.2'
|
|
90
|
+
- - ">="
|
|
91
|
+
- !ruby/object:Gem::Version
|
|
92
|
+
version: 3.2.1
|
|
93
|
+
- !ruby/object:Gem::Dependency
|
|
94
|
+
name: rubocop
|
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
|
96
|
+
requirements:
|
|
97
|
+
- - "~>"
|
|
98
|
+
- !ruby/object:Gem::Version
|
|
99
|
+
version: '1.45'
|
|
100
|
+
- - ">="
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: 1.45.1
|
|
103
|
+
type: :development
|
|
104
|
+
prerelease: false
|
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
+
requirements:
|
|
107
|
+
- - "~>"
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '1.45'
|
|
110
|
+
- - ">="
|
|
111
|
+
- !ruby/object:Gem::Version
|
|
112
|
+
version: 1.45.1
|
|
113
|
+
- !ruby/object:Gem::Dependency
|
|
114
|
+
name: test-unit
|
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
|
116
|
+
requirements:
|
|
117
|
+
- - "~>"
|
|
118
|
+
- !ruby/object:Gem::Version
|
|
119
|
+
version: '3.5'
|
|
120
|
+
- - ">="
|
|
121
|
+
- !ruby/object:Gem::Version
|
|
122
|
+
version: 3.5.7
|
|
123
|
+
type: :development
|
|
124
|
+
prerelease: false
|
|
125
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
126
|
+
requirements:
|
|
127
|
+
- - "~>"
|
|
128
|
+
- !ruby/object:Gem::Version
|
|
129
|
+
version: '3.5'
|
|
130
|
+
- - ">="
|
|
131
|
+
- !ruby/object:Gem::Version
|
|
132
|
+
version: 3.5.7
|
|
13
133
|
description: |
|
|
14
134
|
You can't get more random than random, but you can try really, really, really hard.
|
|
15
135
|
|
|
@@ -40,8 +160,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
40
160
|
- !ruby/object:Gem::Version
|
|
41
161
|
version: '0'
|
|
42
162
|
requirements:
|
|
43
|
-
- '
|
|
44
|
-
|
|
163
|
+
- 'git: 2.30'
|
|
164
|
+
- 'ruby: 3.2'
|
|
165
|
+
rubygems_version: 3.4.6
|
|
45
166
|
signing_key:
|
|
46
167
|
specification_version: 4
|
|
47
168
|
summary: You can't get more random than random, but you can try really, really, really
|