enumstats 0.0.1 → 0.0.2
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.
- data/.travis.yml +4 -0
- data/README.md +5 -3
- data/Rakefile +2 -2
- data/bin/stats +76 -0
- data/enumstats.gemspec +3 -1
- data/lib/enumstats/version.rb +1 -1
- data/lib/enumstats.rb +3 -0
- data/test/acceptance/test_app.rb +94 -0
- data/test/fixtures/example.2.data +3 -0
- data/test/fixtures/example.data +3 -0
- data/test/helper.rb +6 -0
- metadata +44 -3
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
#
|
1
|
+
# Enumerable Stats
|
2
2
|
|
3
|
-
|
3
|
+
Provides simple statistics for any Enumerable.
|
4
|
+
|
5
|
+
[](http://travis-ci.org/nerab/enumstats)
|
4
6
|
|
5
7
|
## Installation
|
6
8
|
|
@@ -18,7 +20,7 @@ Or install it yourself as:
|
|
18
20
|
|
19
21
|
## Usage
|
20
22
|
|
21
|
-
|
23
|
+
See unit tests for usage.
|
22
24
|
|
23
25
|
## Contributing
|
24
26
|
|
data/Rakefile
CHANGED
@@ -3,8 +3,8 @@ require "bundler/gem_tasks"
|
|
3
3
|
require 'rake/testtask'
|
4
4
|
|
5
5
|
Rake::TestTask.new do |test|
|
6
|
-
test.libs << 'lib' << 'test' << 'test/unit'
|
7
|
-
test.pattern = 'test
|
6
|
+
test.libs << 'lib' << 'test' << 'test/unit' << 'test/acceptance'
|
7
|
+
test.pattern = 'test/*/test_*.rb'
|
8
8
|
end
|
9
9
|
|
10
10
|
task :default => :test
|
data/bin/stats
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'enumstats'
|
5
|
+
require 'optparse'
|
6
|
+
|
7
|
+
output_available = %w[count mean variance standard_deviation sum min max]
|
8
|
+
output_selected = []
|
9
|
+
|
10
|
+
option_parser = OptionParser.new do |opts|
|
11
|
+
opts.banner = <<ABOUT
|
12
|
+
Calculates simple statistics like average, variance, and standard deviation.
|
13
|
+
Input is read from STDIN, separated by $IFS.
|
14
|
+
|
15
|
+
Author: Nicolas E. Rabenau <nerab@gmx.at>
|
16
|
+
|
17
|
+
Synopsis:
|
18
|
+
|
19
|
+
stats [options]
|
20
|
+
|
21
|
+
Example Usage:
|
22
|
+
|
23
|
+
# print all stats for the given array
|
24
|
+
echo '5.0 10.0 15.0' | stats
|
25
|
+
|
26
|
+
# print all stats except the mean
|
27
|
+
echo '5.0 10.0 15.0' | stats --no-mean
|
28
|
+
|
29
|
+
# print just the variance
|
30
|
+
echo '5.0 10.0 15.0' | stats --variance
|
31
|
+
|
32
|
+
# combine more than one stat
|
33
|
+
echo '5.0 10.0 15.0' | stats --min --variance
|
34
|
+
|
35
|
+
Options:
|
36
|
+
ABOUT
|
37
|
+
|
38
|
+
output_available.each do |stat|
|
39
|
+
opts.on("--[no-]#{stat}", "Do [only|not] print the #{stat}") do |selected|
|
40
|
+
if selected
|
41
|
+
output_selected << stat
|
42
|
+
else
|
43
|
+
output_available.delete(stat)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
begin
|
50
|
+
option_parser.parse!
|
51
|
+
rescue
|
52
|
+
STDERR.puts "Error: #{$!.message}"
|
53
|
+
STDERR.puts
|
54
|
+
STDERR.puts option_parser.banner
|
55
|
+
exit 1
|
56
|
+
end
|
57
|
+
|
58
|
+
data = []
|
59
|
+
|
60
|
+
ARGF.read.split.each do |line|
|
61
|
+
data << line.to_f
|
62
|
+
end
|
63
|
+
|
64
|
+
case output_selected.size
|
65
|
+
when 0
|
66
|
+
output_available.each do |stat|
|
67
|
+
puts "#{stat}: #{data.send(stat)}"
|
68
|
+
end
|
69
|
+
when 1
|
70
|
+
puts data.send(output_selected.first)
|
71
|
+
else
|
72
|
+
output_selected.each do |stat|
|
73
|
+
puts "#{stat}: #{data.send(stat)}"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
data/enumstats.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.email = ["nerab@gmx.net"]
|
7
7
|
gem.description = %q{Adds simple stats like average, variance and standard deviation to Enumerable}
|
8
8
|
gem.summary = %q{Stats for Enumerables}
|
9
|
-
gem.homepage = ""
|
9
|
+
gem.homepage = "https://github.com/nerab/enumstats"
|
10
10
|
|
11
11
|
gem.files = `git ls-files`.split($\)
|
12
12
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
@@ -16,4 +16,6 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.version = Enumstats::VERSION
|
17
17
|
|
18
18
|
gem.add_development_dependency 'rake'
|
19
|
+
gem.add_development_dependency 'open4'
|
20
|
+
gem.add_development_dependency 'pry'
|
19
21
|
end
|
data/lib/enumstats/version.rb
CHANGED
data/lib/enumstats.rb
CHANGED
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'open4'
|
3
|
+
|
4
|
+
#
|
5
|
+
# End-to-end application test
|
6
|
+
#
|
7
|
+
class TestEnumerableStatsApp < MiniTest::Unit::TestCase
|
8
|
+
include EnumStatsTest
|
9
|
+
APP_SCRIPT = 'ruby bin/stats'
|
10
|
+
ALL_STATS = %w[count mean variance standard_deviation sum min max]
|
11
|
+
|
12
|
+
def test_no_options
|
13
|
+
assert_app
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_mean
|
17
|
+
assert_app_include('mean')
|
18
|
+
assert_app_exclude('mean')
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_two
|
22
|
+
assert_app_include(['min', 'standard_deviation'])
|
23
|
+
assert_app_exclude(['max', 'variance', 'sum'])
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def assert_app
|
29
|
+
status = Open4::popen4("cat #{fixture_name('example.data')} | #{APP_SCRIPT}") do |pid, stdin, stdout, stderr|
|
30
|
+
lines = stdout.read.lines
|
31
|
+
assert_equal(ALL_STATS.count, lines.count, "expect to see these stats printed: #{ALL_STATS}. Instead, got: #{lines.inspect}")
|
32
|
+
|
33
|
+
lines.each do |line|
|
34
|
+
assert_match(/^(.*): (.*)$/, line)
|
35
|
+
end
|
36
|
+
|
37
|
+
assert_empty(stderr.read)
|
38
|
+
end
|
39
|
+
|
40
|
+
assert_equal(0, status)
|
41
|
+
end
|
42
|
+
|
43
|
+
#
|
44
|
+
# Tests the app called to print nothing but those stats that are explicitely included
|
45
|
+
#
|
46
|
+
# e.g.
|
47
|
+
# # set --mean to only display mean
|
48
|
+
# assert_app_include('mean')
|
49
|
+
#
|
50
|
+
def assert_app_include(args)
|
51
|
+
args = Array(args)
|
52
|
+
argstr = args.collect{|a| "--#{a}"}.join(' ')
|
53
|
+
status = Open4::popen4("cat #{fixture_name('example.data')} | #{APP_SCRIPT} #{argstr}") do |pid, stdin, stdout, stderr|
|
54
|
+
lines = stdout.read.lines
|
55
|
+
assert_equal(args.count, lines.count, "expect to see only those printed: #{args}. Instead, got: #{lines.inspect}")
|
56
|
+
|
57
|
+
lines.each do |line|
|
58
|
+
if 1 == args.count
|
59
|
+
assert_match(/^\d*\.\d*$/, line)
|
60
|
+
else
|
61
|
+
assert_match(/^(.*): (.*)$/, line)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
assert_empty(stderr.read)
|
66
|
+
end
|
67
|
+
|
68
|
+
assert_equal(0, status)
|
69
|
+
end
|
70
|
+
|
71
|
+
#
|
72
|
+
# Tests the app called to print all except those stats that are explicitely excluded
|
73
|
+
#
|
74
|
+
# e.g.
|
75
|
+
# # set --no-mean to display all except mean
|
76
|
+
# assert_app_exclude('mean')
|
77
|
+
#
|
78
|
+
def assert_app_exclude(args)
|
79
|
+
expected = ALL_STATS - Array(args)
|
80
|
+
argstr = Array(args).collect{|a| "--no-#{a}"}.join(' ')
|
81
|
+
status = Open4::popen4("cat #{fixture_name('example.data')} | #{APP_SCRIPT} #{argstr}") do |pid, stdin, stdout, stderr|
|
82
|
+
lines = stdout.read.lines
|
83
|
+
assert_equal(expected.count, lines.count, "expect to see only those printed: #{expected}. Instead, got: #{lines.inspect}")
|
84
|
+
|
85
|
+
lines.each do |line|
|
86
|
+
assert_match(/^(.*): (.*)$/, line)
|
87
|
+
end
|
88
|
+
|
89
|
+
assert_empty(stderr.read)
|
90
|
+
end
|
91
|
+
|
92
|
+
assert_equal(0, status)
|
93
|
+
end
|
94
|
+
end
|
data/test/helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enumstats
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -27,26 +27,64 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: open4
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: pry
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
30
62
|
description: Adds simple stats like average, variance and standard deviation to Enumerable
|
31
63
|
email:
|
32
64
|
- nerab@gmx.net
|
33
|
-
executables:
|
65
|
+
executables:
|
66
|
+
- stats
|
34
67
|
extensions: []
|
35
68
|
extra_rdoc_files: []
|
36
69
|
files:
|
37
70
|
- .gitignore
|
71
|
+
- .travis.yml
|
38
72
|
- Gemfile
|
39
73
|
- LICENSE
|
40
74
|
- README.md
|
41
75
|
- Rakefile
|
76
|
+
- bin/stats
|
42
77
|
- enumstats.gemspec
|
43
78
|
- lib/enumstats.rb
|
44
79
|
- lib/enumstats/enumerable.rb
|
45
80
|
- lib/enumstats/version.rb
|
81
|
+
- test/acceptance/test_app.rb
|
82
|
+
- test/fixtures/example.2.data
|
83
|
+
- test/fixtures/example.data
|
46
84
|
- test/helper.rb
|
47
85
|
- test/unit/test_enumerable_stats.rb
|
48
86
|
- test/unit/test_enumerable_stats_block.rb
|
49
|
-
homepage:
|
87
|
+
homepage: https://github.com/nerab/enumstats
|
50
88
|
licenses: []
|
51
89
|
post_install_message:
|
52
90
|
rdoc_options: []
|
@@ -71,6 +109,9 @@ signing_key:
|
|
71
109
|
specification_version: 3
|
72
110
|
summary: Stats for Enumerables
|
73
111
|
test_files:
|
112
|
+
- test/acceptance/test_app.rb
|
113
|
+
- test/fixtures/example.2.data
|
114
|
+
- test/fixtures/example.data
|
74
115
|
- test/helper.rb
|
75
116
|
- test/unit/test_enumerable_stats.rb
|
76
117
|
- test/unit/test_enumerable_stats_block.rb
|