feldtruby 0.2.2 → 0.3.0

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/.gitignore ADDED
@@ -0,0 +1,49 @@
1
+ # rcov or simplecov generated
2
+ coverage
3
+ coverage.data
4
+
5
+ # rdoc generated
6
+ rdoc
7
+
8
+ # yard generated
9
+ doc
10
+ .yardoc
11
+
12
+ # bundler
13
+ .bundle
14
+
15
+ # jeweler generated
16
+ pkg
17
+
18
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
19
+ #
20
+ # * Create a file at ~/.gitignore
21
+ # * Include files you want ignored
22
+ # * Run: git config --global core.excludesfile ~/.gitignore
23
+ #
24
+ # After doing this, these files will be ignored in all your git projects,
25
+ # saving you from having to 'pollute' every project you touch with them
26
+ #
27
+ # Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
28
+ #
29
+ # For MacOS:
30
+ #
31
+ .DS_Store
32
+
33
+ # For TextMate
34
+ #*.tmproj
35
+ #tmtags
36
+
37
+ # For emacs:
38
+ #*~
39
+ #\#*
40
+ #.\#*
41
+
42
+ # For vim:
43
+ #*.swp
44
+
45
+ # For redcar:
46
+ #.redcar
47
+
48
+ # For rubinius:
49
+ #*.rbc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in feldtruby.gemspec
4
+ gemspec
data/Rakefile CHANGED
@@ -1,19 +1,26 @@
1
- # -*- ruby -*-
1
+ require "bundler/gem_tasks"
2
2
 
3
- require 'rubygems'
4
- require 'hoe'
3
+ require 'fileutils'
5
4
 
6
- # Hoe.plugin :compiler
7
- # Hoe.plugin :gem_prelude_sucks
8
- # Hoe.plugin :inline
9
- # Hoe.plugin :racc
10
- # Hoe.plugin :rcov
11
- # Hoe.plugin :rubyforge
5
+ def psys(str)
6
+ puts str
7
+ system str
8
+ end
12
9
 
13
- Hoe.plugin :gemcutter
10
+ desc "Run all tests"
11
+ task :test do
12
+ helper_files = Dir["test/**/*helper*.rb"]
13
+ test_files = Dir["test/**/test*.rb"]
14
+ require_files = (helper_files + test_files).map {|f| "require \"#{f}\""}.join('; ')
15
+ psys "ruby -Ilib:. -e '#{require_files}' --"
16
+ end
14
17
 
15
- Hoe.spec 'feldtruby' do
16
- developer 'Robert Feldt', 'robert.feldt@gmail.com'
18
+ desc "Clean up intermediate/build files"
19
+ task :clean do
20
+ FileUtils.rm_rf "pkg"
21
+ end
17
22
 
