ssstats 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.git/COMMIT_EDITMSG +10 -0
- data/.git/FETCH_HEAD +1 -0
- data/.git/HEAD +1 -0
- data/.git/ORIG_HEAD +1 -0
- data/.git/config +15 -0
- data/.git/description +1 -0
- data/.git/hooks/applypatch-msg.sample +15 -0
- data/.git/hooks/commit-msg.sample +24 -0
- data/.git/hooks/post-update.sample +8 -0
- data/.git/hooks/pre-applypatch.sample +14 -0
- data/.git/hooks/pre-commit.sample +49 -0
- data/.git/hooks/pre-push.sample +53 -0
- data/.git/hooks/pre-rebase.sample +169 -0
- data/.git/hooks/pre-receive.sample +24 -0
- data/.git/hooks/prepare-commit-msg.sample +36 -0
- data/.git/hooks/update.sample +128 -0
- data/.git/index +0 -0
- data/.git/info/exclude +6 -0
- data/.git/logs/HEAD +24 -0
- data/.git/logs/refs/heads/master +4 -0
- data/.git/logs/refs/heads/minor-name-changes +3 -0
- data/.git/logs/refs/remotes/origin/basic-stats-basic-structs +2 -0
- data/.git/logs/refs/remotes/origin/init +1 -0
- data/.git/logs/refs/remotes/origin/master +4 -0
- data/.git/logs/refs/remotes/origin/minor-name-changes +1 -0
- data/.git/logs/refs/stash +1 -0
- data/.git/objects/05/207ded3952d840ba340c85a6f6c96b22ca1c67 +0 -0
- data/.git/objects/06/61209566f12727ab3976b2a747ac4f1a470dbb +0 -0
- data/.git/objects/07/0ef73c7375d71e0c339fc4aead20a94bdce9cd +0 -0
- data/.git/objects/09/3a47fc9464be57d4e6cd75bdeca68529dfa266 +0 -0
- data/.git/objects/0b/13becb0672026236c3f08a689e114cabf3e822 +2 -0
- data/.git/objects/0b/b8805e9d0480adc26c683bf7a1bd3eb2665e63 +0 -0
- data/.git/objects/11/57e944f6067e26491cef7d109d112788bb191e +0 -0
- data/.git/objects/1a/067207e458b64430a6a79e21886f343334b3fc +0 -0
- data/.git/objects/1a/3673f33c56f4cc23a54287689848536642748e +0 -0
- data/.git/objects/20/c351e1ee1bdc479818659d65258270c7d617a2 +0 -0
- data/.git/objects/20/d8723a745139ddfb87fd27e1178f88aaf0e93c +2 -0
- data/.git/objects/24/8f7300de1cd8580c21601c27a8315d52adab40 +0 -0
- data/.git/objects/28/2eebe389bbf8cf3a8d3cf134122efaca57e269 +0 -0
- data/.git/objects/29/aa78fd51aa4d90e1735db9320829cebbc6f774 +0 -0
- data/.git/objects/2f/2a216e86ef1e3e0c17a18948e9ddfcb7824fbe +0 -0
- data/.git/objects/2f/f19a188c1bb17bd2eb90c50c7a13310caa63e4 +0 -0
- data/.git/objects/32/a211703f0ae31329162799c7b44aaebf8cfef5 +0 -0
- data/.git/objects/33/c40c2e3408720afaa18f5a6ed09de12c7c56c6 +2 -0
- data/.git/objects/34/57a6355860054942ca5f713eba623b5add5a4b +0 -0
- data/.git/objects/34/fe522e62971aa628f2d607e22a5df151d7594c +0 -0
- data/.git/objects/36/8ffaf5d41725272eac6de6afe1d7a4abc6a4c8 +0 -0
- data/.git/objects/39/80ee7e8608ec095f751b30e4ccb4d4e3d2f063 +0 -0
- data/.git/objects/39/91d58f78b5ddb1216fe120b834b184822a0d77 +0 -0
- data/.git/objects/3b/55cedd0b036421b5cc56809db567a93652bd27 +0 -0
- data/.git/objects/42/ee185379834da4a07947cdabf2594d877ede05 +1 -0
- data/.git/objects/45/635f8c395eb61f91834254b3d6504ce99a0c59 +0 -0
- data/.git/objects/46/cba8f26c2c2d78c370601a75ebf431fcc128bb +0 -0
- data/.git/objects/4b/4957b2c5b28c05f73bafb25c3779c8687acfa4 +0 -0
- data/.git/objects/4c/60da0b7246a7fa15887a4e0d70771d5f79361a +1 -0
- data/.git/objects/4c/ca36fa8ee4f353e76fd3c835c93f88c9b3f894 +0 -0
- data/.git/objects/4d/d92d2a28eb8e40a86c3ff35fcde1e77dd51ecd +0 -0
- data/.git/objects/4e/34db983e3d5bf8d6e38ce35b51ade3e72d5840 +0 -0
- data/.git/objects/51/418c10bd4cc59a50e23a740dfa16d5663fb5b9 +0 -0
- data/.git/objects/52/1691fc61347c01b77918b60ec1dc228cd0b6f3 +0 -0
- data/.git/objects/52/846381a80ccbb768e15771050dd9aea4b88f26 +0 -0
- data/.git/objects/55/bb31194c235e81c92bd1a6ac27235c038cd2fc +1 -0
- data/.git/objects/57/4bd5b259664d1fc66dd90d88fc62f20e695cfe +2 -0
- data/.git/objects/58/8b61fa66a0e289c2344d1a2c78edaab3da59e9 +0 -0
- data/.git/objects/5a/88ced498186dae91e7bf0065ab8948c2e2140a +0 -0
- data/.git/objects/5d/be59d06419f3d3631db6097dbc62b5741a533e +1 -0
- data/.git/objects/5d/fefea9b6eb5dbb84b561b7a196aa4c6d6aaa58 +1 -0
- data/.git/objects/5f/a988a61b5cd5eb62a1f33a8170e3d0cec76be8 +0 -0
- data/.git/objects/60/02dcf4e9b0e86485b11091469ef77f061be228 +0 -0
- data/.git/objects/61/626cd3240ac7cef12dae40aa6bbbd014ad31dd +0 -0
- data/.git/objects/64/3c305e1d46a4969ddefabbfe59f9f20400817c +0 -0
- data/.git/objects/67/301489447605605ba8f6816c6e1bac7ec58f3e +4 -0
- data/.git/objects/68/75867b1f8adc25281dc23edfb9f70cfc2ad30d +0 -0
- data/.git/objects/68/9db29b73abed60c8d0d63124898091062dd106 +0 -0
- data/.git/objects/69/8a251ce3adf8a0b32ba74b122e0c2f99173922 +1 -0
- data/.git/objects/6a/10a18940a6d0239fd4d72d01ae681759251be4 +2 -0
- data/.git/objects/6a/5392570ca6a567e7b261f9c5399fa0dc44a113 +0 -0
- data/.git/objects/6f/7243614d7ed0d0fa647639f196dc4485f9435c +0 -0
- data/.git/objects/70/5da6fdb5474c4f92e3c65ddc7ced93dc618ac0 +0 -0
- data/.git/objects/74/6aa425712c6bbd485efaf9f95f2f73fa622702 +2 -0
- data/.git/objects/75/38d91a4499798974359a00507060121fedea77 +0 -0
- data/.git/objects/76/65fc5b4b82ea4f9aadd9672ce66bd6bbbadb0d +0 -0
- data/.git/objects/76/db52c476f419150d6553de60eec15217526a01 +0 -0
- data/.git/objects/77/e9713b5406c687b6d38d0a4dc3ea3c4ad4ec9d +2 -0
- data/.git/objects/78/11ce4804edd24700cde280e882392dd0de56e1 +2 -0
- data/.git/objects/80/bf6dbac2ae42557f6393c2e78ba81ad6e9c68b +0 -0
- data/.git/objects/8c/18f1abdd4147f400c02b45e57297449ae4bc43 +0 -0
- data/.git/objects/8c/4d95b0d995eed356bfe4577315132d4bf8e882 +0 -0
- data/.git/objects/8c/713c7faea64564db38b030985b4486a5a71adf +0 -0
- data/.git/objects/8e/b3b06b354e66d48de9d2f18fdc515ed52bafce +0 -0
- data/.git/objects/8e/ec8161a1fb58c6c0dfa12e05cab2817f463efa +0 -0
- data/.git/objects/8e/eec52ca9a4f714fa81b7c628914003717f2f4f +0 -0
- data/.git/objects/8f/17d73858eb80d739567ea846611b293f04bc1f +0 -0
- data/.git/objects/93/cb94306b63a2b3c9ffc36bc84ffc9fbc721777 +0 -0
- data/.git/objects/94/e461e0c8ecc3cec222e844b598992de14950f8 +0 -0
- data/.git/objects/96/04be05406705b325f60f22904fd7013f8d2bea +0 -0
- data/.git/objects/97/84e27f7a46f6a67c93b4d795a427adf7fc1ccb +0 -0
- data/.git/objects/97/990865fa520687678012c560585a4559eb01a0 +0 -0
- data/.git/objects/97/b4449d01443f80ea573c642012412b1913df93 +6 -0
- data/.git/objects/98/ba30921fd065c5054fc96966a1b2a2bf36d0f4 +0 -0
- data/.git/objects/9a/ca5762ffc9c77aa0ee9142e340cbf7882578be +0 -0
- data/.git/objects/9b/191d4a8975dbc5b07dc9de0ee871d9a2ca4b3e +0 -0
- data/.git/objects/a1/4155143d8e4d6cd0ffae8152fb0cd55f3a2a87 +0 -0
- data/.git/objects/a1/e0131ff3206a21075e8bff68bcc80d8d99e3a0 +0 -0
- data/.git/objects/ae/a7249864acee43f29aefa916f2c3df3d2b0741 +0 -0
- data/.git/objects/b2/385f78fb3d40feb046f478e6925363a14a7bde +0 -0
- data/.git/objects/b3/dfa6ec25306eb895532ae999ba23dea16f90c9 +1 -0
- data/.git/objects/b4/cf7f5c04e871793943e616ae6aeeba54c12916 +0 -0
- data/.git/objects/b5/b44ab814dc2eef359699d58ee68a8fab4c72b1 +2 -0
- data/.git/objects/b5/ea8d2da4d4c15fbd0bdce8ee4c3ec031de086d +0 -0
- data/.git/objects/b7/e9ed549be37412bd2f7e90f0b33165e3052ceb +0 -0
- data/.git/objects/c1/ac00052cd7698f0bf2510530f87da6afebf278 +0 -0
- data/.git/objects/ca/15d31acd0eccf4137161c972e6af3beab7fefb +0 -0
- data/.git/objects/cb/8bfa539de51e7585a3ce7f2069ada57eb66d9e +2 -0
- data/.git/objects/ce/a706e0e64d2acc15d653ecc842fd072a15ffed +0 -0
- data/.git/objects/cf/f50a5c7af66c069e935ab1d332e5420ffe7063 +0 -0
- data/.git/objects/d0/74fd4b00b5378d84885571802d1c214cab055e +0 -0
- data/.git/objects/d1/85dd79a60fb633167a5f08c4c6d5839a30843f +1 -0
- data/.git/objects/d2/a8d603e12dd80c1eea052ebf3173666f4ba1cb +0 -0
- data/.git/objects/d8/991243827c6ce1382530580ee2271c293600aa +0 -0
- data/.git/objects/d9/40caa2b379fbf0f1a6fced2993a284307b62ad +0 -0
- data/.git/objects/db/d2a1661624b308c54897676bbfa26f407ee5a7 +0 -0
- data/.git/objects/dc/e67d860af47a4eb630117ce03624bae45dcf26 +3 -0
- data/.git/objects/de/0a2da315f811f866cc6008a0b71d0c9d94b33e +0 -0
- data/.git/objects/df/ca81670614d58b337f023d669498db94ef9cf6 +0 -0
- data/.git/objects/e3/f666b411c3df9b90e4a27e0afefd0be386242f +0 -0
- data/.git/objects/e5/0246cfa4aba2947e8ca440c796454ac0954e0c +0 -0
- data/.git/objects/e9/46a801d541b4e1c734a0eff14928e1883df492 +0 -0
- data/.git/objects/ea/8caf1050a591b2965d5d06b8b95c877818cfcd +0 -0
- data/.git/objects/eb/8f6c322b3786b1ce6063c74511c76d27115e0a +0 -0
- data/.git/objects/eb/e52995c614ee2d781562bcfcf43983baf0a43a +0 -0
- data/.git/objects/ef/b27738131cce265ab7aab4ec8670ba7c5d470a +0 -0
- data/.git/objects/f4/2cc898a6b4d371cb01f695eb9bd56ca0f419e9 +0 -0
- data/.git/objects/f5/9ff20aeecbf2cae832e25b6506d20d54b55578 +0 -0
- data/.git/objects/f6/4c0df54b94bf55a1aa56abff0067728e2eb052 +0 -0
- data/.git/objects/f8/e8e644d5ad60ba7652767266ff73e60a7f0a6b +0 -0
- data/.git/objects/fa/b7b630518fda529ee1f72a1800ac18e71a823c +0 -0
- data/.git/objects/fc/c211363a3bbdd9bb2e059f52268820421084a2 +3 -0
- data/.git/refs/heads/master +1 -0
- data/.git/refs/heads/minor-name-changes +1 -0
- data/.git/refs/remotes/origin/basic-stats-basic-structs +1 -0
- data/.git/refs/remotes/origin/init +1 -0
- data/.git/refs/remotes/origin/master +1 -0
- data/.git/refs/remotes/origin/minor-name-changes +1 -0
- data/.git/refs/stash +1 -0
- data/.gitignore +12 -0
- data/.rspec +4 -0
- data/.rspec_status +6 -0
- data/.travis.yml +5 -0
- data/Dockerfile +17 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +37 -0
- data/README.md +56 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/docker-compose.yml +6 -0
- data/exe/ssstats +3 -0
- data/lib/ssstats/version.rb +3 -0
- data/lib/ssstats.rb +129 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/ssstats_spec.rb +53 -0
- data/ssstats.gemspec +21 -0
- metadata +208 -0
data/lib/ssstats.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
|
2
|
+
class Ssstats
|
3
|
+
|
4
|
+
# TODO 2-sigma stats
|
5
|
+
CURRENTLY_AVAILABLE = %i[qty min max sum avg std]
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@stats = {}
|
9
|
+
@schema = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def <<(datum)
|
13
|
+
stat_schema datum, @schema, @stats
|
14
|
+
end
|
15
|
+
|
16
|
+
def schema
|
17
|
+
clone @schema
|
18
|
+
end
|
19
|
+
|
20
|
+
def stats
|
21
|
+
clone @stats
|
22
|
+
end
|
23
|
+
|
24
|
+
def stat(key)
|
25
|
+
@stats.transform_values{|col| col[key]}.compact
|
26
|
+
end
|
27
|
+
|
28
|
+
CURRENTLY_AVAILABLE.each do |calc|
|
29
|
+
define_method calc do
|
30
|
+
stat calc
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def stat_schema(datum, schema, stats, path=[])
|
37
|
+
stat_add path.join('.'), datum
|
38
|
+
|
39
|
+
if datum.respond_to? :keys
|
40
|
+
(schema || {}).tap do |schema|
|
41
|
+
datum.keys.each do |key|
|
42
|
+
key_s = key.to_s
|
43
|
+
key_s += "'" while schema[key_s] && class_of(schema[key_s]) != class_of(datum[key])
|
44
|
+
schema[key_s] = stat_schema(datum[key], schema[key_s], stats, path + [key_s])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
elsif datum.respond_to? :each
|
48
|
+
(schema || []).tap do |schema|
|
49
|
+
datum.each do |el|
|
50
|
+
el_schema = schema.find{|e| class_of(e) == class_of(el)}
|
51
|
+
new_schema = stat_schema(el, el_schema, stats, path + [class_of(datum)])
|
52
|
+
schema << new_schema unless el_schema
|
53
|
+
end
|
54
|
+
end
|
55
|
+
else
|
56
|
+
if datum.class.respond_to? :new
|
57
|
+
datum.class.new
|
58
|
+
else
|
59
|
+
rep_class = datum.class
|
60
|
+
while rep_class # NOTE this complication is due to cases like the Fixnum's
|
61
|
+
return send rep_class.name, 0 if Kernel.respond_to? rep_class.name # NOTE the case of Numeric's
|
62
|
+
rep_class = rep_class.superclass
|
63
|
+
end
|
64
|
+
fail "Can't represent #{datum} (#{datum.class.name})"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def stat_add(key, val)
|
70
|
+
stat_key = [key, class_of(val)].join('.')
|
71
|
+
val_stat = @stats[stat_key] ||= {}
|
72
|
+
stat_count val_stat
|
73
|
+
|
74
|
+
if val.respond_to? :length
|
75
|
+
len_stat = @stats[[stat_key, 'length'].join '.'] ||= {}
|
76
|
+
stat_count len_stat
|
77
|
+
num_stat len_stat, val.length
|
78
|
+
end
|
79
|
+
|
80
|
+
num_stat val_stat, val if val.is_a? Numeric
|
81
|
+
end
|
82
|
+
|
83
|
+
def num_stat(stat, num)
|
84
|
+
num_stat_min_max stat, num
|
85
|
+
num_stat_sum stat, num
|
86
|
+
num_stat_avg_std stat, num
|
87
|
+
end
|
88
|
+
|
89
|
+
def stat_count(stat)
|
90
|
+
stat[:qty] ||= 0
|
91
|
+
stat[:qty] += 1
|
92
|
+
end
|
93
|
+
|
94
|
+
def num_stat_min_max(stat, num)
|
95
|
+
stat[:min] ||= num
|
96
|
+
stat[:min] = num if num < stat[:min]
|
97
|
+
stat[:max] ||= num
|
98
|
+
stat[:max] = num if num > stat[:max]
|
99
|
+
end
|
100
|
+
|
101
|
+
def num_stat_sum(stat, num)
|
102
|
+
stat[:sum] ||= 0
|
103
|
+
stat[:sum] += num
|
104
|
+
end
|
105
|
+
|
106
|
+
def num_stat_avg_std(stat, num)
|
107
|
+
# NOTE ref https://www.johndcook.com/blog/standard_deviation
|
108
|
+
stat[:avg] ||= 0.0
|
109
|
+
avg_was = stat[:avg]
|
110
|
+
stat[:avg] += (num - avg_was) / stat[:qty] # NOTE qty is not zero here
|
111
|
+
stat[:delta_squares_sum] ||= 0.0
|
112
|
+
stat[:delta_squares_sum] += (num - avg_was) * (num - stat[:avg])
|
113
|
+
stat[:std] = Math.sqrt(stat[:delta_squares_sum] / stat[:qty])
|
114
|
+
end
|
115
|
+
|
116
|
+
def clone(thing)
|
117
|
+
Marshal.load Marshal.dump thing
|
118
|
+
end
|
119
|
+
|
120
|
+
def class_of(datum)
|
121
|
+
if datum.respond_to? :keys
|
122
|
+
Hash
|
123
|
+
elsif datum.respond_to? :each
|
124
|
+
Array
|
125
|
+
else
|
126
|
+
datum.class
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'byebug'
|
3
|
+
require 'ssstats'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
# Enable flags like --only-failures and --next-failure
|
7
|
+
config.example_status_persistence_file_path = '.rspec_status'
|
8
|
+
|
9
|
+
config.expect_with :rspec do |c|
|
10
|
+
c.syntax = :expect
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
RSpec.describe Ssstats do
|
2
|
+
|
3
|
+
it "has a version number" do
|
4
|
+
expect(Ssstats::VERSION).not_to be nil
|
5
|
+
end
|
6
|
+
|
7
|
+
it "stats (and schemes) unstructured data" do
|
8
|
+
subject << {weather: {temperature: 32.0}, score: {'Real' => 2, 'Barcelona' => 2}}
|
9
|
+
subject << {weather: "freezing", score: {'Real' => 1, 'Barcelona' => 0}}
|
10
|
+
|
11
|
+
expect(subject.schema).to(
|
12
|
+
eq "weather" => {"temperature" => 0.0}, "weather'" => "", "score" => {"Real" => 0, "Barcelona" => 0}
|
13
|
+
)
|
14
|
+
expect(subject.avg).to(
|
15
|
+
eq ".Hash.length" => 2.0, "weather.Hash.length" => 1.0, "weather.temperature.Float" => 32.0,
|
16
|
+
"score.Hash.length" => 2.0, "score.Real.Integer" => 1.5, "score.Barcelona.Integer" => 1.0, "weather'.String.length" => 8.0
|
17
|
+
)
|
18
|
+
Ssstats::CURRENTLY_AVAILABLE.each do |calc|
|
19
|
+
expect(subject.stat calc).to_not be_empty, "#{calc} be calculated"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "collects useful statistics off simply (and loosely) structured data" do
|
24
|
+
subject << {did: '6978a678d79e', ts: 1234567890, sd: [{os: 123, hz: 55.66}, {os: 101, hz: 56.56}, {os: 77, hz: 54.45}, {os: 39, hz: 57.99}]}
|
25
|
+
subject << {did: '6978a678d79e', ts: 1234568901, sd: [{os: 104, hz: 53.56}, {os: 73, hz: 52.25}]}
|
26
|
+
subject << {did: '6978a678d79e', ts: 1234569012, sd: []}
|
27
|
+
subject << {did: '6978a678d79e', ts: 1234569999, sd: [{os: 0, error: 404}]}
|
28
|
+
|
29
|
+
expect(subject.schema).to(
|
30
|
+
eq 'did' => "", 'ts' => 0, 'sd' => [{'os' => 0, 'hz' => 0.0, 'error' => 0}]
|
31
|
+
)
|
32
|
+
|
33
|
+
expect(subject.std).to(
|
34
|
+
eq '.Hash.length' => 0.0, 'ts.Integer' => 746.7002410606281, 'sd.Array.length' => 1.479019945774904, 'sd.Array.Hash.length' => 0.0, 'sd.Array.os.Integer' => 39.17152235062235,
|
35
|
+
'sd.Array.hz.Float' => 1.9022391776243297, 'sd.Array.error.Integer' => 0.0, 'did.String.length' => 0.0
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "collects useful statistics off oddly structured data" do
|
40
|
+
subject << {uid: '6978a678d79e', ts: 1234567890, sdHz: [55.66, 56.56, 54.45, 57.99], sdOs: [123, 101, 77, 39]}
|
41
|
+
subject << {uid: '6978a678d79e', ts: 1234568901, sdHz: [53.56, 52.25], sdOs: [104, 73]}
|
42
|
+
subject << {uid: '6978a678d79e', ts: 1234569012, sdHz: [], sdOs: []}
|
43
|
+
|
44
|
+
expect(subject.schema).to(
|
45
|
+
eq 'uid' => "", 'ts' => 0, 'sdHz' => [0.0], 'sdOs' => [0]
|
46
|
+
)
|
47
|
+
|
48
|
+
expect(subject.std).to(
|
49
|
+
eq '.Hash.length' => 0.0, 'ts.Integer' => 504.79104587938167, 'sdHz.Array.length' => 1.632993161855452, 'sdHz.Array.Float' => 1.9022391776243297,
|
50
|
+
'sdOs.Array.length' => 1.632993161855452, 'sdOs.Array.Integer' => 27.00874344026804, 'uid.String.length' => 0.0
|
51
|
+
)
|
52
|
+
end
|
53
|
+
end
|
data/ssstats.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'ssstats/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'ssstats'
|
8
|
+
spec.version = Ssstats::VERSION
|
9
|
+
spec.authors = ["Costa Shapiro", "Owlytics Healthcare (former BandManage)"]
|
10
|
+
spec.email = ['costa@mouldwarp.com', 'contact@owlytics.com']
|
11
|
+
spec.summary = "Stupid Simple Statistics (for unstructured data)"
|
12
|
+
spec.description = "Consumes simple data structures, produces elementary statistics"
|
13
|
+
spec.homepage = "https://github.com/bandmanage/ssstats"
|
14
|
+
|
15
|
+
spec.files = `find . -print0`.split("\x0").reject do |f|
|
16
|
+
f.match(%r{^(test|spec|features)/})
|
17
|
+
end
|
18
|
+
spec.bindir = 'exe'
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ['lib']
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,208 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ssstats
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Costa Shapiro
|
8
|
+
- Owlytics Healthcare (former BandManage)
|
9
|
+
autorequire:
|
10
|
+
bindir: exe
|
11
|
+
cert_chain: []
|
12
|
+
date: 2017-08-13 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Consumes simple data structures, produces elementary statistics
|
15
|
+
email:
|
16
|
+
- costa@mouldwarp.com
|
17
|
+
- contact@owlytics.com
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- "./.git/COMMIT_EDITMSG"
|
23
|
+
- "./.git/FETCH_HEAD"
|
24
|
+
- "./.git/HEAD"
|
25
|
+
- "./.git/ORIG_HEAD"
|
26
|
+
- "./.git/config"
|
27
|
+
- "./.git/description"
|
28
|
+
- "./.git/hooks/applypatch-msg.sample"
|
29
|
+
- "./.git/hooks/commit-msg.sample"
|
30
|
+
- "./.git/hooks/post-update.sample"
|
31
|
+
- "./.git/hooks/pre-applypatch.sample"
|
32
|
+
- "./.git/hooks/pre-commit.sample"
|
33
|
+
- "./.git/hooks/pre-push.sample"
|
34
|
+
- "./.git/hooks/pre-rebase.sample"
|
35
|
+
- "./.git/hooks/pre-receive.sample"
|
36
|
+
- "./.git/hooks/prepare-commit-msg.sample"
|
37
|
+
- "./.git/hooks/update.sample"
|
38
|
+
- "./.git/index"
|
39
|
+
- "./.git/info/exclude"
|
40
|
+
- "./.git/logs/HEAD"
|
41
|
+
- "./.git/logs/refs/heads/master"
|
42
|
+
- "./.git/logs/refs/heads/minor-name-changes"
|
43
|
+
- "./.git/logs/refs/remotes/origin/basic-stats-basic-structs"
|
44
|
+
- "./.git/logs/refs/remotes/origin/init"
|
45
|
+
- "./.git/logs/refs/remotes/origin/master"
|
46
|
+
- "./.git/logs/refs/remotes/origin/minor-name-changes"
|
47
|
+
- "./.git/logs/refs/stash"
|
48
|
+
- "./.git/objects/05/207ded3952d840ba340c85a6f6c96b22ca1c67"
|
49
|
+
- "./.git/objects/06/61209566f12727ab3976b2a747ac4f1a470dbb"
|
50
|
+
- "./.git/objects/07/0ef73c7375d71e0c339fc4aead20a94bdce9cd"
|
51
|
+
- "./.git/objects/09/3a47fc9464be57d4e6cd75bdeca68529dfa266"
|
52
|
+
- "./.git/objects/0b/13becb0672026236c3f08a689e114cabf3e822"
|
53
|
+
- "./.git/objects/0b/b8805e9d0480adc26c683bf7a1bd3eb2665e63"
|
54
|
+
- "./.git/objects/11/57e944f6067e26491cef7d109d112788bb191e"
|
55
|
+
- "./.git/objects/1a/067207e458b64430a6a79e21886f343334b3fc"
|
56
|
+
- "./.git/objects/1a/3673f33c56f4cc23a54287689848536642748e"
|
57
|
+
- "./.git/objects/20/c351e1ee1bdc479818659d65258270c7d617a2"
|
58
|
+
- "./.git/objects/20/d8723a745139ddfb87fd27e1178f88aaf0e93c"
|
59
|
+
- "./.git/objects/24/8f7300de1cd8580c21601c27a8315d52adab40"
|
60
|
+
- "./.git/objects/28/2eebe389bbf8cf3a8d3cf134122efaca57e269"
|
61
|
+
- "./.git/objects/29/aa78fd51aa4d90e1735db9320829cebbc6f774"
|
62
|
+
- "./.git/objects/2f/2a216e86ef1e3e0c17a18948e9ddfcb7824fbe"
|
63
|
+
- "./.git/objects/2f/f19a188c1bb17bd2eb90c50c7a13310caa63e4"
|
64
|
+
- "./.git/objects/32/a211703f0ae31329162799c7b44aaebf8cfef5"
|
65
|
+
- "./.git/objects/33/c40c2e3408720afaa18f5a6ed09de12c7c56c6"
|
66
|
+
- "./.git/objects/34/57a6355860054942ca5f713eba623b5add5a4b"
|
67
|
+
- "./.git/objects/34/fe522e62971aa628f2d607e22a5df151d7594c"
|
68
|
+
- "./.git/objects/36/8ffaf5d41725272eac6de6afe1d7a4abc6a4c8"
|
69
|
+
- "./.git/objects/39/80ee7e8608ec095f751b30e4ccb4d4e3d2f063"
|
70
|
+
- "./.git/objects/39/91d58f78b5ddb1216fe120b834b184822a0d77"
|
71
|
+
- "./.git/objects/3b/55cedd0b036421b5cc56809db567a93652bd27"
|
72
|
+
- "./.git/objects/42/ee185379834da4a07947cdabf2594d877ede05"
|
73
|
+
- "./.git/objects/45/635f8c395eb61f91834254b3d6504ce99a0c59"
|
74
|
+
- "./.git/objects/46/cba8f26c2c2d78c370601a75ebf431fcc128bb"
|
75
|
+
- "./.git/objects/4b/4957b2c5b28c05f73bafb25c3779c8687acfa4"
|
76
|
+
- "./.git/objects/4c/60da0b7246a7fa15887a4e0d70771d5f79361a"
|
77
|
+
- "./.git/objects/4c/ca36fa8ee4f353e76fd3c835c93f88c9b3f894"
|
78
|
+
- "./.git/objects/4d/d92d2a28eb8e40a86c3ff35fcde1e77dd51ecd"
|
79
|
+
- "./.git/objects/4e/34db983e3d5bf8d6e38ce35b51ade3e72d5840"
|
80
|
+
- "./.git/objects/51/418c10bd4cc59a50e23a740dfa16d5663fb5b9"
|
81
|
+
- "./.git/objects/52/1691fc61347c01b77918b60ec1dc228cd0b6f3"
|
82
|
+
- "./.git/objects/52/846381a80ccbb768e15771050dd9aea4b88f26"
|
83
|
+
- "./.git/objects/55/bb31194c235e81c92bd1a6ac27235c038cd2fc"
|
84
|
+
- "./.git/objects/57/4bd5b259664d1fc66dd90d88fc62f20e695cfe"
|
85
|
+
- "./.git/objects/58/8b61fa66a0e289c2344d1a2c78edaab3da59e9"
|
86
|
+
- "./.git/objects/5a/88ced498186dae91e7bf0065ab8948c2e2140a"
|
87
|
+
- "./.git/objects/5d/be59d06419f3d3631db6097dbc62b5741a533e"
|
88
|
+
- "./.git/objects/5d/fefea9b6eb5dbb84b561b7a196aa4c6d6aaa58"
|
89
|
+
- "./.git/objects/5f/a988a61b5cd5eb62a1f33a8170e3d0cec76be8"
|
90
|
+
- "./.git/objects/60/02dcf4e9b0e86485b11091469ef77f061be228"
|
91
|
+
- "./.git/objects/61/626cd3240ac7cef12dae40aa6bbbd014ad31dd"
|
92
|
+
- "./.git/objects/64/3c305e1d46a4969ddefabbfe59f9f20400817c"
|
93
|
+
- "./.git/objects/67/301489447605605ba8f6816c6e1bac7ec58f3e"
|
94
|
+
- "./.git/objects/68/75867b1f8adc25281dc23edfb9f70cfc2ad30d"
|
95
|
+
- "./.git/objects/68/9db29b73abed60c8d0d63124898091062dd106"
|
96
|
+
- "./.git/objects/69/8a251ce3adf8a0b32ba74b122e0c2f99173922"
|
97
|
+
- "./.git/objects/6a/10a18940a6d0239fd4d72d01ae681759251be4"
|
98
|
+
- "./.git/objects/6a/5392570ca6a567e7b261f9c5399fa0dc44a113"
|
99
|
+
- "./.git/objects/6f/7243614d7ed0d0fa647639f196dc4485f9435c"
|
100
|
+
- "./.git/objects/70/5da6fdb5474c4f92e3c65ddc7ced93dc618ac0"
|
101
|
+
- "./.git/objects/74/6aa425712c6bbd485efaf9f95f2f73fa622702"
|
102
|
+
- "./.git/objects/75/38d91a4499798974359a00507060121fedea77"
|
103
|
+
- "./.git/objects/76/65fc5b4b82ea4f9aadd9672ce66bd6bbbadb0d"
|
104
|
+
- "./.git/objects/76/db52c476f419150d6553de60eec15217526a01"
|
105
|
+
- "./.git/objects/77/e9713b5406c687b6d38d0a4dc3ea3c4ad4ec9d"
|
106
|
+
- "./.git/objects/78/11ce4804edd24700cde280e882392dd0de56e1"
|
107
|
+
- "./.git/objects/80/bf6dbac2ae42557f6393c2e78ba81ad6e9c68b"
|
108
|
+
- "./.git/objects/8c/18f1abdd4147f400c02b45e57297449ae4bc43"
|
109
|
+
- "./.git/objects/8c/4d95b0d995eed356bfe4577315132d4bf8e882"
|
110
|
+
- "./.git/objects/8c/713c7faea64564db38b030985b4486a5a71adf"
|
111
|
+
- "./.git/objects/8e/b3b06b354e66d48de9d2f18fdc515ed52bafce"
|
112
|
+
- "./.git/objects/8e/ec8161a1fb58c6c0dfa12e05cab2817f463efa"
|
113
|
+
- "./.git/objects/8e/eec52ca9a4f714fa81b7c628914003717f2f4f"
|
114
|
+
- "./.git/objects/8f/17d73858eb80d739567ea846611b293f04bc1f"
|
115
|
+
- "./.git/objects/93/cb94306b63a2b3c9ffc36bc84ffc9fbc721777"
|
116
|
+
- "./.git/objects/94/e461e0c8ecc3cec222e844b598992de14950f8"
|
117
|
+
- "./.git/objects/96/04be05406705b325f60f22904fd7013f8d2bea"
|
118
|
+
- "./.git/objects/97/84e27f7a46f6a67c93b4d795a427adf7fc1ccb"
|
119
|
+
- "./.git/objects/97/990865fa520687678012c560585a4559eb01a0"
|
120
|
+
- "./.git/objects/97/b4449d01443f80ea573c642012412b1913df93"
|
121
|
+
- "./.git/objects/98/ba30921fd065c5054fc96966a1b2a2bf36d0f4"
|
122
|
+
- "./.git/objects/9a/ca5762ffc9c77aa0ee9142e340cbf7882578be"
|
123
|
+
- "./.git/objects/9b/191d4a8975dbc5b07dc9de0ee871d9a2ca4b3e"
|
124
|
+
- "./.git/objects/a1/4155143d8e4d6cd0ffae8152fb0cd55f3a2a87"
|
125
|
+
- "./.git/objects/a1/e0131ff3206a21075e8bff68bcc80d8d99e3a0"
|
126
|
+
- "./.git/objects/ae/a7249864acee43f29aefa916f2c3df3d2b0741"
|
127
|
+
- "./.git/objects/b2/385f78fb3d40feb046f478e6925363a14a7bde"
|
128
|
+
- "./.git/objects/b3/dfa6ec25306eb895532ae999ba23dea16f90c9"
|
129
|
+
- "./.git/objects/b4/cf7f5c04e871793943e616ae6aeeba54c12916"
|
130
|
+
- "./.git/objects/b5/b44ab814dc2eef359699d58ee68a8fab4c72b1"
|
131
|
+
- "./.git/objects/b5/ea8d2da4d4c15fbd0bdce8ee4c3ec031de086d"
|
132
|
+
- "./.git/objects/b7/e9ed549be37412bd2f7e90f0b33165e3052ceb"
|
133
|
+
- "./.git/objects/c1/ac00052cd7698f0bf2510530f87da6afebf278"
|
134
|
+
- "./.git/objects/ca/15d31acd0eccf4137161c972e6af3beab7fefb"
|
135
|
+
- "./.git/objects/cb/8bfa539de51e7585a3ce7f2069ada57eb66d9e"
|
136
|
+
- "./.git/objects/ce/a706e0e64d2acc15d653ecc842fd072a15ffed"
|
137
|
+
- "./.git/objects/cf/f50a5c7af66c069e935ab1d332e5420ffe7063"
|
138
|
+
- "./.git/objects/d0/74fd4b00b5378d84885571802d1c214cab055e"
|
139
|
+
- "./.git/objects/d1/85dd79a60fb633167a5f08c4c6d5839a30843f"
|
140
|
+
- "./.git/objects/d2/a8d603e12dd80c1eea052ebf3173666f4ba1cb"
|
141
|
+
- "./.git/objects/d8/991243827c6ce1382530580ee2271c293600aa"
|
142
|
+
- "./.git/objects/d9/40caa2b379fbf0f1a6fced2993a284307b62ad"
|
143
|
+
- "./.git/objects/db/d2a1661624b308c54897676bbfa26f407ee5a7"
|
144
|
+
- "./.git/objects/dc/e67d860af47a4eb630117ce03624bae45dcf26"
|
145
|
+
- "./.git/objects/de/0a2da315f811f866cc6008a0b71d0c9d94b33e"
|
146
|
+
- "./.git/objects/df/ca81670614d58b337f023d669498db94ef9cf6"
|
147
|
+
- "./.git/objects/e3/f666b411c3df9b90e4a27e0afefd0be386242f"
|
148
|
+
- "./.git/objects/e5/0246cfa4aba2947e8ca440c796454ac0954e0c"
|
149
|
+
- "./.git/objects/e9/46a801d541b4e1c734a0eff14928e1883df492"
|
150
|
+
- "./.git/objects/ea/8caf1050a591b2965d5d06b8b95c877818cfcd"
|
151
|
+
- "./.git/objects/eb/8f6c322b3786b1ce6063c74511c76d27115e0a"
|
152
|
+
- "./.git/objects/eb/e52995c614ee2d781562bcfcf43983baf0a43a"
|
153
|
+
- "./.git/objects/ef/b27738131cce265ab7aab4ec8670ba7c5d470a"
|
154
|
+
- "./.git/objects/f4/2cc898a6b4d371cb01f695eb9bd56ca0f419e9"
|
155
|
+
- "./.git/objects/f5/9ff20aeecbf2cae832e25b6506d20d54b55578"
|
156
|
+
- "./.git/objects/f6/4c0df54b94bf55a1aa56abff0067728e2eb052"
|
157
|
+
- "./.git/objects/f8/e8e644d5ad60ba7652767266ff73e60a7f0a6b"
|
158
|
+
- "./.git/objects/fa/b7b630518fda529ee1f72a1800ac18e71a823c"
|
159
|
+
- "./.git/objects/fc/c211363a3bbdd9bb2e059f52268820421084a2"
|
160
|
+
- "./.git/refs/heads/master"
|
161
|
+
- "./.git/refs/heads/minor-name-changes"
|
162
|
+
- "./.git/refs/remotes/origin/basic-stats-basic-structs"
|
163
|
+
- "./.git/refs/remotes/origin/init"
|
164
|
+
- "./.git/refs/remotes/origin/master"
|
165
|
+
- "./.git/refs/remotes/origin/minor-name-changes"
|
166
|
+
- "./.git/refs/stash"
|
167
|
+
- "./.gitignore"
|
168
|
+
- "./.rspec"
|
169
|
+
- "./.rspec_status"
|
170
|
+
- "./.travis.yml"
|
171
|
+
- "./Dockerfile"
|
172
|
+
- "./Gemfile"
|
173
|
+
- "./Gemfile.lock"
|
174
|
+
- "./README.md"
|
175
|
+
- "./Rakefile"
|
176
|
+
- "./bin/console"
|
177
|
+
- "./bin/setup"
|
178
|
+
- "./docker-compose.yml"
|
179
|
+
- "./exe/ssstats"
|
180
|
+
- "./lib/ssstats.rb"
|
181
|
+
- "./lib/ssstats/version.rb"
|
182
|
+
- "./spec/spec_helper.rb"
|
183
|
+
- "./spec/ssstats_spec.rb"
|
184
|
+
- "./ssstats.gemspec"
|
185
|
+
homepage: https://github.com/bandmanage/ssstats
|
186
|
+
licenses: []
|
187
|
+
metadata: {}
|
188
|
+
post_install_message:
|
189
|
+
rdoc_options: []
|
190
|
+
require_paths:
|
191
|
+
- lib
|
192
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
193
|
+
requirements:
|
194
|
+
- - ">="
|
195
|
+
- !ruby/object:Gem::Version
|
196
|
+
version: '0'
|
197
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - ">="
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
requirements: []
|
203
|
+
rubyforge_project:
|
204
|
+
rubygems_version: 2.6.8
|
205
|
+
signing_key:
|
206
|
+
specification_version: 4
|
207
|
+
summary: Stupid Simple Statistics (for unstructured data)
|
208
|
+
test_files: []
|