kuku 0.1

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.
Files changed (4) hide show
  1. checksums.yaml +15 -0
  2. data/README.rdoc +17 -0
  3. data/lib/kuku.rb +158 -0
  4. metadata +45 -0
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ OGYxYTU5NjJjYmU3OWNiM2Q5MjFkMzYxNWQ4MzQ5ODRhNTk0MTZkMA==
5
+ data.tar.gz: !binary |-
6
+ NWYwZWViNGIzMjYxYWFkZjI4ODJlODM2YzIzMjhjZjFjOTQ5ZDZkYw==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZjVkMzY2YTVkZDU2OTA3MjU1MmQ0NDJiOTg3YTUwYmQwM2IxNGRjYjljMmQ0
10
+ YzllMWYyZTBjZmFmZGIxMTZjNGZiY2U5NjY0NzE1MDhiMTJjODk3N2RiYjgy
11
+ OGY2MGUxNDBmZmVhZjY0MmJiZWFjOTg3ZDlmYTk2MDMzODRlMzU=
12
+ data.tar.gz: !binary |-
13
+ YjQ2ZmY4MDFiMDdhZDdlMjFmYWU1OTdiZmVmY2UzMWZlZGMwMTk1ZDJhY2Nh
14
+ ODlmMmVkOGZkZWY2ZWY4MTg3MTU3MGQzYzIyZTc1ZGE0ZjE4ZDE2NGE0ODMx
15
+ MWJjMGYzMDM2MGYwODM1N2Y3ZDFiZjZjZmY2NjU2MzZjOGVhNGQ=
data/README.rdoc ADDED
@@ -0,0 +1,17 @@
1
+ = kuku
2
+
3
+ Ruby object modifications.
4
+ - Array as_chain
5
+ - Array rank
6
+ - Range near_top?, near_bottom?
7
+ - Object attributes, update_attributes
8
+
9
+ == INSTALL
10
+
11
+ gem install kuku
12
+
13
+ == DEPENDENCIES
14
+
15
+ None
16
+
17
+
data/lib/kuku.rb ADDED
@@ -0,0 +1,158 @@
1
+ module ChainAnalysis
2
+ def stability method_name, n=8
3
+ elements(method_name, n).stability
4
+ end
5
+ def average_growth method_name, n=8
6
+ elements(method_name, n).average_growth
7
+ end
8
+ def mean method_name, n=8
9
+ elements(method_name, n).mean
10
+ end
11
+ def elements method_name, n=8
12
+ as_unchained_array[0..(n-1)].map{|s| s.method(method_name).call}
13
+ end
14
+ end
15
+
16
+
17
+ class Object
18
+ include ChainAnalysis
19
+ attr_accessor :next, :previous
20
+ def nvl v
21
+ v ? v : 0
22
+ end
23
+ def as_number
24
+ return self if self.class != String
25
+ signing = start_with?("(") && end_with?(")") ? -1 : 1
26
+ s = gsub(",", "").gsub("--", "").gsub("(", "").gsub(")", "")
27
+ !s.empty? ? s.to_i * signing : 0
28
+ end
29
+ def as_unchained_array
30
+ return Array[self] if self.next == nil
31
+ a = Array[self] << self.next.as_unchained_array
32
+ a.flatten
33
+ end
34
+ def update_attributes hash
35
+ hash.each { |name, value| instance_variable_set("@#{name}", value) }
36
+ end
37
+ def attributes
38
+ !instance_variables.empty? ?
39
+ (instance_variables_as_hash) :
40
+ (struct_as_hash self)
41
+ end
42
+ def instance_variables_as_hash
43
+ hash = Hash.new
44
+ instance_variables.each{|v|
45
+ hash[hash_key_for(v)] = instance_variable_get(v)
46
+ }
47
+ hash
48
+ end
49
+ def struct_as_hash obj
50
+ hash = Hash.new
51
+ obj.each_pair {|name, value| hash[name] = value}
52
+ hash
53
+ end
54
+ def hash_key_for v
55
+ v.to_s.gsub("@","").to_sym
56
+ end
57
+ end
58
+
59
+
60
+ class Array
61
+ def as_chain
62
+ self.size.times{|i|
63
+ a = self[i+1]
64
+ b = self[i-1]
65
+ (self[i].next = a) if a
66
+ (self[i].previous = b) if (b && i > 0)
67
+ }
68
+ self[0]
69
+ end
70
+ def rank
71
+ Rank.new self
72
+ end
73
+ def total
74
+ Totaler.new self
75
+ end
76
+ def product
77
+ reduce{|k,v| k*v}
78
+ end
79
+ def geometric_mean
80
+ product ** (1/size.to_f)
81
+ end
82
+ def sum
83
+ reduce{|k,v| k+v}
84
+ end
85
+ def mean
86
+ sum / size
87
+ end
88
+ def standard_deviation
89
+ Math.sqrt variance
90
+ end
91
+ def variance
92
+ ((reduce(0){|k,v| k+(v-mean)**2})) / size.to_f
93
+ end
94
+ def stability
95
+ mean / (standard_deviation > 1.0 ? standard_deviation : 1)
96
+ end
97
+ def growth
98
+ result = Array.new
99
+ (size-1).times {|i| result << ((self[i].to_f - self[i+1].to_f)/self[i+1].to_f) * 100 }
100
+ result
101
+ end
102
+ def average_growth
103
+ growth.mean
104
+ end
105
+ end
106
+
107
+
108
+ class Range
109
+ def percent n
110
+ a = last - first
111
+ b = n - first
112
+ ((b / a) * 100).round(2)
113
+ end
114
+ def near_top? n, definition = 25.0
115
+ percent(n).between?((100-definition), 100+definition)
116
+ end
117
+ def near_bottom? n, definition = 25.0
118
+ percent(n).between?(0, definition)
119
+ end
120
+ end
121
+
122
+
123
+ RankedObject = Struct.new(:rank, :object)
124
+ class Rank
125
+ def initialize objects
126
+ @objects = objects
127
+ @all_rankings = Array.new
128
+ end
129
+ def size
130
+ @objects.size
131
+ end
132
+ def higher_is_better criteria
133
+ rank_reverse true, criteria
134
+ end
135
+ def lower_is_better criteria
136
+ rank_reverse false, criteria
137
+ end
138
+ def rank_reverse do_reverse, criteria
139
+ criteria.each{|criterion|
140
+ i = 0
141
+ sorted = @objects.sort_by {|o| eval("o.#{criterion}")}
142
+ sorted = sorted.reverse if do_reverse
143
+ @all_rankings << sorted.collect{|o| RankedObject.new(i+=1, o) }
144
+ }
145
+ self
146
+ end
147
+ def total_for a
148
+ @all_rankings.collect{|rank|
149
+ rank.select{|ranked_item| ranked_item.object == a}[0].rank}.
150
+ inject{|sum, i| sum + i}
151
+ end
152
+ def execute
153
+ @objects.
154
+ collect{|o| RankedObject.new(total_for(o), o)}.
155
+ sort_by{|r| r.rank}.
156
+ collect{|r| r.object}
157
+ end
158
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kuku
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Craig Davidson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-20 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: General helpers.
14
+ email: craig@craigdavidson.co.uk
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - README.rdoc
20
+ - lib/kuku.rb
21
+ homepage: https://github.com/craigmdavidson/kuku
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 2.0.5
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: Kuku.
45
+ test_files: []