mh_extensions 0.1.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/CHANGELOG.rdoc +2 -0
- data/Gemfile +2 -0
- data/MIT-LICENSE +20 -0
- data/Manifest +19 -0
- data/README.md +26 -0
- data/Rakefile +12 -0
- data/init.rb +2 -0
- data/lib/acts_as_tree.rb +72 -0
- data/lib/array.rb +23 -0
- data/lib/browser_detector.rb +89 -0
- data/lib/date.rb +10 -0
- data/lib/hash.rb +20 -0
- data/lib/mh_extensions.rb +11 -0
- data/lib/rand.rb +412 -0
- data/lib/range.rb +8 -0
- data/lib/string.rb +90 -0
- data/lib/string_ext.rb +57 -0
- data/lib/txt_file_handler.rb +109 -0
- data/mh_extensions.gemspec +31 -0
- data.tar.gz.sig +0 -0
- metadata +112 -0
- metadata.gz.sig +2 -0
data/CHANGELOG.rdoc
ADDED
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 Maciej Mensfeld
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Manifest
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
CHANGELOG.rdoc
|
2
|
+
Gemfile
|
3
|
+
MIT-LICENSE
|
4
|
+
Manifest
|
5
|
+
README.md
|
6
|
+
Rakefile
|
7
|
+
init.rb
|
8
|
+
lib/acts_as_tree.rb
|
9
|
+
lib/array.rb
|
10
|
+
lib/browser_detector.rb
|
11
|
+
lib/date.rb
|
12
|
+
lib/hash.rb
|
13
|
+
lib/mh_extensions.rb
|
14
|
+
lib/rand.rb
|
15
|
+
lib/range.rb
|
16
|
+
lib/string.rb
|
17
|
+
lib/string_ext.rb
|
18
|
+
lib/txt_file_handler.rb
|
19
|
+
mh_extensions.gemspec
|
data/README.md
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# MH Extensions (Must Have Extensions)
|
2
|
+
|
3
|
+
## Install
|
4
|
+
|
5
|
+
gem install mh_extensions
|
6
|
+
|
7
|
+
and in your Gemfile:
|
8
|
+
|
9
|
+
gem 'mh_extensions'
|
10
|
+
|
11
|
+
## About
|
12
|
+
|
13
|
+
Package of usefull ruby basic classes extensions and some other usefull libs. For more details view any of files located in `lib/`
|
14
|
+
|
15
|
+
## Note on Patches/Pull Requests
|
16
|
+
|
17
|
+
* Fork the project.
|
18
|
+
* Make your feature addition or bug fix.
|
19
|
+
* Add tests for it. This is important so I don't break it in a future version unintentionally.
|
20
|
+
* Commit, do not mess with Rakefile, version, or history.
|
21
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
22
|
+
* Send me a pull request. Bonus points for topic branches.
|
23
|
+
|
24
|
+
## Copyright
|
25
|
+
|
26
|
+
Copyright (c) 2011 Maciej Mensfeld. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('mh_extensions', '0.1.0') do |p|
|
6
|
+
p.description = "Package of usefull ruby basic classes (and not only) extensions"
|
7
|
+
p.url = "https://github.com/mensfeld/mh_extensions"
|
8
|
+
p.author = "Maciej Mensfeld"
|
9
|
+
p.email = "maciej@mensfeld.pl"
|
10
|
+
p.ignore_pattern = ["tmp/*", "script/*"]
|
11
|
+
end
|
12
|
+
|
data/init.rb
ADDED
data/lib/acts_as_tree.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
# Rozszerzenie do activerecord::base i do acts_as_tree ktore umozliwia
|
2
|
+
# korzystnaie z paru dodatkowych metod
|
3
|
+
|
4
|
+
# Wymaga do działania bibliotekli rand.rb
|
5
|
+
# http://raa.ruby-lang.org/project/rand/
|
6
|
+
|
7
|
+
class ActiveRecord::Base
|
8
|
+
def has_children?
|
9
|
+
!self.children.size.zero?
|
10
|
+
end
|
11
|
+
|
12
|
+
def has_siblings?
|
13
|
+
!self.siblings.size.zero?
|
14
|
+
end
|
15
|
+
|
16
|
+
# Return the tree depth
|
17
|
+
def depth
|
18
|
+
return 0 unless has_children?
|
19
|
+
children.inject(0) {|dep,c| dep > c.depth ? dep : c.depth} + 1
|
20
|
+
end
|
21
|
+
|
22
|
+
# Return the tree width
|
23
|
+
def width
|
24
|
+
return 1 unless has_children?
|
25
|
+
children.inject(0) {|sum,c| sum + c.width}
|
26
|
+
end
|
27
|
+
|
28
|
+
# Ile węzłów mamy do roota z miejsca gdzie jesteśmy
|
29
|
+
def nodes_to_root
|
30
|
+
stop = false
|
31
|
+
levels = 0
|
32
|
+
parent = self.parent_id
|
33
|
+
while !stop
|
34
|
+
el = parent ? self.class.find(parent) : nil
|
35
|
+
if el
|
36
|
+
parent = el.parent_id
|
37
|
+
levels += 1
|
38
|
+
else
|
39
|
+
stop = true
|
40
|
+
end
|
41
|
+
end
|
42
|
+
levels
|
43
|
+
end
|
44
|
+
|
45
|
+
# Sprawdza czy nasz rodzic w ogole istnieje
|
46
|
+
def valid_parent?
|
47
|
+
self.class.exists?(self.parent_id.to_i)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Znajduje korzeń i zwraca go
|
51
|
+
def root
|
52
|
+
el = self
|
53
|
+
nodes_to_root.times {
|
54
|
+
el = self.parent
|
55
|
+
}
|
56
|
+
el
|
57
|
+
end
|
58
|
+
|
59
|
+
def leaf(random = false)
|
60
|
+
unless self.has_children?
|
61
|
+
return self
|
62
|
+
end
|
63
|
+
|
64
|
+
children = random ? self.children.shuffle : self.children
|
65
|
+
|
66
|
+
children.each { |child|
|
67
|
+
return child.leaf(random)
|
68
|
+
}
|
69
|
+
nil
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
data/lib/array.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# Rozszerzenie klasy Array umożliwiające korzystanie z paginacji za pomocą
|
2
|
+
# pluginu Kaminaro
|
3
|
+
class Array
|
4
|
+
def paginable(page, per_page, total_elements_amount)
|
5
|
+
@paginate_page = page
|
6
|
+
@paginate_per_page = per_page
|
7
|
+
@paginate_total_elements_amount = total_elements_amount
|
8
|
+
self.instance_eval <<-EVAL
|
9
|
+
def current_page
|
10
|
+
@paginate_page.to_i
|
11
|
+
end
|
12
|
+
|
13
|
+
def num_pages
|
14
|
+
(@paginate_total_elements_amount/@paginate_per_page).floor.to_i
|
15
|
+
end
|
16
|
+
|
17
|
+
def limit_value
|
18
|
+
@paginate_per_page.to_i
|
19
|
+
end
|
20
|
+
|
21
|
+
EVAL
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# Lib used to determine browser version in Rails app
|
2
|
+
|
3
|
+
class BrowserDetector
|
4
|
+
def initialize(request)
|
5
|
+
@browser_data = request
|
6
|
+
@user_agent = @browser_data.env['HTTP_USER_AGENT'] ?
|
7
|
+
@browser_data.env['HTTP_USER_AGENT'].downcase : ''
|
8
|
+
end
|
9
|
+
|
10
|
+
def name
|
11
|
+
agent = @user_agent
|
12
|
+
if agent =~ /msie/i; return :ie
|
13
|
+
elsif agent =~ /konqueror/i; return :konqueror
|
14
|
+
elsif agent =~ /chrome/i; return :chrome
|
15
|
+
elsif agent =~ /gecko/i; return :mozilla
|
16
|
+
elsif agent =~ /opera/i; return :opera
|
17
|
+
elsif agent =~ /applewebkit/i; return :safari
|
18
|
+
else; return :else
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def version
|
23
|
+
agent = @user_agent
|
24
|
+
begin
|
25
|
+
|
26
|
+
if agent =~ /msie/i
|
27
|
+
agent.split(';').second.split(' ').second
|
28
|
+
elsif agent =~ /konqueror/i
|
29
|
+
agent.split('konqueror/').second.split(' ').first
|
30
|
+
elsif agent =~ /chrome/i
|
31
|
+
agent.split('chrome/').second.split(' ').first
|
32
|
+
elsif agent =~ /gecko/i
|
33
|
+
agent.split('firefox/').second.split(' ').first
|
34
|
+
elsif agent =~ /opera/i
|
35
|
+
agent.split('opera/').second.split(' ').first
|
36
|
+
elsif agent =~ /applewebkit/i
|
37
|
+
agent.split('safari/').second.split(' ').first
|
38
|
+
else
|
39
|
+
"Unknown"
|
40
|
+
end
|
41
|
+
rescue
|
42
|
+
return "Unknown"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def main_version
|
47
|
+
agent = @user_agent
|
48
|
+
|
49
|
+
begin
|
50
|
+
if agent =~ /msie/i
|
51
|
+
agent.split(';').second.split(' ').second.split('.').first.to_i
|
52
|
+
elsif agent =~ /konqueror/i
|
53
|
+
agent.split('konqueror/').second.split(' ').first.split('.').first.to_i
|
54
|
+
elsif agent =~ /chrome/i
|
55
|
+
agent.split('chrome/').second.split(' ').first.split('.').first.to_i
|
56
|
+
elsif agent =~ /gecko/i
|
57
|
+
agent.split('firefox/').second.split(' ').first.split('.').first.to_i
|
58
|
+
elsif agent =~ /opera/i
|
59
|
+
agent.split('opera/').second.split(' ').first.split('.').first.to_i
|
60
|
+
elsif agent =~ /applewebkit/i
|
61
|
+
agent.split('safari/').second.split(' ').first.split('.').first.to_i
|
62
|
+
else
|
63
|
+
"Unknown"
|
64
|
+
end
|
65
|
+
rescue
|
66
|
+
return "Unknown"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def is_ie6
|
71
|
+
return true if self.name == :ie && self.main_version == 6
|
72
|
+
return false
|
73
|
+
end
|
74
|
+
|
75
|
+
def is_ie7
|
76
|
+
return true if self.name == :ie && self.main_version == 7
|
77
|
+
return false
|
78
|
+
end
|
79
|
+
|
80
|
+
def is_ie8
|
81
|
+
return true if self.name == :ie && self.main_version >= 8
|
82
|
+
return false
|
83
|
+
end
|
84
|
+
|
85
|
+
def is_old_ie
|
86
|
+
true if is_ie6 || is_ie7
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
data/lib/date.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# To change this template, choose Tools | Templates
|
2
|
+
# and open the template in the editor.
|
3
|
+
|
4
|
+
class Date
|
5
|
+
def self.from_scratches(s, name, model = :range)
|
6
|
+
return nil if s.nil?
|
7
|
+
return nil if s[model].nil?
|
8
|
+
self.civil(s[model][:"#{name}(1i)"].to_i,s[model][:"#{name}(2i)"].to_i,s[model][:"#{name}(3i)"].to_i)
|
9
|
+
end
|
10
|
+
end
|
data/lib/hash.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
class Hash
|
2
|
+
# Zamienia podany hash na zestaw parametrów do linka ?menu=123&cos=12
|
3
|
+
def to_url_params
|
4
|
+
elements = []
|
5
|
+
keys.size.times do |i|
|
6
|
+
elements << "#{CGI::escape(keys[i])}=#{CGI::escape(values[i])}"
|
7
|
+
end
|
8
|
+
elements.join('&')
|
9
|
+
end
|
10
|
+
|
11
|
+
# Zamienia parametry urla na hash ?menu=123&cos=12 => {:menu => 123, :cos => 12}
|
12
|
+
def self.from_url_params(url_params)
|
13
|
+
result = {}.with_indifferent_access
|
14
|
+
url_params.split('&').each do |element|
|
15
|
+
element = element.split('=')
|
16
|
+
result[element[0]] = element[1]
|
17
|
+
end
|
18
|
+
result
|
19
|
+
end
|
20
|
+
end
|
data/lib/rand.rb
ADDED
@@ -0,0 +1,412 @@
|
|
1
|
+
#
|
2
|
+
# = rand.rb -- library for picking random elements and shuffling
|
3
|
+
#
|
4
|
+
# Copyright (C) 2004 Ilmari Heikkinen <mailto:kig@misfiring.net>
|
5
|
+
#
|
6
|
+
# Documentation:: Christian Neukirchen <mailto:chneukirchen@gmail.com>
|
7
|
+
#
|
8
|
+
|
9
|
+
|
10
|
+
module Enumerable
|
11
|
+
# Choose and return a random element of the Enumerable.
|
12
|
+
# [1, 2, 3, 4].pick #=> 2 (or 1, 3, 4)
|
13
|
+
def pick
|
14
|
+
entries.pick
|
15
|
+
end
|
16
|
+
|
17
|
+
# Return an array of the elements in random order.
|
18
|
+
# [1, 2, 3, 4].shuffle #=> [3, 4, 1, 2]
|
19
|
+
def shuffle
|
20
|
+
entries.shuffle
|
21
|
+
end
|
22
|
+
|
23
|
+
# Calls _block_ once for each element in _self_ in random order,
|
24
|
+
# passing that element as a parameter.
|
25
|
+
def each_random(&block)
|
26
|
+
shuffle.each(&block)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Invokes _block_ once for each element of _self_ in random order.
|
30
|
+
# Creates a new array containing the values returned by the block.
|
31
|
+
def map_random(&block)
|
32
|
+
shuffle.map(&block)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
class Array
|
38
|
+
# Choose and return a random element of _self_.
|
39
|
+
# [1, 2, 3, 4].pick #=> 2 (or 1, 3, 4)
|
40
|
+
def pick
|
41
|
+
self[pick_index]
|
42
|
+
end
|
43
|
+
|
44
|
+
# Deletes a random element of _self_, returning that element.
|
45
|
+
# a = [1, 2, 3, 4]
|
46
|
+
# a.pick #=> 2
|
47
|
+
# a #=> [1, 3, 4]
|
48
|
+
def pick!
|
49
|
+
i = pick_index
|
50
|
+
rv = self[i]
|
51
|
+
delete_at(i)
|
52
|
+
rv
|
53
|
+
end
|
54
|
+
|
55
|
+
# Return the index of an random element of _self_.
|
56
|
+
# ["foo", "bar", "baz"].pick_index #=> 1 (or 0, or 2)
|
57
|
+
def pick_index
|
58
|
+
rand(size)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Destructive pick_index. Delete a random element of _self_ and
|
62
|
+
# return its index.
|
63
|
+
# a = [11, 22, 33, 44]
|
64
|
+
# a.pick_index! #=> 2
|
65
|
+
# a #=> [11, 22, 44]
|
66
|
+
def pick_index!
|
67
|
+
i = pick_index
|
68
|
+
delete_at i
|
69
|
+
i
|
70
|
+
end
|
71
|
+
|
72
|
+
# Return an array of the elements in random order.
|
73
|
+
# [11, 22, 33, 44].shuffle #=> [33, 11, 44, 22]
|
74
|
+
def shuffle
|
75
|
+
sort_by{rand}
|
76
|
+
end
|
77
|
+
|
78
|
+
# Destructive shuffle. Arrange the elements of _self_ in new order.
|
79
|
+
# a = [11, 22, 33, 44]
|
80
|
+
# a.shuffle!
|
81
|
+
# a #=> [33, 11, 44, 22]
|
82
|
+
def shuffle!
|
83
|
+
sort!{rand <=> 0.5}
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
class Hash
|
89
|
+
# Choose and return a random key-value pair of _self_.
|
90
|
+
# {:one => 1, :two => 2, :three => 3}.pick #=> [:one, 1]
|
91
|
+
def pick
|
92
|
+
k = keys.pick
|
93
|
+
[k, self[k]]
|
94
|
+
end
|
95
|
+
|
96
|
+
# Deletes a random key-value pair of _self_, returning that pair.
|
97
|
+
# a = {:one => 1, :two => 2, :three => 3}
|
98
|
+
# a.pick #=> [:two, 2]
|
99
|
+
# a #=> {:one => 1, :three => 3}
|
100
|
+
def pick!
|
101
|
+
rv = pick
|
102
|
+
delete rv.first
|
103
|
+
rv
|
104
|
+
end
|
105
|
+
|
106
|
+
# Return a random key of _self_.
|
107
|
+
# {:one => 1, :two => 2, :three => 3}.pick_key #=> :three
|
108
|
+
def pick_key
|
109
|
+
keys.pick
|
110
|
+
end
|
111
|
+
|
112
|
+
# Return a random value of _self_.
|
113
|
+
# {:one => 1, :two => 2, :three => 3}.pick_value #=> 3
|
114
|
+
def pick_value
|
115
|
+
values.pick
|
116
|
+
end
|
117
|
+
|
118
|
+
# Delete a random key-value pair of _self_ and return the key.
|
119
|
+
# a = {:one => 1, :two => 2, :three => 3}
|
120
|
+
# a.pick_key! #=> :two
|
121
|
+
# a #=> {:one => 1, :three => 3}
|
122
|
+
def pick_key!
|
123
|
+
pick!.first
|
124
|
+
end
|
125
|
+
|
126
|
+
# Delete a random key-value pair of _self_ and return the value.
|
127
|
+
# a = {:one => 1, :two => 2, :three => 3}
|
128
|
+
# a.pick_value! #=> 2
|
129
|
+
# a #=> {:one => 1, :three => 3}
|
130
|
+
def pick_value!
|
131
|
+
pick!.last
|
132
|
+
end
|
133
|
+
|
134
|
+
# Return the key-value pairs of _self_ with _keys_ and _values_
|
135
|
+
# shuffled independedly.
|
136
|
+
# {:one => 1, :two => 2, :three => 3}.shuffle_hash_pairs
|
137
|
+
# #=> [[:one, 3], [:two, 1], [:three, 2]]
|
138
|
+
def shuffle_hash_pairs
|
139
|
+
keys.shuffle.zip(values.shuffle)
|
140
|
+
end
|
141
|
+
|
142
|
+
# Return a copy of _self_ with _values_ arranged in random order.
|
143
|
+
# {:one => 1, :two => 2, :three => 3}.shuffle_hash
|
144
|
+
# #=> {:two=>2, :three=>1, :one=>3}
|
145
|
+
def shuffle_hash
|
146
|
+
shuffled = {}
|
147
|
+
shuffle_hash_pairs.each{|k, v|
|
148
|
+
shuffled[k] = v
|
149
|
+
}
|
150
|
+
shuffled
|
151
|
+
end
|
152
|
+
|
153
|
+
# Destructive shuffle_hash. Arrange the values of _self_ in
|
154
|
+
# new, random order.
|
155
|
+
# h = {:one => 1, :two => 2, :three => 3}
|
156
|
+
# h.shuffle_hash!
|
157
|
+
# h #=> {:two=>2, :three=>1, :one=>3}
|
158
|
+
def shuffle_hash!
|
159
|
+
shuffle_hash_pairs.each{|k, v|
|
160
|
+
self[k] = v
|
161
|
+
}
|
162
|
+
self
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
|
167
|
+
class String
|
168
|
+
# Return the string with characters arranged in random order.
|
169
|
+
# "Ruby rules".shuffle_chars #=> "e lybRsuur"
|
170
|
+
def shuffle_chars
|
171
|
+
split(//).shuffle.join('')
|
172
|
+
end
|
173
|
+
|
174
|
+
# Destructive shuffle_chars. Arrange the characters of the string
|
175
|
+
# in new, random order.
|
176
|
+
# s = "Ruby rules".shuffle_chars
|
177
|
+
# s.shuffle_chars!
|
178
|
+
# s #=> "e lybRsuur"
|
179
|
+
def shuffle_chars!
|
180
|
+
self[0,size] = shuffle_chars
|
181
|
+
end
|
182
|
+
|
183
|
+
# Return a random byte of _self_.
|
184
|
+
# "Ruby rules".pick_byte #=> 121
|
185
|
+
def pick_byte
|
186
|
+
self[pick_index]
|
187
|
+
end
|
188
|
+
|
189
|
+
# Return a single-character string of a random character in _self_.
|
190
|
+
# "Ruby rules".pick_char #=> "y"
|
191
|
+
def pick_char
|
192
|
+
pick_byte.chr
|
193
|
+
end
|
194
|
+
|
195
|
+
# Destructive pick_char. Delete a random character of the string
|
196
|
+
# and return it as a single-character string.
|
197
|
+
# s = "Ruby rules"
|
198
|
+
# s.pick_char! #=> "y"
|
199
|
+
# s #=> "Rub rules"
|
200
|
+
def pick_char!
|
201
|
+
i = pick_index
|
202
|
+
rv = self[i,1]
|
203
|
+
self[i,1] = ""
|
204
|
+
rv
|
205
|
+
end
|
206
|
+
|
207
|
+
# Destructive pick_byte. Delete a random byte of _self_ and return it.
|
208
|
+
# s = "Ruby rules"
|
209
|
+
# s.pick_byte! #=> 121
|
210
|
+
# s #=> "Rub rules"
|
211
|
+
def pick_byte!
|
212
|
+
pick_char![0]
|
213
|
+
end
|
214
|
+
|
215
|
+
# Return a random byte index of _self_.
|
216
|
+
# "Ruby rules".pick_index #=> 3
|
217
|
+
def pick_index
|
218
|
+
rand(size)
|
219
|
+
end
|
220
|
+
|
221
|
+
# Destructive pick_index. Delete a random byte of _self_ and
|
222
|
+
# return it's index.
|
223
|
+
# s = "Ruby rules"
|
224
|
+
# s.pick_index #=> 3
|
225
|
+
# s #=> "Rub rules"
|
226
|
+
def pick_index!
|
227
|
+
i = pick_index
|
228
|
+
self[i,1] = ""
|
229
|
+
i
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
|
234
|
+
if __FILE__ == $0
|
235
|
+
|
236
|
+
require 'test/unit'
|
237
|
+
|
238
|
+
module RandTestHelpers # :nodoc:
|
239
|
+
def picker(enum, enum_check, method, n=50)
|
240
|
+
(1..n).all?{ enum_check.include? enum.send(method) }
|
241
|
+
end
|
242
|
+
|
243
|
+
def try_shuffling(enum, enum_c, method)
|
244
|
+
rv = nil
|
245
|
+
10.times{
|
246
|
+
rv = enum.send method
|
247
|
+
break if rv != enum_c
|
248
|
+
}
|
249
|
+
rv
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
|
254
|
+
class RandArrayTest < Test::Unit::TestCase # :nodoc:
|
255
|
+
include RandTestHelpers
|
256
|
+
|
257
|
+
def ar
|
258
|
+
(0..99).to_a
|
259
|
+
end
|
260
|
+
|
261
|
+
def test_pick
|
262
|
+
a = ar
|
263
|
+
results = (0...a.size).map{ a.pick }
|
264
|
+
assert true, results.all? {|r| a.include? r }
|
265
|
+
end
|
266
|
+
|
267
|
+
def test_pick!
|
268
|
+
a = ar
|
269
|
+
results = (0...a.size).map{ a.pick! }
|
270
|
+
assert true, results.sort == (0..99).to_a and a.empty?
|
271
|
+
end
|
272
|
+
|
273
|
+
def test_pick_index
|
274
|
+
a = ar
|
275
|
+
results = (0...a.size).map{ a.pick_index }
|
276
|
+
assert true, results.all? {|r| r.between?(0, a.size-1) }
|
277
|
+
end
|
278
|
+
|
279
|
+
def test_pick_index!
|
280
|
+
a = ar
|
281
|
+
# side-effect-relying block; a.size = a.size-1 after pick_index!,
|
282
|
+
# so the picked index max value is the new a.size
|
283
|
+
assert true, (0...a.size).all?{ a.pick_index!.between?(0, a.size) } and a.empty?
|
284
|
+
end
|
285
|
+
|
286
|
+
def test_shuffle
|
287
|
+
a = ar
|
288
|
+
shuffled = try_shuffling(a, a, :shuffle)
|
289
|
+
assert true, shuffled.sort == a and shuffled != a
|
290
|
+
end
|
291
|
+
|
292
|
+
def test_shuffle!
|
293
|
+
a = ar
|
294
|
+
try_shuffling(a, ar, :shuffle!)
|
295
|
+
assert true, a != ar and a.sort == ar
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
|
300
|
+
class RandHashTest < Test::Unit::TestCase # :nodoc:
|
301
|
+
include RandTestHelpers
|
302
|
+
|
303
|
+
def ha
|
304
|
+
Hash[*(1..100).to_a]
|
305
|
+
end
|
306
|
+
|
307
|
+
def test_pick
|
308
|
+
assert true, picker(ha, ha.entries, :pick)
|
309
|
+
end
|
310
|
+
|
311
|
+
def test_pick!
|
312
|
+
h = ha
|
313
|
+
assert true, picker(h, ha.entries, :pick!) and h.empty?
|
314
|
+
end
|
315
|
+
|
316
|
+
def test_pick_key
|
317
|
+
assert true, picker(ha, ha.keys, :pick_key)
|
318
|
+
end
|
319
|
+
|
320
|
+
def test_pick_key!
|
321
|
+
h = ha
|
322
|
+
assert true, picker(h, ha.keys, :pick_key!) and h.empty?
|
323
|
+
end
|
324
|
+
|
325
|
+
def test_pick_value
|
326
|
+
assert true, picker(ha, ha.values, :pick_value)
|
327
|
+
end
|
328
|
+
|
329
|
+
def test_pick_value!
|
330
|
+
h = ha
|
331
|
+
assert true, picker(h, ha.values, :pick_value!) and h.empty?
|
332
|
+
end
|
333
|
+
|
334
|
+
def test_shuffle_hash
|
335
|
+
h = ha
|
336
|
+
hs = try_shuffling(ha, h, :shuffle_hash)
|
337
|
+
assert true, hs != h and (hs.keys + hs.values).sort == (h.keys + h.values).sort
|
338
|
+
end
|
339
|
+
|
340
|
+
def test_shuffle_hash!
|
341
|
+
h = ha
|
342
|
+
hs = ha
|
343
|
+
try_shuffling(hs, h, :shuffle_hash!)
|
344
|
+
assert true, hs != h and (hs.keys + hs.values).sort == (h.keys + h.values).sort
|
345
|
+
end
|
346
|
+
|
347
|
+
def test_shuffle
|
348
|
+
h = ha
|
349
|
+
hs = try_shuffling(ha, h, :shuffle)
|
350
|
+
assert true, hs != h and hs.entries.sort == h.entries.sort
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
|
355
|
+
class RandStringTest < Test::Unit::TestCase # :nodoc:
|
356
|
+
include RandTestHelpers
|
357
|
+
|
358
|
+
def self.pick_tests(endings)
|
359
|
+
endings.each{|ending, compare_str_f|
|
360
|
+
define_method("test_pick#{ending}"){
|
361
|
+
s = str
|
362
|
+
assert true, picker(s, instance_eval(&compare_str_f), "pick#{ending}", s.size)
|
363
|
+
}
|
364
|
+
}
|
365
|
+
end
|
366
|
+
|
367
|
+
def self.pick_tests!(endings)
|
368
|
+
endings.each{|ending, compare_str_f|
|
369
|
+
define_method("test_pick#{ending}!"){
|
370
|
+
s = str
|
371
|
+
assert true, picker(s, instance_eval(&compare_str_f), "pick#{ending}!", s.size) and s.empty?
|
372
|
+
}
|
373
|
+
}
|
374
|
+
end
|
375
|
+
|
376
|
+
def str
|
377
|
+
(("a".."z").to_s + "\n") * 10
|
378
|
+
end
|
379
|
+
|
380
|
+
def test_shuffle
|
381
|
+
s = str
|
382
|
+
ss = try_shuffling(s, s.to_a, :shuffle)
|
383
|
+
assert true, ss != s.to_a and ss.sort == s.to_a.sort
|
384
|
+
end
|
385
|
+
|
386
|
+
def test_shuffle_chars
|
387
|
+
s = str
|
388
|
+
ss = try_shuffling(s, s.split(//), :shuffle_chars)
|
389
|
+
assert true, ss != s and ss.split(//).sort == s.split(//).sort
|
390
|
+
end
|
391
|
+
|
392
|
+
def test_shuffle_chars!
|
393
|
+
s = str
|
394
|
+
ss = str
|
395
|
+
try_shuffling(ss, s.split(//), :shuffle_chars!)
|
396
|
+
assert true, ss != s and ss.split(//).sort == s.split(//).sort
|
397
|
+
end
|
398
|
+
|
399
|
+
pick_tests({ "" => lambda{str.to_a},
|
400
|
+
:_char => lambda{str.split(//)},
|
401
|
+
:_byte => lambda{str.split(//).map{|c| c[0]}},
|
402
|
+
:_index => lambda{(0...str.size).to_a}
|
403
|
+
})
|
404
|
+
|
405
|
+
pick_tests!({ :_char => lambda{str.split(//)},
|
406
|
+
:_byte => lambda{str.split(//).map{|c| c[0]}},
|
407
|
+
:_index => lambda{(0...str.size).to_a}
|
408
|
+
})
|
409
|
+
end
|
410
|
+
|
411
|
+
|
412
|
+
end #if
|
data/lib/range.rb
ADDED
data/lib/string.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# Dodatkowe metody klasy string
|
3
|
+
|
4
|
+
class String
|
5
|
+
|
6
|
+
# Czy cenzurowano a jesli tak to ile niedobrych słów było
|
7
|
+
@censored_words = false
|
8
|
+
|
9
|
+
# Zwraca strina bez polskich literek, z małej litery, z usuniętymi innymi
|
10
|
+
# znakami oraz z zamienioną spacją na pauze (-)
|
11
|
+
def to_url
|
12
|
+
temp = self.downcase
|
13
|
+
temp
|
14
|
+
temp.gsub!(/[âäàãáäå�?ăąǎǟǡǻ�?ȃȧẵặ]/,'a')
|
15
|
+
temp.gsub!(/[ëêéèẽēĕėẻȅȇẹȩęḙḛ�?ếễểḕḗệ�?]/,'e')
|
16
|
+
temp.gsub!(/[�?iìíîĩīĭïỉ�?ịįȉȋḭɨḯ]/,'i')
|
17
|
+
temp.gsub!(/[òóôõ�?�?ȯö�?őǒ�?�?ơǫ�?ɵøồốỗổȱȫȭ�?�?ṑṓ�?ớỡởợǭộǿ]/,'o')
|
18
|
+
temp.gsub!(/[ùúûũūŭüủůűǔȕȗưụṳųṷṵṹṻǖǜǘǖǚừứữửự]/,'u')
|
19
|
+
temp.gsub!(/[ỳýŷỹȳ�?ÿỷẙƴỵ]/,'y')
|
20
|
+
temp.gsub!(/[ñǹń]/,'n')
|
21
|
+
temp.gsub!(/[çć]/,'c')
|
22
|
+
temp.gsub!(/[ß]/,'ss')
|
23
|
+
temp.gsub!(/[œ]/,'oe')
|
24
|
+
temp.gsub!(/[ij]/,'ij')
|
25
|
+
temp.gsub!(/[�?ł]/,'l')
|
26
|
+
temp.gsub!(/[ś]/,'s')
|
27
|
+
temp.gsub!(/[źż]/,'z')
|
28
|
+
temp.gsub!(/[^a-zA-Z 0-9]/, "")
|
29
|
+
temp.gsub!(/\s/,'-')
|
30
|
+
temp.gsub!(/\-+$/,'')
|
31
|
+
temp.gsub!(/^\-+/,'')
|
32
|
+
temp
|
33
|
+
end
|
34
|
+
|
35
|
+
# to_url tylko wykonane na sobie
|
36
|
+
def to_url!
|
37
|
+
self.replace self.to_url
|
38
|
+
end
|
39
|
+
|
40
|
+
# Zamienia znak nowej linii na <br>'a
|
41
|
+
def nl2br
|
42
|
+
self.gsub("\n\r","<br>").gsub("\r", "").gsub("\n", "<br />")
|
43
|
+
end
|
44
|
+
|
45
|
+
def nl2br!
|
46
|
+
self.replace self.nl2br
|
47
|
+
end
|
48
|
+
|
49
|
+
# Przycina tekst do lenght znakow dodajac end_str na koncu
|
50
|
+
def trim(length = 20, end_str = '...')
|
51
|
+
if self.length > length
|
52
|
+
return "#{self[0, length-end_str.length]}#{end_str}"
|
53
|
+
end
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
# trim tylko wykonane na sobie
|
58
|
+
def trim!(length = 20, end_str = '...')
|
59
|
+
self.replace self.trim(length, end_str)
|
60
|
+
self
|
61
|
+
end
|
62
|
+
|
63
|
+
# Cenzuruje niechciane słowa na podstawie tego co jest w bazie i zwraca
|
64
|
+
def censor(changer = '*')
|
65
|
+
Censor.run(self, changer)
|
66
|
+
end
|
67
|
+
|
68
|
+
# To samo co wyżej tylko operuje na sobie
|
69
|
+
def censor!(changer = '*')
|
70
|
+
@censored_words = Censor.amount(self)
|
71
|
+
self.replace Censor.run(self, changer)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Czy dany string został ocenzurowany
|
75
|
+
def censored?
|
76
|
+
@censored_words
|
77
|
+
end
|
78
|
+
|
79
|
+
# Zamiana CamelCase na underline
|
80
|
+
def underlinize
|
81
|
+
self.split(/(?=[A-Z])/).join('_').downcase
|
82
|
+
end
|
83
|
+
|
84
|
+
# Zamiana CamelCase na underline na sobie
|
85
|
+
def underlinize!
|
86
|
+
self.replace self.underlinize
|
87
|
+
self
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
data/lib/string_ext.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
# Required string extensions
|
4
|
+
|
5
|
+
class String
|
6
|
+
# Removes any "not url friendly" stuff and returns "pure" url
|
7
|
+
def to_url
|
8
|
+
temp = self.downcase
|
9
|
+
temp
|
10
|
+
temp.gsub!(/[âäàãáäå�?ăąǎǟǡǻ�?ȃȧẵặ]/,'a')
|
11
|
+
temp.gsub!(/[ëêéèẽēĕėẻȅȇẹȩęḙḛ�?ếễểḕḗệ�?]/,'e')
|
12
|
+
temp.gsub!(/[�?iìíîĩīĭïỉ�?ịįȉȋḭɨḯ]/,'i')
|
13
|
+
temp.gsub!(/[òóôõ�?�?ȯö�?őǒ�?�?ơǫ�?ɵøồốỗổȱȫȭ�?�?ṑṓ�?ớỡởợǭộǿ]/,'o')
|
14
|
+
temp.gsub!(/[ùúûũūŭüủůűǔȕȗưụṳųṷṵṹṻǖǜǘǖǚừứữửự]/,'u')
|
15
|
+
temp.gsub!(/[ỳýŷỹȳ�?ÿỷẙƴỵ]/,'y')
|
16
|
+
temp.gsub!(/[ñǹń]/,'n')
|
17
|
+
temp.gsub!(/[çć]/,'c')
|
18
|
+
temp.gsub!(/[ß]/,'ss')
|
19
|
+
temp.gsub!(/[œ]/,'oe')
|
20
|
+
temp.gsub!(/[ij]/,'ij')
|
21
|
+
temp.gsub!(/[�?ł]/,'l')
|
22
|
+
temp.gsub!(/[ś]/,'s')
|
23
|
+
temp.gsub!(/[źż]/,'z')
|
24
|
+
temp.gsub!(/[^a-zA-Z 0-9]/, "")
|
25
|
+
temp.gsub!(/\s/,'-')
|
26
|
+
temp.gsub!(/\-+$/,'')
|
27
|
+
temp.gsub!(/^\-+/,'')
|
28
|
+
temp
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_url!
|
32
|
+
self.replace self.to_url
|
33
|
+
end
|
34
|
+
|
35
|
+
# Change new line to html <br/>
|
36
|
+
def nl2br
|
37
|
+
self.gsub("\n\r","<br>").gsub("\r", "").gsub("\n", "<br />")
|
38
|
+
end
|
39
|
+
|
40
|
+
def nl2br!
|
41
|
+
self.replace self.nl2br
|
42
|
+
end
|
43
|
+
|
44
|
+
# Trim string to required length
|
45
|
+
def trim(length = 20, end_str = '...')
|
46
|
+
if self.length > length
|
47
|
+
return "#{self[0, length-end_str.length]}#{end_str}"
|
48
|
+
end
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
def trim!(length = 20, end_str = '...')
|
53
|
+
self.replace self.trim(length, end_str)
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# Lil lib used to read txt files
|
2
|
+
class TxtFileHandler
|
3
|
+
def initialize(fileadr, relative = true)
|
4
|
+
if relative
|
5
|
+
@path = File.join(Rails.root, fileadr)
|
6
|
+
else
|
7
|
+
@path = fileadr
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
def line(nr)
|
13
|
+
return unless ropen
|
14
|
+
line = nil
|
15
|
+
i = 0
|
16
|
+
@file.each_line{ |s|
|
17
|
+
if i == nr
|
18
|
+
line = s
|
19
|
+
close
|
20
|
+
break
|
21
|
+
end
|
22
|
+
i+=1
|
23
|
+
}
|
24
|
+
return line
|
25
|
+
end
|
26
|
+
|
27
|
+
def line_nr
|
28
|
+
return unless ropen
|
29
|
+
i = 0
|
30
|
+
@file.each_line{ |s|
|
31
|
+
i+=1
|
32
|
+
}
|
33
|
+
close
|
34
|
+
i
|
35
|
+
end
|
36
|
+
|
37
|
+
def lines(start, finish)
|
38
|
+
return unless ropen
|
39
|
+
lines = []
|
40
|
+
|
41
|
+
if start > finish
|
42
|
+
temp = start
|
43
|
+
start = finish
|
44
|
+
finish = temp
|
45
|
+
invert = true
|
46
|
+
end
|
47
|
+
|
48
|
+
i = 0
|
49
|
+
j = 0
|
50
|
+
@file.each_line{ |s|
|
51
|
+
if (i >= start && i <= finish)
|
52
|
+
lines[j] = s.gsub("", "Ruby")
|
53
|
+
j+=1
|
54
|
+
end
|
55
|
+
i+=1
|
56
|
+
}
|
57
|
+
if invert
|
58
|
+
lines = lines.reverse
|
59
|
+
end
|
60
|
+
close
|
61
|
+
lines
|
62
|
+
end
|
63
|
+
|
64
|
+
def file
|
65
|
+
@file
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.exist?(fileadr, relative = true)
|
69
|
+
if relative
|
70
|
+
path = File.join(Rails.root, fileadr)
|
71
|
+
else
|
72
|
+
path = fileadr
|
73
|
+
end
|
74
|
+
FileTest.exist?(path)
|
75
|
+
end
|
76
|
+
|
77
|
+
def clear!
|
78
|
+
close
|
79
|
+
return unless wopen
|
80
|
+
@file << ""
|
81
|
+
close
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def ropen
|
87
|
+
if TxtFileHandler::exist?(@path, false)
|
88
|
+
@file = File.open(@path, "r")
|
89
|
+
return true
|
90
|
+
end
|
91
|
+
return false
|
92
|
+
end
|
93
|
+
|
94
|
+
def wopen
|
95
|
+
if TxtFileHandler::exist?(@path, false)
|
96
|
+
@file = File.open(@path, "w")
|
97
|
+
return true
|
98
|
+
end
|
99
|
+
return false
|
100
|
+
end
|
101
|
+
|
102
|
+
def close
|
103
|
+
if @file
|
104
|
+
@file.close
|
105
|
+
@file = nil
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{mh_extensions}
|
5
|
+
s.version = "0.1.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Maciej Mensfeld"]
|
9
|
+
s.cert_chain = ["/home/mencio/.cert_keys/gem-public_cert.pem"]
|
10
|
+
s.date = %q{2011-04-10}
|
11
|
+
s.description = %q{Package of usefull ruby basic classes (and not only) extensions}
|
12
|
+
s.email = %q{maciej@mensfeld.pl}
|
13
|
+
s.extra_rdoc_files = ["CHANGELOG.rdoc", "README.md", "lib/acts_as_tree.rb", "lib/array.rb", "lib/browser_detector.rb", "lib/date.rb", "lib/hash.rb", "lib/mh_extensions.rb", "lib/rand.rb", "lib/range.rb", "lib/string.rb", "lib/string_ext.rb", "lib/txt_file_handler.rb"]
|
14
|
+
s.files = ["CHANGELOG.rdoc", "Gemfile", "MIT-LICENSE", "Manifest", "README.md", "Rakefile", "init.rb", "lib/acts_as_tree.rb", "lib/array.rb", "lib/browser_detector.rb", "lib/date.rb", "lib/hash.rb", "lib/mh_extensions.rb", "lib/rand.rb", "lib/range.rb", "lib/string.rb", "lib/string_ext.rb", "lib/txt_file_handler.rb", "mh_extensions.gemspec"]
|
15
|
+
s.homepage = %q{https://github.com/mensfeld/mh_extensions}
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Mh_extensions", "--main", "README.md"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{mh_extensions}
|
19
|
+
s.rubygems_version = %q{1.5.2}
|
20
|
+
s.signing_key = %q{/home/mencio/.cert_keys/gem-private_key.pem}
|
21
|
+
s.summary = %q{Package of usefull ruby basic classes (and not only) extensions}
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
s.specification_version = 3
|
25
|
+
|
26
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
27
|
+
else
|
28
|
+
end
|
29
|
+
else
|
30
|
+
end
|
31
|
+
end
|
data.tar.gz.sig
ADDED
Binary file
|
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mh_extensions
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.1.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Maciej Mensfeld
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain:
|
12
|
+
- |
|
13
|
+
-----BEGIN CERTIFICATE-----
|
14
|
+
MIIDMjCCAhqgAwIBAgIBADANBgkqhkiG9w0BAQUFADA/MQ8wDQYDVQQDDAZtYWNp
|
15
|
+
ZWoxGDAWBgoJkiaJk/IsZAEZFghtZW5zZmVsZDESMBAGCgmSJomT8ixkARkWAnBs
|
16
|
+
MB4XDTExMDQwOTA5NDcyMloXDTEyMDQwODA5NDcyMlowPzEPMA0GA1UEAwwGbWFj
|
17
|
+
aWVqMRgwFgYKCZImiZPyLGQBGRYIbWVuc2ZlbGQxEjAQBgoJkiaJk/IsZAEZFgJw
|
18
|
+
bDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL0+nG3V4/exIeiJ0IN+
|
19
|
+
wVfq8Utcu4Qpo+58EIVMIu3FiK+8w6MBvatZnUrRu12pqWLw9xrUkCiYeRErD+jF
|
20
|
+
AmdggIM/tu9CcjvURXH7VeTzOVA+pnV+eJWMD61o8HljFVcb/nyEYYVKErtr9/O4
|
21
|
+
QrIGv5lnszq1PMj2sBMy2gOP1YnzawncMLmkpp/T5SU4JZ5gAktGMRVz8RxmZzF5
|
22
|
+
6NVqFLbuqSRSU5U//WJvZVJt8dycCGgQzBM4Vi3nkOWyjIF0BANf1TqnlU2u6s8d
|
23
|
+
UK1AoDZfg5feef5e8eqoomHebX1opNGM/SOQhu3LRgax4rJfnl6VS3I2wighohsf
|
24
|
+
AgcCAwEAAaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQUGlrWBqxVieAPk7NEzBDp
|
25
|
+
kM+iAMMwCwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQAJMoyBaJs8boiz
|
26
|
+
lFpbw6MWjk+7ZhqoHpFrWEV4nzb5GzyHZ7GU/pa1fSEQR0SCs+LnTLQbAYNQyUTT
|
27
|
+
O+UsTuA7xzI//v6cSodv3Q9NbfoDlou74xv1NXorWoosQFMpVWrXv+c/1RqU3cq4
|
28
|
+
WUr+rRiveEXG4tXOwkrpX8KH8xVp2vQZcGw3AXPqhzfqDGzpHd6ws3lk+8HoSrSo
|
29
|
+
2L68tDoxraF2Z2toAg9vfFw1+mOeDk1xVIPVcBy3tJxstHfHGHlQuMiRiDQX2b2D
|
30
|
+
YYU8UWVt2841IwB5Dgl4O+atXhe9ZTBO0W32pl4Bq5CP9lhQRT1KL7sxfznJlF7Y
|
31
|
+
BH3YFsdk
|
32
|
+
-----END CERTIFICATE-----
|
33
|
+
|
34
|
+
date: 2011-04-10 00:00:00 +02:00
|
35
|
+
default_executable:
|
36
|
+
dependencies: []
|
37
|
+
|
38
|
+
description: Package of usefull ruby basic classes (and not only) extensions
|
39
|
+
email: maciej@mensfeld.pl
|
40
|
+
executables: []
|
41
|
+
|
42
|
+
extensions: []
|
43
|
+
|
44
|
+
extra_rdoc_files:
|
45
|
+
- CHANGELOG.rdoc
|
46
|
+
- README.md
|
47
|
+
- lib/acts_as_tree.rb
|
48
|
+
- lib/array.rb
|
49
|
+
- lib/browser_detector.rb
|
50
|
+
- lib/date.rb
|
51
|
+
- lib/hash.rb
|
52
|
+
- lib/mh_extensions.rb
|
53
|
+
- lib/rand.rb
|
54
|
+
- lib/range.rb
|
55
|
+
- lib/string.rb
|
56
|
+
- lib/string_ext.rb
|
57
|
+
- lib/txt_file_handler.rb
|
58
|
+
files:
|
59
|
+
- CHANGELOG.rdoc
|
60
|
+
- Gemfile
|
61
|
+
- MIT-LICENSE
|
62
|
+
- Manifest
|
63
|
+
- README.md
|
64
|
+
- Rakefile
|
65
|
+
- init.rb
|
66
|
+
- lib/acts_as_tree.rb
|
67
|
+
- lib/array.rb
|
68
|
+
- lib/browser_detector.rb
|
69
|
+
- lib/date.rb
|
70
|
+
- lib/hash.rb
|
71
|
+
- lib/mh_extensions.rb
|
72
|
+
- lib/rand.rb
|
73
|
+
- lib/range.rb
|
74
|
+
- lib/string.rb
|
75
|
+
- lib/string_ext.rb
|
76
|
+
- lib/txt_file_handler.rb
|
77
|
+
- mh_extensions.gemspec
|
78
|
+
has_rdoc: true
|
79
|
+
homepage: https://github.com/mensfeld/mh_extensions
|
80
|
+
licenses: []
|
81
|
+
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options:
|
84
|
+
- --line-numbers
|
85
|
+
- --inline-source
|
86
|
+
- --title
|
87
|
+
- Mh_extensions
|
88
|
+
- --main
|
89
|
+
- README.md
|
90
|
+
require_paths:
|
91
|
+
- lib
|
92
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: "0"
|
98
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: "1.2"
|
104
|
+
requirements: []
|
105
|
+
|
106
|
+
rubyforge_project: mh_extensions
|
107
|
+
rubygems_version: 1.5.2
|
108
|
+
signing_key:
|
109
|
+
specification_version: 3
|
110
|
+
summary: Package of usefull ruby basic classes (and not only) extensions
|
111
|
+
test_files: []
|
112
|
+
|
metadata.gz.sig
ADDED