18
- license 'MIT' # this should match the license in the README
19
- end
23
+ desc "Clean the repo of any files that should not be checked in"
24
+ task :clobber => [:clean]
25
+
26
+ task :default => :test
data/feldtruby.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'feldtruby/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "feldtruby"
8
+ gem.version = FeldtRuby::VERSION
9
+ gem.authors = ["Robert Feldt"]
10
+ gem.email = ["robert.feldt@gmail.com"]
11
+ gem.description = %q{Robert Feldt's Common Ruby Code lib}
12
+ gem.summary = %q{Robert Feldt's Common Ruby Code lib}
13
+ gem.homepage = "https://github.com/robertfeldt/feldtruby"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency('rinruby')
21
+ gem.add_dependency('json')
22
+ end
@@ -37,4 +37,11 @@ class Array
37
37
  self << element unless self.include?(element)
38
38
  self
39
39
  end
40
+
41
+ # Count elements in array and return as hash mapping elements to their counts.
42
+ def counts
43
+ count_hash = Hash.new(0)
44
+ self.each {|element| count_hash[element] += 1}
45
+ count_hash
46
+ end
40
47
  end
@@ -0,0 +1,16 @@
1
+ require 'minitest/unit'
2
+ require 'minitest/spec'
3
+ require 'feldtruby/statistics'
4
+
5
+ module MiniTest::Assertions
6
+ # Ensure that that are (statistically) the same number of each type
7
+ # of value in an array.
8
+ def assert_similar_proportions(values, msg = nil)
9
+ pvalue = FeldtRuby.probability_of_same_proportions(values)
10
+ assert(pvalue >= 0.95, msg || "Proportions differ! p-value that they are the same is #{pvalue} (<0.95)")
11
+ end
12
+ end
13
+
14
+ module MiniTest::Expectations
15
+ infect_an_assertion :assert_similar_proportions, :must_have_similar_proportions
16
+ end
@@ -0,0 +1,109 @@
1
+ require 'rinruby'
2
+ require 'json'
3
+
4
+ require 'feldtruby/array'
5
+ require 'feldtruby/array/basic_stats'
6
+
7
+ module FeldtRuby
8
+
9
+ # RCommunicator uses RinRuby to communicate with an instance of R.
10
+ # We extend the basic RinRuby by using json to tunnel back and forth.
11
+ class RCommunicator
12
+ def initialize
13
+ # Will stay open until closed or the ruby interpreter exits.
14
+ # echo = false and interactive = false
15
+ @r = RinRuby.new(false, false)
16
+ setup_r()
17
+ end
18
+
19
+ # Include necessary libraries.
20
+ def setup_r
21
+ include_library("rjson")
22
+ end
23
+
24
+ # Include a library after ensuring it has been installed
25
+ def include_library(lib)
26
+ @r.eval "if(!library(#{lib}, logical.return=TRUE)) {install.packages(\"#{lib}\"); library(#{lib});}"
27
+ end
28
+
29
+ def eval(str)
30
+ @r.eval str
31
+ end
32
+
33
+ # This represents a hash returned as JSON from R but mapped to a
34
+ # Ruby object so we can more easily use it as if it was an R object.
35
+ class Rvalue
36
+ def initialize(hash)
37
+ @___h = hash
38
+ hash.to_a.each do |name, value|
39
+ ruby_name = ___ruby_name(name)
40
+ @___h[ruby_name] = @___h[name] if ruby_name != name
41
+ self.define_singleton_method(ruby_name) {@___h[name]}
42
+ end
43
+ end
44
+ def ___ruby_name(name)
45
+ name.gsub(".", "_")
46
+ end
47
+ def to_h; @___h; end
48
+ end
49
+
50
+ # Call an R method named rmethod with (Ruby) arguments. Returns
51
+ # an Integer, Float or an Rvalue (if the returned R value is complex).
52
+ def call(rmethod, *arguments)
53
+ str, args = "", []
54
+ arguments.each_with_index do |arg, index|
55
+ args << (argname = arg_name(index))
56
+ str += "#{argname} <- fromJSON(\"#{arg.to_json}\");\n"
57
+ end
58
+ resname = res_name(1)
59
+ str += "#{resname} <- toJSON(#{rmethod.to_s}(#{args.join(', ')}));\n"
60
+ @r.eval str
61
+ pull_json_variable(resname)
62
+ end
63
+
64
+ # Get the JSON value from a variable in R and parse it back to a Ruby value.
65
+ def pull_json_variable(variableName)
66
+ res = @r.pull(variableName)
67
+ begin
68
+ Rvalue.new JSON.parse(res)
69
+ rescue JSON::ParserError
70
+ # First try to convert to Integer, then Float if it fails.
71
+ begin
72
+ Kernel::Integer(res)
73
+ rescue ArgumentError
74
+ Kernel::Float(res)
75
+ end
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ def res_name(index = 1)
82
+ arg_name(index, "res")
83
+ end
84
+
85
+ def arg_name(index, prefix = "arg")
86
+ "#{prefix}_#{index}_#{self.object_id}"
87
+ end
88
+ end
89
+
90
+ module Statistics
91
+ # Calc the probability that the unique values in array (or
92
+ # hash of counts of the values) have (statistically) equal proportions.
93
+ def probability_of_same_proportions(aryOrHashOfCounts)
94
+ counts = (Hash === aryOrHashOfCounts) ? aryOrHashOfCounts : aryOrHashOfCounts.counts
95
+ vs = counts.values
96
+ res = RC.call("prop.test", vs, ([vs.sum] * vs.length))
97
+ res.p_value
98
+ end
99
+ end
100
+
101
+ # Make them available at top level
102
+ extend Statistics
103
+
104
+ end
105
+
106
+ # Create one instance that people can use without having to instantiate.
107
+ unless defined?(Kernel::RC)
108
+ Kernel::RC = FeldtRuby::RCommunicator.new
109
+ end
@@ -0,0 +1,3 @@
1
+ module FeldtRuby
2
+ VERSION = "0.3.0"
3
+ end
data/test/test_array.rb CHANGED
@@ -82,4 +82,22 @@ describe "Array extensions" do
82
82
  [1,2,3].add_unless_there(3).must_equal [1,2,3]
83
83
  end
84
84
  end
85
+
86
+ describe "count_elements" do
87
+ it "counts elements when only two of them" do
88
+ counts = [2,1,2,2,1,1,2,1,2].counts
89
+ counts.keys.sort.must_equal [1,2]
90
+ counts[1].must_equal 4
91
+ counts[2].must_equal 5
92
+ end
93
+
94
+ it "counts elements when many different elements and of different types" do
95
+ counts = [:a, :b, :b, "c", "d", 5, "c", 5, "c", "d", 5, "d", 5, 5, "d"].counts
96
+ counts[:a].must_equal 1
97
+ counts[:b].must_equal 2
98
+ counts["c"].must_equal 3
99
+ counts["d"].must_equal 4
100
+ counts[5].must_equal 5
101
+ end
102
+ end
85
103
  end
@@ -0,0 +1,86 @@
1
+ require 'feldtruby/statistics'
2
+
3
+ describe "RCommunicator" do
4
+ describe "RValue" do
5
+ it "can be used to access individual elements by their key/name" do
6
+ rv = FeldtRuby::RCommunicator::Rvalue.new({"a" => 1, "b" => "2"})
7
+ rv.a.must_equal 1
8
+ rv.b.must_equal "2"
9
+ end
10
+
11
+ it "maps non-ruby method names so they can be used as method names" do
12
+ rv = FeldtRuby::RCommunicator::Rvalue.new({"p.value" => 0.06})
13
+ rv.p_value.must_equal 0.06
14
+ end
15
+ end
16
+
17
+ describe "calling simple R functions that returns integers" do
18
+ it "can call sum, min, max etc" do
19
+ RC.call("sum", [1,2,3]).must_equal 6
20
+ RC.call("min", [1,2,3]).must_equal 1
21
+ RC.call("max", [1,2,3]).must_equal 3
22
+ end
23
+ end
24
+
25
+ describe "calling simple R functions that returns floats" do
26
+ it "can call sum, min, max etc" do
27
+ RC.call("sum", [1.2, 3.4]).must_equal 4.6
28
+ RC.call("min", [1.2, 3.4]).must_equal 1.2
29
+ RC.call("max", [1.2, 3.4]).must_equal 3.4
30
+ end
31
+
32
+ it "can call also with a symbol for the method name" do
33
+ RC.call(:mean, [1,2,3]).must_equal 2.0
34
+ end
35
+ end
36
+
37
+ describe "calling R functions that return complex objects" do
38
+ it "can call prop.test" do
39
+ res = RC.call("prop.test", [60, 40], [100, 100])
40
+ res.p_value.must_be_close_to 0.0072
41
+ cilow, cihigh = res.conf_int
42
+ cilow.must_be_close_to 0.0542
43
+ cihigh.must_be_close_to 0.3458
44
+ end
45
+ end
46
+ end
47
+
48
+ describe "Statistics" do
49
+ include FeldtRuby::Statistics
50
+ describe "Proportion testing for the count of values" do
51
+ it "works when counts are explicitly given" do
52
+ # A proportion test checks if the number/proportion of occurences of objects
53
+ # differ. It returns the probability that the proportions are the same
54
+ # given the actual counts.
55
+ probability_of_same_proportions({:a => 50, :b => 50}).must_be_close_to 1.0000
56
+ probability_of_same_proportions({:a => 51, :b => 49}).must_be_close_to 0.8875
57
+ probability_of_same_proportions({:a => 52, :b => 48}).must_be_close_to 0.6714
58
+ probability_of_same_proportions({:a => 53, :b => 47}).must_be_close_to 0.4795
59
+ probability_of_same_proportions({:a => 54, :b => 46}).must_be_close_to 0.3222
60
+ probability_of_same_proportions({:a => 55, :b => 45}).must_be_close_to 0.2031
61
+ probability_of_same_proportions({:a => 56, :b => 44}).must_be_close_to 0.1198
62
+ probability_of_same_proportions({:a => 57, :b => 43}).must_be_close_to 0.0659
63
+ probability_of_same_proportions({:a => 58, :b => 42}).must_be_close_to 0.0339
64
+ probability_of_same_proportions({:a => 59, :b => 41}).must_be_close_to 0.0162
65
+ probability_of_same_proportions({:a => 60, :b => 40}).must_be_close_to 0.0072
66
+ end
67
+
68
+ it "works when an array of the actual elements are given" do
69
+ probability_of_same_proportions(([:a] * 570) + ([:b] * 430)).must_be_close_to 5.091e-10
70
+ end
71
+ end
72
+ end
73
+
74
+ require 'feldtruby/minitest_extensions'
75
+
76
+ describe "Test Statistics but with the extensions to MiniTest framework" do
77
+ it "can use assert_same_proportions" do
78
+ assert_similar_proportions [1,1,1,1,1, 2,2,2,2,2]
79
+ # This should fail but I found now way to test it since it uses the MiniTest framework itself...
80
+ # assert_similar_proportions( [1]*60 + [2]*40 )
81
+ end
82
+
83
+ it "can use must_have_similar_proportions" do
84
+ [1,1,1,1,1, 2,2,2,2,2].must_have_similar_proportions
85
+ end
86
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: feldtruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,64 +9,54 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-21 00:00:00.000000000 Z
12
+ date: 2012-12-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: rdoc
15
+ name: rinruby
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ~>
19
+ - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: '3.10'
22
- type: :development
21
+ version: '0'
22
+ type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ~>
27
+ - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
- version: '3.10'
29
+ version: '0'
30
30
  - !ruby/object:Gem::Dependency
31
- name: hoe
31
+ name: json
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
35
- - - ~>
35
+ - - ! '>='
36
36
  - !ruby/object:Gem::Version
37
- version: '3.4'
38
- type: :development
37
+ version: '0'
38
+ type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
- - - ~>
43
+ - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
- version: '3.4'
46
- description: ! 'Robert Feldt''s Common Ruby Code lib. I will gradually collect the
47
- many generally useful Ruby tidbits I have laying around and clean them up into here.
48
- Don''t want to rewrite these things again and again... So far this collects a number
49
- of generally useful additions to the standard Ruby classes/libs and then includes
50
- a simple optimization framework (FeldtRuby::Optimize).
51
-
52
-
53
- email: robert.feldt ((a)) gmail.com'
45
+ version: '0'
46
+ description: Robert Feldt's Common Ruby Code lib
54
47
  email:
55
48
  - robert.feldt@gmail.com
56
49
  executables: []
57
50
  extensions: []
58
- extra_rdoc_files:
59
- - History.txt
60
- - Manifest.txt
61
- - README.txt
51
+ extra_rdoc_files: []
62
52
  files:
63
- - .autotest
53
+ - .gitignore
54
+ - Gemfile
64
55
  - History.txt
65
- - Manifest.txt
66
- - README.txt
67
56
  - README.md
68
57
  - Rakefile
69
58
  - TODO
59
+ - feldtruby.gemspec
70
60
  - lib/feldtruby.rb
71
61
  - lib/feldtruby/array.rb
72
62
  - lib/feldtruby/array/basic_stats.rb
@@ -75,6 +65,7 @@ files:
75
65
  - lib/feldtruby/file/tempfile.rb
76
66
  - lib/feldtruby/float.rb
77
67
  - lib/feldtruby/math/rand.rb
68
+ - lib/feldtruby/minitest_extensions.rb
78
69
  - lib/feldtruby/net/html_doc_getter.rb
79
70
  - lib/feldtruby/optimize.rb
80
71
  - lib/feldtruby/optimize/differential_evolution.rb
@@ -84,9 +75,11 @@ files:
84
75
  - lib/feldtruby/optimize/random_search.rb
85
76
  - lib/feldtruby/optimize/search_space.rb
86
77
  - lib/feldtruby/optimize/stdout_logger.rb
78
+ - lib/feldtruby/statistics.rb
87
79
  - lib/feldtruby/string/to_iso.rb
88
80
  - lib/feldtruby/time.rb
89
81
  - lib/feldtruby/vector.rb
82
+ - lib/feldtruby/version.rb
90
83
  - lib/feldtruby/visualization/circos.rb
91
84
  - lib/feldtruby/word_counter.rb
92
85
  - test/helper.rb
@@ -94,24 +87,21 @@ files:
94
87
  - test/test_array_basic_stats.rb
95
88
  - test/test_array_count_by.rb
96
89
  - test/test_float.rb
90
+ - test/test_html_doc_getter.rb
97
91
  - test/test_optimize.rb
98
92
  - test/test_optimize_differential_evolution.rb
99
93
  - test/test_optimize_objective.rb
100
94
  - test/test_optimize_populationbasedoptimizer.rb
101
95
  - test/test_optimize_random_search.rb
102
96
  - test/test_optimize_search_space.rb
97
+ - test/test_statistics.rb
103
98
  - test/test_time.rb
104
99
  - test/test_vector.rb
105
- - test/test_html_doc_getter.rb
106
100
  - test/test_word_counter.rb
107
- - .gemtest
108
101
  homepage: https://github.com/robertfeldt/feldtruby
109
- licenses:
110
- - MIT
102
+ licenses: []
111
103
  post_install_message:
112
- rdoc_options:
113
- - --main
114
- - README.txt
104
+ rdoc_options: []
115
105
  require_paths:
116
106
  - lib
117
107
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -127,12 +117,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
117
  - !ruby/object:Gem::Version
128
118
  version: '0'
129
119
  requirements: []
130
- rubyforge_project: feldtruby
120
+ rubyforge_project:
131
121
  rubygems_version: 1.8.24
132
122
  signing_key:
133
123
  specification_version: 3
134
124
  summary: Robert Feldt's Common Ruby Code lib
135
125
  test_files:
126
+ - test/helper.rb
136
127
  - test/test_array.rb
137
128
  - test/test_array_basic_stats.rb
138
129
  - test/test_array_count_by.rb
@@ -144,6 +135,7 @@ test_files:
144
135
  - test/test_optimize_populationbasedoptimizer.rb
145
136
  - test/test_optimize_random_search.rb
146
137
  - test/test_optimize_search_space.rb
138
+ - test/test_statistics.rb
147
139
  - test/test_time.rb
148
140
  - test/test_vector.rb
149
141
  - test/test_word_counter.rb
data/.autotest DELETED
@@ -1,23 +0,0 @@
1
- # -*- ruby -*-
2
-
3
- require 'autotest/restart'
4
-
5
- # Autotest.add_hook :initialize do |at|
6
- # at.extra_files << "../some/external/dependency.rb"
7
- #
8
- # at.libs << ":../some/external"
9
- #
10
- # at.add_exception 'vendor'
11
- #
12
- # at.add_mapping(/dependency.rb/) do |f, _|
13
- # at.files_matching(/test_.*rb$/)
14
- # end
15
- #
16
- # %w(TestA TestB).each do |klass|
17
- # at.extra_class_map[klass] = "test/test_misc.rb"
18
- # end
19
- # end
20
-
21
- # Autotest.add_hook :run_command do |at|
22
- # system "rake build"
23
- # end
data/.gemtest DELETED
File without changes
data/Manifest.txt DELETED
@@ -1,44 +0,0 @@
1
- .autotest
2
- History.txt
3
- Manifest.txt
4
- README.txt
5
- README.md
6
- Rakefile
7
- TODO
8
- lib/feldtruby.rb
9
- lib/feldtruby/array.rb
10
- lib/feldtruby/array/basic_stats.rb
11
- lib/feldtruby/array/count_by.rb
12
- lib/feldtruby/file/file_change_watcher.rb
13
- lib/feldtruby/file/tempfile.rb
14
- lib/feldtruby/float.rb
15
- lib/feldtruby/math/rand.rb
16
- lib/feldtruby/net/html_doc_getter.rb
17
- lib/feldtruby/optimize.rb
18
- lib/feldtruby/optimize/differential_evolution.rb
19
- lib/feldtruby/optimize/max_steps_termination_criterion.rb
20
- lib/feldtruby/optimize/objective.rb
21
- lib/feldtruby/optimize/optimizer.rb
22
- lib/feldtruby/optimize/random_search.rb
23
- lib/feldtruby/optimize/search_space.rb
24
- lib/feldtruby/optimize/stdout_logger.rb
25
- lib/feldtruby/string/to_iso.rb
26
- lib/feldtruby/time.rb
27
- lib/feldtruby/vector.rb
28
- lib/feldtruby/visualization/circos.rb
29
- lib/feldtruby/word_counter.rb
30
- test/helper.rb
31
- test/test_array.rb
32
- test/test_array_basic_stats.rb
33
- test/test_array_count_by.rb
34
- test/test_float.rb
35
- test/test_optimize.rb
36
- test/test_optimize_differential_evolution.rb
37
- test/test_optimize_objective.rb
38
- test/test_optimize_populationbasedoptimizer.rb
39
- test/test_optimize_random_search.rb
40
- test/test_optimize_search_space.rb
41
- test/test_time.rb
42
- test/test_vector.rb
43
- test/test_html_doc_getter.rb
44
- test/test_word_counter.rb
data/README.txt DELETED
@@ -1,59 +0,0 @@
1
- = feldtruby
2
-
3
- * https://github.com/robertfeldt/feldtruby
4
-
5
- == DESCRIPTION:
6
-
7
- Robert Feldt's Common Ruby Code lib. I will gradually collect the many generally useful Ruby tidbits I have laying around and clean them up into here. Don't want to rewrite these things again and again... So far this collects a number of generally useful additions to the standard Ruby classes/libs and then includes a simple optimization framework (FeldtRuby::Optimize).
8
-
9
- email: robert.feldt ((a)) gmail.com
10
-
11
- == FEATURES/PROBLEMS:
12
-
13
- * FIX (list of features or problems)
14
-
15
- == SYNOPSIS:
16
-
17
- FIX (code sample of usage)
18
-
19
- == REQUIREMENTS:
20
-
21
- * FIX (list of requirements)
22
-
23
- == INSTALL:
24
-
25
- * FIX (sudo gem install, anything else)
26
-
27
- == DEVELOPERS:
28
-
29
- After checking out the source, run:
30
-
31
- $ rake newb
32
-
33
- This task will install any missing dependencies, run the tests/specs,
34
- and generate the RDoc.
35
-
36
- == LICENSE:
37
-
38
- (The MIT License)
39
-
40
- Copyright (c) 2012 FIX
41
-
42
- Permission is hereby granted, free of charge, to any person obtaining
43
- a copy of this software and associated documentation files (the
44
- 'Software'), to deal in the Software without restriction, including
45
- without limitation the rights to use, copy, modify, merge, publish,
46
- distribute, sublicense, and/or sell copies of the Software, and to
47
- permit persons to whom the Software is furnished to do so, subject to
48
- the following conditions:
49
-
50
- The above copyright notice and this permission notice shall be
51
- included in all copies or substantial portions of the Software.
52
-
53
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
54
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
55
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
56
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
57
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
58
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
59
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.