ssstats 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. checksums.yaml +7 -0
  2. data/.git/COMMIT_EDITMSG +10 -0
  3. data/.git/FETCH_HEAD +1 -0
  4. data/.git/HEAD +1 -0
  5. data/.git/ORIG_HEAD +1 -0
  6. data/.git/config +15 -0
  7. data/.git/description +1 -0
  8. data/.git/hooks/applypatch-msg.sample +15 -0
  9. data/.git/hooks/commit-msg.sample +24 -0
  10. data/.git/hooks/post-update.sample +8 -0
  11. data/.git/hooks/pre-applypatch.sample +14 -0
  12. data/.git/hooks/pre-commit.sample +49 -0
  13. data/.git/hooks/pre-push.sample +53 -0
  14. data/.git/hooks/pre-rebase.sample +169 -0
  15. data/.git/hooks/pre-receive.sample +24 -0
  16. data/.git/hooks/prepare-commit-msg.sample +36 -0
  17. data/.git/hooks/update.sample +128 -0
  18. data/.git/index +0 -0
  19. data/.git/info/exclude +6 -0
  20. data/.git/logs/HEAD +24 -0
  21. data/.git/logs/refs/heads/master +4 -0
  22. data/.git/logs/refs/heads/minor-name-changes +3 -0
  23. data/.git/logs/refs/remotes/origin/basic-stats-basic-structs +2 -0
  24. data/.git/logs/refs/remotes/origin/init +1 -0
  25. data/.git/logs/refs/remotes/origin/master +4 -0
  26. data/.git/logs/refs/remotes/origin/minor-name-changes +1 -0
  27. data/.git/logs/refs/stash +1 -0
  28. data/.git/objects/05/207ded3952d840ba340c85a6f6c96b22ca1c67 +0 -0
  29. data/.git/objects/06/61209566f12727ab3976b2a747ac4f1a470dbb +0 -0
  30. data/.git/objects/07/0ef73c7375d71e0c339fc4aead20a94bdce9cd +0 -0
  31. data/.git/objects/09/3a47fc9464be57d4e6cd75bdeca68529dfa266 +0 -0
  32. data/.git/objects/0b/13becb0672026236c3f08a689e114cabf3e822 +2 -0
  33. data/.git/objects/0b/b8805e9d0480adc26c683bf7a1bd3eb2665e63 +0 -0
  34. data/.git/objects/11/57e944f6067e26491cef7d109d112788bb191e +0 -0
  35. data/.git/objects/1a/067207e458b64430a6a79e21886f343334b3fc +0 -0
  36. data/.git/objects/1a/3673f33c56f4cc23a54287689848536642748e +0 -0
  37. data/.git/objects/20/c351e1ee1bdc479818659d65258270c7d617a2 +0 -0
  38. data/.git/objects/20/d8723a745139ddfb87fd27e1178f88aaf0e93c +2 -0
  39. data/.git/objects/24/8f7300de1cd8580c21601c27a8315d52adab40 +0 -0
  40. data/.git/objects/28/2eebe389bbf8cf3a8d3cf134122efaca57e269 +0 -0
  41. data/.git/objects/29/aa78fd51aa4d90e1735db9320829cebbc6f774 +0 -0
  42. data/.git/objects/2f/2a216e86ef1e3e0c17a18948e9ddfcb7824fbe +0 -0
  43. data/.git/objects/2f/f19a188c1bb17bd2eb90c50c7a13310caa63e4 +0 -0
  44. data/.git/objects/32/a211703f0ae31329162799c7b44aaebf8cfef5 +0 -0
  45. data/.git/objects/33/c40c2e3408720afaa18f5a6ed09de12c7c56c6 +2 -0
  46. data/.git/objects/34/57a6355860054942ca5f713eba623b5add5a4b +0 -0
  47. data/.git/objects/34/fe522e62971aa628f2d607e22a5df151d7594c +0 -0
  48. data/.git/objects/36/8ffaf5d41725272eac6de6afe1d7a4abc6a4c8 +0 -0
  49. data/.git/objects/39/80ee7e8608ec095f751b30e4ccb4d4e3d2f063 +0 -0
  50. data/.git/objects/39/91d58f78b5ddb1216fe120b834b184822a0d77 +0 -0
  51. data/.git/objects/3b/55cedd0b036421b5cc56809db567a93652bd27 +0 -0
  52. data/.git/objects/42/ee185379834da4a07947cdabf2594d877ede05 +1 -0
  53. data/.git/objects/45/635f8c395eb61f91834254b3d6504ce99a0c59 +0 -0
  54. data/.git/objects/46/cba8f26c2c2d78c370601a75ebf431fcc128bb +0 -0
  55. data/.git/objects/4b/4957b2c5b28c05f73bafb25c3779c8687acfa4 +0 -0
  56. data/.git/objects/4c/60da0b7246a7fa15887a4e0d70771d5f79361a +1 -0
  57. data/.git/objects/4c/ca36fa8ee4f353e76fd3c835c93f88c9b3f894 +0 -0
  58. data/.git/objects/4d/d92d2a28eb8e40a86c3ff35fcde1e77dd51ecd +0 -0
  59. data/.git/objects/4e/34db983e3d5bf8d6e38ce35b51ade3e72d5840 +0 -0
  60. data/.git/objects/51/418c10bd4cc59a50e23a740dfa16d5663fb5b9 +0 -0
  61. data/.git/objects/52/1691fc61347c01b77918b60ec1dc228cd0b6f3 +0 -0
  62. data/.git/objects/52/846381a80ccbb768e15771050dd9aea4b88f26 +0 -0
  63. data/.git/objects/55/bb31194c235e81c92bd1a6ac27235c038cd2fc +1 -0
  64. data/.git/objects/57/4bd5b259664d1fc66dd90d88fc62f20e695cfe +2 -0
  65. data/.git/objects/58/8b61fa66a0e289c2344d1a2c78edaab3da59e9 +0 -0
  66. data/.git/objects/5a/88ced498186dae91e7bf0065ab8948c2e2140a +0 -0
  67. data/.git/objects/5d/be59d06419f3d3631db6097dbc62b5741a533e +1 -0
  68. data/.git/objects/5d/fefea9b6eb5dbb84b561b7a196aa4c6d6aaa58 +1 -0
  69. data/.git/objects/5f/a988a61b5cd5eb62a1f33a8170e3d0cec76be8 +0 -0
  70. data/.git/objects/60/02dcf4e9b0e86485b11091469ef77f061be228 +0 -0
  71. data/.git/objects/61/626cd3240ac7cef12dae40aa6bbbd014ad31dd +0 -0
  72. data/.git/objects/64/3c305e1d46a4969ddefabbfe59f9f20400817c +0 -0
  73. data/.git/objects/67/301489447605605ba8f6816c6e1bac7ec58f3e +4 -0
  74. data/.git/objects/68/75867b1f8adc25281dc23edfb9f70cfc2ad30d +0 -0
  75. data/.git/objects/68/9db29b73abed60c8d0d63124898091062dd106 +0 -0
  76. data/.git/objects/69/8a251ce3adf8a0b32ba74b122e0c2f99173922 +1 -0
  77. data/.git/objects/6a/10a18940a6d0239fd4d72d01ae681759251be4 +2 -0
  78. data/.git/objects/6a/5392570ca6a567e7b261f9c5399fa0dc44a113 +0 -0
  79. data/.git/objects/6f/7243614d7ed0d0fa647639f196dc4485f9435c +0 -0
  80. data/.git/objects/70/5da6fdb5474c4f92e3c65ddc7ced93dc618ac0 +0 -0
  81. data/.git/objects/74/6aa425712c6bbd485efaf9f95f2f73fa622702 +2 -0
  82. data/.git/objects/75/38d91a4499798974359a00507060121fedea77 +0 -0
  83. data/.git/objects/76/65fc5b4b82ea4f9aadd9672ce66bd6bbbadb0d +0 -0
  84. data/.git/objects/76/db52c476f419150d6553de60eec15217526a01 +0 -0
  85. data/.git/objects/77/e9713b5406c687b6d38d0a4dc3ea3c4ad4ec9d +2 -0
  86. data/.git/objects/78/11ce4804edd24700cde280e882392dd0de56e1 +2 -0
  87. data/.git/objects/80/bf6dbac2ae42557f6393c2e78ba81ad6e9c68b +0 -0
  88. data/.git/objects/8c/18f1abdd4147f400c02b45e57297449ae4bc43 +0 -0
  89. data/.git/objects/8c/4d95b0d995eed356bfe4577315132d4bf8e882 +0 -0
  90. data/.git/objects/8c/713c7faea64564db38b030985b4486a5a71adf +0 -0
  91. data/.git/objects/8e/b3b06b354e66d48de9d2f18fdc515ed52bafce +0 -0
  92. data/.git/objects/8e/ec8161a1fb58c6c0dfa12e05cab2817f463efa +0 -0
  93. data/.git/objects/8e/eec52ca9a4f714fa81b7c628914003717f2f4f +0 -0
  94. data/.git/objects/8f/17d73858eb80d739567ea846611b293f04bc1f +0 -0
  95. data/.git/objects/93/cb94306b63a2b3c9ffc36bc84ffc9fbc721777 +0 -0
  96. data/.git/objects/94/e461e0c8ecc3cec222e844b598992de14950f8 +0 -0
  97. data/.git/objects/96/04be05406705b325f60f22904fd7013f8d2bea +0 -0
  98. data/.git/objects/97/84e27f7a46f6a67c93b4d795a427adf7fc1ccb +0 -0
  99. data/.git/objects/97/990865fa520687678012c560585a4559eb01a0 +0 -0
  100. data/.git/objects/97/b4449d01443f80ea573c642012412b1913df93 +6 -0
  101. data/.git/objects/98/ba30921fd065c5054fc96966a1b2a2bf36d0f4 +0 -0
  102. data/.git/objects/9a/ca5762ffc9c77aa0ee9142e340cbf7882578be +0 -0
  103. data/.git/objects/9b/191d4a8975dbc5b07dc9de0ee871d9a2ca4b3e +0 -0
  104. data/.git/objects/a1/4155143d8e4d6cd0ffae8152fb0cd55f3a2a87 +0 -0
  105. data/.git/objects/a1/e0131ff3206a21075e8bff68bcc80d8d99e3a0 +0 -0
  106. data/.git/objects/ae/a7249864acee43f29aefa916f2c3df3d2b0741 +0 -0
  107. data/.git/objects/b2/385f78fb3d40feb046f478e6925363a14a7bde +0 -0
  108. data/.git/objects/b3/dfa6ec25306eb895532ae999ba23dea16f90c9 +1 -0
  109. data/.git/objects/b4/cf7f5c04e871793943e616ae6aeeba54c12916 +0 -0
  110. data/.git/objects/b5/b44ab814dc2eef359699d58ee68a8fab4c72b1 +2 -0
  111. data/.git/objects/b5/ea8d2da4d4c15fbd0bdce8ee4c3ec031de086d +0 -0
  112. data/.git/objects/b7/e9ed549be37412bd2f7e90f0b33165e3052ceb +0 -0
  113. data/.git/objects/c1/ac00052cd7698f0bf2510530f87da6afebf278 +0 -0
  114. data/.git/objects/ca/15d31acd0eccf4137161c972e6af3beab7fefb +0 -0
  115. data/.git/objects/cb/8bfa539de51e7585a3ce7f2069ada57eb66d9e +2 -0
  116. data/.git/objects/ce/a706e0e64d2acc15d653ecc842fd072a15ffed +0 -0
  117. data/.git/objects/cf/f50a5c7af66c069e935ab1d332e5420ffe7063 +0 -0
  118. data/.git/objects/d0/74fd4b00b5378d84885571802d1c214cab055e +0 -0
  119. data/.git/objects/d1/85dd79a60fb633167a5f08c4c6d5839a30843f +1 -0
  120. data/.git/objects/d2/a8d603e12dd80c1eea052ebf3173666f4ba1cb +0 -0
  121. data/.git/objects/d8/991243827c6ce1382530580ee2271c293600aa +0 -0
  122. data/.git/objects/d9/40caa2b379fbf0f1a6fced2993a284307b62ad +0 -0
  123. data/.git/objects/db/d2a1661624b308c54897676bbfa26f407ee5a7 +0 -0
  124. data/.git/objects/dc/e67d860af47a4eb630117ce03624bae45dcf26 +3 -0
  125. data/.git/objects/de/0a2da315f811f866cc6008a0b71d0c9d94b33e +0 -0
  126. data/.git/objects/df/ca81670614d58b337f023d669498db94ef9cf6 +0 -0
  127. data/.git/objects/e3/f666b411c3df9b90e4a27e0afefd0be386242f +0 -0
  128. data/.git/objects/e5/0246cfa4aba2947e8ca440c796454ac0954e0c +0 -0
  129. data/.git/objects/e9/46a801d541b4e1c734a0eff14928e1883df492 +0 -0
  130. data/.git/objects/ea/8caf1050a591b2965d5d06b8b95c877818cfcd +0 -0
  131. data/.git/objects/eb/8f6c322b3786b1ce6063c74511c76d27115e0a +0 -0
  132. data/.git/objects/eb/e52995c614ee2d781562bcfcf43983baf0a43a +0 -0
  133. data/.git/objects/ef/b27738131cce265ab7aab4ec8670ba7c5d470a +0 -0
  134. data/.git/objects/f4/2cc898a6b4d371cb01f695eb9bd56ca0f419e9 +0 -0
  135. data/.git/objects/f5/9ff20aeecbf2cae832e25b6506d20d54b55578 +0 -0
  136. data/.git/objects/f6/4c0df54b94bf55a1aa56abff0067728e2eb052 +0 -0
  137. data/.git/objects/f8/e8e644d5ad60ba7652767266ff73e60a7f0a6b +0 -0
  138. data/.git/objects/fa/b7b630518fda529ee1f72a1800ac18e71a823c +0 -0
  139. data/.git/objects/fc/c211363a3bbdd9bb2e059f52268820421084a2 +3 -0
  140. data/.git/refs/heads/master +1 -0
  141. data/.git/refs/heads/minor-name-changes +1 -0
  142. data/.git/refs/remotes/origin/basic-stats-basic-structs +1 -0
  143. data/.git/refs/remotes/origin/init +1 -0
  144. data/.git/refs/remotes/origin/master +1 -0
  145. data/.git/refs/remotes/origin/minor-name-changes +1 -0
  146. data/.git/refs/stash +1 -0
  147. data/.gitignore +12 -0
  148. data/.rspec +4 -0
  149. data/.rspec_status +6 -0
  150. data/.travis.yml +5 -0
  151. data/Dockerfile +17 -0
  152. data/Gemfile +11 -0
  153. data/Gemfile.lock +37 -0
  154. data/README.md +56 -0
  155. data/Rakefile +6 -0
  156. data/bin/console +14 -0
  157. data/bin/setup +8 -0
  158. data/docker-compose.yml +6 -0
  159. data/exe/ssstats +3 -0
  160. data/lib/ssstats/version.rb +3 -0
  161. data/lib/ssstats.rb +129 -0
  162. data/spec/spec_helper.rb +12 -0
  163. data/spec/ssstats_spec.rb +53 -0
  164. data/ssstats.gemspec +21 -0
  165. 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
@@ -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: []