rmtools 1.2.14 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,16 @@
1
+ Copyright (c) 2010-2013
2
+ Sergey Baev <tinbka@gmail.com>
3
+
4
+ This work is licensed under the same license as Ruby language.
5
+
6
+ THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
7
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
8
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
9
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
10
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
11
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
12
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
13
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
14
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
15
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
16
+ SUCH DAMAGE.
data/Manifest.txt CHANGED
@@ -1,97 +1,101 @@
1
- ext/extconf.rb
2
- ext/rmtools.h
3
- ext/rmtools.cpp
4
- lib/rmtools.rb
5
- lib/rmtools/db/active_record.rb
6
- lib/rmtools/fs/io.rb
7
- lib/rmtools/fs/file.rb
1
+ License.txt
2
+ README.txt
3
+ lib/rmtools_dev.rb
4
+ lib/rmtools.so
5
+ lib/rmtools/core/module.rb
6
+ lib/rmtools/core/js.rb
7
+ lib/rmtools/core/string_compliance.rb
8
+ lib/rmtools/core/kernel.rb
9
+ lib/rmtools/core/arguments.rb
10
+ lib/rmtools/core/object.rb
11
+ lib/rmtools/core/deprecation.rb
12
+ lib/rmtools/core/aliases.rb
13
+ lib/rmtools/core/proc.rb
14
+ lib/rmtools/core/class.rb
15
+ lib/rmtools/core/numeric.rb
16
+ lib/rmtools/core/boolean.rb
17
+ lib/rmtools/core/regexp.rb
18
+ lib/rmtools/core/threadify.rb
19
+ lib/rmtools/rand/range.rb
20
+ lib/rmtools/rand/string.rb
21
+ lib/rmtools/rand/array.rb
22
+ lib/rmtools/rand/enum.rb
23
+ lib/rmtools/db.rb
24
+ lib/rmtools/install.rb
25
+ lib/rmtools/conversions.rb
26
+ lib/rmtools/functional.rb
27
+ lib/rmtools/require.rb
28
+ lib/rmtools/lang.rb
29
+ lib/rmtools/time.rb
30
+ lib/rmtools/fs.rb
8
31
  lib/rmtools/fs/dir.rb
32
+ lib/rmtools/fs/file.rb
9
33
  lib/rmtools/fs/tools.rb
10
- lib/rmtools/ip/numeric.rb
11
- lib/rmtools/ip/string.rb
12
- lib/rmtools/dev/present.rb
13
- lib/rmtools/dev/blackhole.rb
14
- lib/rmtools/dev/observing.rb
34
+ lib/rmtools/fs/io.rb
15
35
  lib/rmtools/dev/traceback.rb
16
- lib/rmtools/dev/binding.rb
17
36
  lib/rmtools/dev/logging.rb
18
- lib/rmtools/dev/trace_format.rb
19
- lib/rmtools/dev/highlight.rb
37
+ lib/rmtools/dev/binding.rb
20
38
  lib/rmtools/dev/timer.rb
39
+ lib/rmtools/dev/blackhole.rb
21
40
  lib/rmtools/dev/code_reader.rb
22
- lib/rmtools/xml/xpath.rb
41
+ lib/rmtools/dev/trace_format.rb
42
+ lib/rmtools/dev/highlight.rb
43
+ lib/rmtools/dev/present.rb
44
+ lib/rmtools/dev/observing.rb
45
+ lib/rmtools/b.rb
46
+ lib/rmtools/init.rb
47
+ lib/rmtools/text.rb
23
48
  lib/rmtools/xml/string.rb
24
- lib/rmtools/xml/libxml.rb
25
- lib/rmtools/xml/finders.rb
26
49
  lib/rmtools/xml/node.rb
50
+ lib/rmtools/xml/xpath.rb
27
51
  lib/rmtools/xml/document.rb
28
- lib/rmtools/b.rb
29
- lib/rmtools/core/arguments.rb
30
- lib/rmtools/core/numeric.rb
31
- lib/rmtools/core/js.rb
32
- lib/rmtools/core/string_compliance.rb
33
- lib/rmtools/core/kernel.rb
34
- lib/rmtools/core/boolean.rb
35
- lib/rmtools/core/aliases.rb
36
- lib/rmtools/core/threadify.rb
37
- lib/rmtools/core/module.rb
38
- lib/rmtools/core/object.rb
39
- lib/rmtools/core/deprecation.rb
40
- lib/rmtools/core/regexp.rb
41
- lib/rmtools/core/class.rb
42
- lib/rmtools/core/proc.rb
43
- lib/rmtools/lang/ansi.rb
44
- lib/rmtools/lang/regexp.rb
45
- lib/rmtools/lang/cyrillic.rb
46
- lib/rmtools/rand/string.rb
47
- lib/rmtools/rand/enum.rb
48
- lib/rmtools/rand/range.rb
49
- lib/rmtools/rand/array.rb
52
+ lib/rmtools/xml/finders.rb
53
+ lib/rmtools/xml/libxml.rb
54
+ lib/rmtools/ip.rb
55
+ lib/rmtools/dev.rb
56
+ lib/rmtools/rand.rb
57
+ lib/rmtools/db/active_record.rb
58
+ lib/rmtools/core.rb
59
+ lib/rmtools/console.rb
50
60
  lib/rmtools/text/string_simple.rb
61
+ lib/rmtools/text/string_split.rb
51
62
  lib/rmtools/text/string_scanner.rb
52
63
  lib/rmtools/text/textilize.rb
53
64
  lib/rmtools/text/string_rtl.rb
54
- lib/rmtools/text/string_split.rb
55
- lib/rmtools/text/string_parse.rb
56
65
  lib/rmtools/text/regexp.rb
66
+ lib/rmtools/text/string_parse.rb
67
+ lib/rmtools/lang/cyrillic.rb
68
+ lib/rmtools/lang/ansi.rb
69
+ lib/rmtools/lang/regexp.rb
70
+ lib/rmtools/conversions/string.rb
71
+ lib/rmtools/conversions/json.rb
72
+ lib/rmtools/conversions/enum.rb
73
+ lib/rmtools/conversions/int.rb
57
74
  lib/rmtools/time/russian.rb
58
75
  lib/rmtools/time/global.rb
59
- lib/rmtools/rand.rb
60
- lib/rmtools/console/coloring.rb
61
- lib/rmtools/console/printing.rb
62
- lib/rmtools/console/highlight.rb
63
- lib/rmtools/core.rb
64
- lib/rmtools/db.rb
65
- lib/rmtools/fs.rb
66
- lib/rmtools/ip.rb
67
- lib/rmtools/lang.rb
68
- lib/rmtools/functional.rb
69
- lib/rmtools/install.rb
70
- lib/rmtools/functional/decorate.rb
76
+ lib/rmtools/enumerable.rb
77
+ lib/rmtools/dev_min.rb
78
+ lib/rmtools/ip/string.rb
79
+ lib/rmtools/ip/numeric.rb
80
+ lib/rmtools/xml.rb
71
81
  lib/rmtools/functional/fold.rb
82
+ lib/rmtools/functional/decorate.rb
72
83
  lib/rmtools/functional/unfold.rb
73
- lib/rmtools/text.rb
74
- lib/rmtools/console.rb
75
- lib/rmtools/time.rb
76
- lib/rmtools/dev.rb
77
- lib/rmtools/enumerable/common.rb
78
84
  lib/rmtools/enumerable/range.rb
79
- lib/rmtools/enumerable/hash.rb
80
- lib/rmtools/enumerable/array.rb
85
+ lib/rmtools/enumerable/traversal.rb
86
+ lib/rmtools/enumerable/common.rb
81
87
  lib/rmtools/enumerable/object_space.rb
82
88
  lib/rmtools/enumerable/array_iterators.rb
83
- lib/rmtools/require.rb
84
- lib/rmtools/xml.rb
85
- lib/rmtools/conversions.rb
86
- lib/rmtools/conversions/json.rb
87
- lib/rmtools/conversions/string.rb
88
- lib/rmtools/conversions/enum.rb
89
- lib/rmtools/conversions/int.rb
90
- lib/rmtools/enumerable.rb
91
- lib/rmtools/init.rb
92
- lib/rmtools/dev_min.rb
93
- lib/rmtools_dev.rb
94
- ./Rakefile
95
- ./Manifest.txt
96
- ./License.txt
97
- ./README.txt
89
+ lib/rmtools/enumerable/array.rb
90
+ lib/rmtools/enumerable/hash.rb
91
+ lib/rmtools/console/coloring.rb
92
+ lib/rmtools/console/printing.rb
93
+ lib/rmtools/console/highlight.rb
94
+ lib/rmtools.rb
95
+ README.md
96
+ Manifest.txt
97
+ ext/rmtools.cpp
98
+ ext/rmtools.h
99
+ ext/extconf.rb
100
+ LICENSE
101
+ Rakefile
data/README.md ADDED
@@ -0,0 +1,137 @@
1
+ ### RMTools
2
+ [github](https://github.com/tinbka/rmtools)
3
+
4
+ Collection of helpers for any need: strings, enumerables, Module... hundreds of bicycles, shortcuts you ever wanted to implement is here, optimized for performance.
5
+ Small dev library (in progress for ever): fast and smart logger, binding explorer, backtrace formatter, all are console-colored.
6
+ Started from basic classes, now it contains low-level helpers for ActiveRecord and makes LibXML more jQueryish.
7
+
8
+ RMTools is based on opinion that some boiler-plate should be thrown away from Ruby making it more expressive with no (0~10%) performance penalty:
9
+ `hash['id']` -> `hash.id`
10
+ `ary.map(&:id)` -> `ary.ids`
11
+ `ary.map {|h| h['id']}` -> `ary.ids`
12
+ `comments.posts.sorted_uniq_by_id.select_by_user_id(user_id).sum_points` -> `comments.map {|c| c.post}.sort_by {|p| p.id}.uniq_by {|p| p.id}.select {|p| p.user_id == user_id}.sum {|p| p.points}`
13
+
14
+ ---
15
+
16
+ It's still randomly documented since it's just my working tool.
17
+
18
+ #### Expected to complete:
19
+
20
+ * Ruby code parser (StringScanner-based) reading array of loaded ruby-files and making accurate hash-table of defined methods {"Class#method" => "def ... end"}
21
+ * JSON-formatter for output ruby objects content in HTML form in order to inspect big objects using browser abilities
22
+ * Redis addon (inspired by redis-objects): store and search relations, data-typing. (maybe I'll create another gem for that)
23
+
24
+ ### CHANGES
25
+
26
+ ##### Version 1.3.0
27
+
28
+ * Added ::ValueTraversal and ::KeyValueTraversal modules for treeish dir/enumerable search
29
+ * String
30
+ * * Cyrillic support: #fupcase, #fdowncase and instant up/down versions
31
+ * * #to_search, #squeeze_newlines, #recordize
32
+ * * key :js_caller to #parse for JS stacktrace lines as it given by stacktrace.js library
33
+ * Added AR::Base::boolean_scopes! and ::non_null_scopes!
34
+ * Added Object#ifndef for ivars caching
35
+ * Fixed bugs
36
+ * * Class#__init__ (case with nested classes)
37
+ * * AR::Base::select_rand (case with :where query)
38
+ * * ::rw and ::write (cases with encoding fail and non-string argument)
39
+ * Described the library and *marked down* this readme
40
+
41
+ ##### Version 1.2.14
42
+
43
+ * Smartified Array bicycles: #index_where, #indices_where, #set_where, #set_all_where, #del_where, #del_all_where
44
+ * Added #arrange_by to Array enumerators
45
+ * Added AR::Base::enum for virtual "enum" type support
46
+ * Updated detecting of xml charset encoding for ruby 1.9
47
+ * Fixed bug with empty trace formatting and Array#get_args with non-equalable argument
48
+
49
+ ##### Version 1.2.11
50
+
51
+ * Added Array#select_by and #reject_by pattern-iterators
52
+ * Fixed ActiveRecord::Base.select_rand
53
+ * Restricted RMTools.format_trace to use with Rails because of hard slowdown
54
+ * Updated Proc constants for ruby 1.9
55
+
56
+ ##### Version 1.2.10
57
+
58
+ * Update String#parse:caller to parse ruby 1.9 "block level". Now block level processes in RMLogger and RMTools.format_trace
59
+ * lib/dev/traceback.rb now applies to ruby > 1.9 as well
60
+ * Support of Yajl or (if not installed) JSON for #to_json and #from_json. Overwrites ActiveSupport's ::encode and ::decode since they're so damn slow.
61
+
62
+ ##### Version 1.2.8
63
+
64
+ * StringScanner#each changed to compare `cbs' keys with @matched by number in ruby 1.8 and by first character in ruby 1.9, since ?x in 1.9 returns string instead of a charcode
65
+ * Updated LibXML::XML::XPath to search elements with multiple classes
66
+
67
+ ##### Version 1.2.7
68
+
69
+ * String#hl and #ghl: console-highlight pattern in string
70
+ * True#call and False#call in order to pass boolean values as callable argument
71
+ * ActiveRecord::Relation#any? and #empty?, ActiveRecord::Base.insert_unless_exist (using execute) and .select_rand
72
+ * Added couple of handlers into Array#method_missing
73
+ * File.modify now can process files by glob-patterns and correctly use multiple gsub! inside passed block
74
+ * RMTools.read now can read from list of files in order
75
+ * Upped RMTools.timer accuracy
76
+ * Optimized Array#-, #+, #& and #| for when one of arrays is empty; added Array#diff
77
+ * Optimized Object#to_json and String#from_json: use JSON stdlib for ruby 1.9. Object#to_json_safe: timeout'ed conversion
78
+ * String#cut_line and #split_to_lines optimized for use in Ruby 1.9
79
+ * Removed String#bytes because it duplicate ruby 1.9 method
80
+ * static VALUE rb_ary_count_items moved from Array#count to Array#arrange
81
+ * Fixed Module#self_name
82
+ * RMTools::CodeReader is still unstable though
83
+
84
+ ##### Version 1.2.0
85
+
86
+ * Renamed debug/ to dev/, slightly restructured lib/rmtools/ and require handlers: requrie 'rmtools' for common applications and 'rmtools_dev' for irb and maybe dev environment
87
+ * Slightly extended StringScanner
88
+ * Proof of concept: Regexp reverse (wonder if someone did it earlier in Ruby)
89
+ * Kernel#whose? to find classes and/or modules knowing some method
90
+ * Method code lookup over all loaded libs (it can't handle evals yet), see dev/code_reading.rb
91
+ * Coloring is now made by singleton `Painter' and have option for transparent coloring
92
+
93
+ ##### Version 1.1.14
94
+
95
+ * Added caller level option (:caller => <int>) for Logger
96
+ * Fixed trace formatting (for sure for this time)
97
+ * Array iterator #sum_<method> now takes argument for #sum as first argument
98
+ * Completed Binding#inspect_env components
99
+
100
+ ##### Version 1.1.11
101
+
102
+ * Fixed Hash#unify_keys for 1.9.2
103
+ * Speeded Array#uniq_by up
104
+ * Added some shortcut methods for ActiveRecord::Base
105
+
106
+ ##### Version 1.1.10
107
+
108
+ * Deleted String#to_proc. It's anyway inconsistent and causes bug in ActiveRecord 3.0.5 Base#interpolate_and_sanitize_sql and potentially somewhere else
109
+ * Solved problem with String#sub methods in 1.9: that's associated with String#to_hash in some mystic way. #to_hash is now #to_params
110
+ * Some bugfixes for previous updates
111
+
112
+ ##### Version 1.1.7
113
+
114
+ * Cosmetic fixes for txts here
115
+
116
+ ##### Version 1.1.6
117
+
118
+ * Rewrited few functions
119
+ * Fixed bug with RDoc and RI
120
+ * Compatible with 1.9
121
+ * Binding#start_interaction and RMTools::Observer for debugging purposes
122
+ * To require any file from lib/rmtools now RMTools::require is used
123
+ * In order to not overload Rails apps initialization tracing is lightened and gem now may be also required as "rmtools_nodebug" and "rmtools_notrace"
124
+
125
+ ##### Version 1.1.0
126
+
127
+ * Fixed some bugs
128
+ * Divided by semantics
129
+ * Compatible with ruby 1.8.7 (2010-08-16 patchlevel 302)
130
+
131
+ ##### Version 1.0.0
132
+
133
+ * Divided by classes and packed as gem
134
+
135
+ ### License
136
+
137
+ RMTools is copyright (c) 2010-2013 Sergey Baev <tinbka@gmail.com>, and released under the terms of the Ruby license.
data/Rakefile CHANGED
@@ -2,18 +2,17 @@ require 'rake'
2
2
  require './lib/rmtools/install'
3
3
  compile_manifest
4
4
 
5
- RMTOOLS_VERSION = '1.2.14'
5
+ RMTOOLS_VERSION = '1.3.0'
6
6
  begin
7
7
  require 'hoe'
8
- config = Hoe.spec 'rmtools' do
9
- developer("Sergey Baev", "tinbka@gmail.com")
8
+ config = Hoe.spec 'rmtools' do |h|
9
+ h.developer("Sergey Baev", "tinbka@gmail.com")
10
10
 
11
- self.summary = 'Yet another Ruby applied lib'
12
- self.description = 'Applied library primarily for debug and text/arrays/files processing purposes.'
13
- self.changes = paragraphs_of('README.txt', 5..-1).join("\n\n")
14
- self.urls = ['https://github.com/tinbka/rmtools']
11
+ #self.summary = 'Yet another Ruby applied lib'
12
+ h.description = 'Applied library primarily for debug and text/arrays/files processing purposes.'
13
+ h.urls = ['https://github.com/tinbka/rmtools']
15
14
 
16
- self.extra_deps = [['rake','>= 0.8.7'], ['activesupport','>= 2.3.8']]
15
+ h.extra_deps = [['rake','>= 0.8.7'], ['activesupport','>= 2.3.8']]
17
16
  end
18
17
  config.spec.extensions << 'ext/extconf.rb'
19
18
  rescue LoadError
@@ -2,14 +2,20 @@
2
2
  class Class
3
3
 
4
4
  # define python-style initializer
5
+ # p = Post()
6
+ # p = Post user_id: 10
5
7
  def __init__
6
- modname, classname = name.match(/^(?:(.+)::)?([^:]+)$/)[1..2]
7
- classname ||= modname
8
- mod = '::'.in(name) ? eval(modname) : RMTools
9
- mod.module_eval "def #{classname} *args; #{name}.new *args end
10
- module_function :#{classname}"
11
- if mod != RMTools
12
- mod.each_child {|c| c.class_eval "include #{mod}; extend #{mod}" if !c.in c.children}
8
+ path = name.split('::')
9
+ classname = path[-1]
10
+ mod = '::'.in(name) ? eval(path[0..-2]*'::') : RMTools
11
+ if mod.is Module
12
+ mod.module_eval "def #{classname} *args; #{name}.new *args end
13
+ module_function :#{classname}"
14
+ if mod != RMTools
15
+ mod.each_child {|c| c.class_eval "include #{mod}; extend #{mod}" if !c.in c.children}
16
+ end
17
+ else
18
+ mod.class_eval "def #{classname} *args; #{name}.new *args end"
13
19
  end
14
20
  end
15
21
 
@@ -65,4 +65,8 @@ module Kernel
65
65
  Array === method ? classes : classes[method]
66
66
  end
67
67
 
68
+ def thread(&block)
69
+ Thread.new(&block)
70
+ end
71
+
68
72
  end
@@ -48,6 +48,31 @@ class Object
48
48
  container.size == 1 ? container[0].include?(self) : container.include?(self)
49
49
  end
50
50
 
51
+ def inspect_instance_variables
52
+ instance_eval {binding().inspect_instance_variables}
53
+ end
54
+
55
+ # def result_of_hard_calculation
56
+ # ifndef {... hard_calculation ...}
57
+ # end
58
+ # ==
59
+ # def result_of_hard_calculation
60
+ # if defined? @result_of_hard_calculation
61
+ # return @result_of_hard_calculation
62
+ # else
63
+ # ... hard_calculation
64
+ # res = ...
65
+ # @result_of_hard_calculation = res
66
+ # end
67
+ # end
68
+ def ifndef(ivar=caller(1)[0].parse(:caller).func)
69
+ ivar = :"@#{ivar}"
70
+ return instance_variable_get ivar if instance_variable_defined? ivar
71
+ instance_variable_set ivar, yield
72
+ end
73
+
74
+
75
+
51
76
  def deep_clone
52
77
  _deep_clone({})
53
78
  end
@@ -83,11 +83,12 @@ module ActiveRecord
83
83
  SELECT @cnt:=#{cnt ? cnt.to_i : 'COUNT(*)'}+1#{-discnt.to_i if discnt}, @lim:=#{limit.to_i}#{" FROM #{cnt_tables} WHERE #{cnt_where}" if !cnt}
84
84
  ) vars
85
85
  STRAIGHT_JOIN (
86
- SELECT #{fields}, @lim:=@lim-1 FROM #{tables} WHERE (@cnt:=@cnt-1) AND RAND() < @lim/@cnt#{" AND (#{_where})" if _where}
86
+ SELECT #{fields}, @lim:=@lim-1 FROM #{tables} WHERE #{"(#{_where}) AND " if _where} (@cnt:=@cnt-1) AND RAND() < @lim/@cnt
87
87
  ) i", options])
88
88
  end
89
89
 
90
90
  class_attribute :enums
91
+ # virtual (only-in-ruby) "enum" type support
91
92
  def enum hash
92
93
  key = hash.keys.first
93
94
  (self.enums ||= {}).merge! hash
@@ -101,9 +102,33 @@ module ActiveRecord
101
102
  write_attribute('#{key}', Fixnum === val ? val : self.class.enums[:#{key}].index val.to_s
102
103
  end
103
104
  }
104
- end
105
+ end
106
+
107
+ # usable to define shortcut-scopes on class with number of boolean flags: #admin, #open, #removed, etc
108
+ def boolean_scopes!
109
+ columns.select_by_type(:boolean).names.to_syms.each {|col|
110
+ unless respond_to? col
111
+ scope col, where("#{quoted_table_name}.#{col} = 1")
112
+ end
113
+ }
114
+ rescue
115
+ nil
116
+ end
117
+
118
+ # more universal version of boolean_scopes! that helps to find records with any non-null values,
119
+ # including zero and empty string
120
+ def non_null_scopes!
121
+ boolean_scopes!
122
+ columns.names.to_syms.each {|col|
123
+ unless respond_to? col
124
+ scope col, where("#{quoted_table_name}.#{col} is not null")
125
+ end
126
+ }
127
+ rescue
128
+ nil
129
+ end
105
130
 
106
- end
131
+ end
107
132
 
108
133
  # fix for thinking_sphinx equation in #instances_from_class:
109
134
  # ids.collect {|obj_id| instances.detect do |obj| obj.primary_key_for_sphinx == obj_id end}
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # Don't use it, it's slow as fuck
2
3
  RMTools::require 'dev/binding'
3
4
  require 'active_support/core_ext/class'
4
5
 
@@ -56,10 +56,10 @@ module RMTools
56
56
  def format_trace_to_html(a)
57
57
  a.map! do |lines|
58
58
  caller_string, snippet = lines/"\n"
59
- caller = caller_string.parse(:caller)
60
- if caller
61
- path = caller.path
62
- lines = ["<a href='#{CGI.escape 'file://'+path}'>#{path}</a>:#{caller.line} in #{caller.func}"]
59
+ caler = caller_string.parse(:caller)
60
+ if caler
61
+ path = caler.path
62
+ lines = ["<a href='#{CGI.escape 'file://'+path}'>#{path}</a>:#{caler.line} in #{caler.func}"]
63
63
  lines << RMTools::Painter.clean(snippet) if snippet
64
64
  lines * "\n"
65
65
  else
@@ -1,6 +1,10 @@
1
1
  # encoding: utf-8
2
2
  module Enumerable
3
3
 
4
+ def to_traversable
5
+ RMTools::ValueTraversable(to_a)
6
+ end
7
+
4
8
  def import(arr, index)
5
9
  self[index] = arr[index]
6
10
  end
@@ -26,7 +30,7 @@ module Enumerable
26
30
  res
27
31
  end
28
32
 
29
- def recursive_find_all(&b)
33
+ def recursive_select(&b)
30
34
  res = []
31
35
  to_a.each {|e|
32
36
  res << e if b[e]
@@ -1,9 +1,15 @@
1
1
  # encoding: utf-8
2
2
  require 'active_support/core_ext/hash'
3
+ RMTools::require 'enumerable/traversal'
3
4
 
4
5
  class Hash
6
+ include RMTools::KeyValueTraversal
5
7
  alias :>> :reverse_merge!
6
8
 
9
+ def to_traversable
10
+ RMTools::KeyValueTraversable.new(self)
11
+ end
12
+
7
13
  def +(other_hash)
8
14
  merge(other_hash || {})
9
15
  end
@@ -0,0 +1,164 @@
1
+ module RMTools
2
+
3
+ # It's included into Dir and could also be included into Enumerable
4
+ # Though we don't do latter automatically, because Enumerable as it is overloaded of a bunch of questionable methods
5
+ module ValueTraversal
6
+
7
+ def preorder_traverse(&b)
8
+ next_level = RMTools::ValueTraversable.new
9
+ to_traversable.each {|e|
10
+ if e.respond_to? :preorder_traverse
11
+ next_level += e
12
+ else
13
+ b[e]
14
+ end
15
+ }
16
+ next_level.preorder_traverse(&b) if next_level.any?
17
+ end
18
+
19
+ def depth_first_traverse(&b)
20
+ to_traversable.flatten.each &b
21
+ end
22
+
23
+ def preorder_find(&b)
24
+ next_level = RMTools::ValueTraversable.new
25
+ to_traversable.each {|e|
26
+ if e.respond_to? :preorder_find
27
+ next_level += e
28
+ else
29
+ return e if b[e]
30
+ end
31
+ }
32
+ next_level.preorder_find(&b) if next_level.any?
33
+ end
34
+
35
+ def depth_first_find(&b)
36
+ to_traversable.each {|e|
37
+ if v.respond_to? :depth_first_find
38
+ if res = e.depth_first_find(&b)
39
+ return res
40
+ end
41
+ else
42
+ return e if b[e]
43
+ end
44
+ }
45
+ nil
46
+ end
47
+
48
+ def preorder_select
49
+ res = []; preorder_traverse {|e| res << e if yield(e)}; res
50
+ end
51
+
52
+ def depth_first_select
53
+ res = []; depth_first_traverse {|e| res << e if yield(e)}; res
54
+ end
55
+
56
+ def depth_first_map(&b)
57
+ to_traversable.map {|e|
58
+ if e.respond_to? :depth_map
59
+ e.depth_map &b
60
+ else
61
+ b[e]
62
+ end
63
+ }
64
+ end
65
+
66
+ end
67
+
68
+ # Presumptions:
69
+ # all keys (at least on the same depth) are uniq
70
+ # values are either enumerable or nothing
71
+ #
72
+ # It's included into Hash
73
+ module KeyValueTraversal
74
+
75
+ def preorder_traverse(&b)
76
+ next_level = RMTools::KeyValueTraversable.new
77
+ to_traversal.each {|k, v|
78
+ b[k]
79
+ if v.respond_to? :preorder_traverse
80
+ next_level += v
81
+ end
82
+ }
83
+ next_level.preorder_traverse(&b) if next_level.any?
84
+ end
85
+
86
+ def depth_first_traverse(&b)
87
+ to_traversal.each {|k, v|
88
+ b[k]
89
+ if v.respond_to? :depth_first_traverse
90
+ v.depth_first_traverse &b
91
+ end
92
+ }
93
+ end
94
+
95
+ def preorder_find(&b)
96
+ next_level = RMTools::KeyValueTraversable.new
97
+ to_traversal.each {|k, v|
98
+ return k if b[k]
99
+ if v.respond_to? :preorder_find
100
+ next_level += v
101
+ end
102
+ }
103
+ next_level.preorder_find(&b) if next_level.any?
104
+ end
105
+
106
+ def depth_first_find(&b)
107
+ to_traversal.each {|k, v|
108
+ return k if b[k]
109
+ if v.respond_to?(:depth_first_traverse) and res = v.depth_first_traverse(&b)
110
+ return res
111
+ end
112
+ }
113
+ nil
114
+ end
115
+
116
+ def preorder_select
117
+ res = []; preorder_traverse {|k, v| res << k if yield(k)}; res
118
+ end
119
+
120
+ def depth_first_select
121
+ res = []; depth_first_traverse {|k, v| res << k if yield(k)}; res
122
+ end
123
+
124
+ end
125
+
126
+ class ValueTraversable < Array
127
+ include ValueTraversal
128
+ __init__ if respond_to? :__init__
129
+
130
+ private
131
+ alias :array_plus :+
132
+ public
133
+
134
+ def +(enum)
135
+ if Hash === enum
136
+ enum = enum.values
137
+ end
138
+ array_plus enum.to_traversable
139
+ end
140
+
141
+ def to_traversable
142
+ self
143
+ end
144
+ end
145
+
146
+ class KeyValueTraversable < Hash
147
+ include KeyValueTraversal
148
+ __init__ if respond_to? :__init__
149
+
150
+ def +(enum)
151
+ if Hash === enum
152
+ merge enum.to_traversable
153
+ else
154
+ values.to_traversable.concat enum.to_traversable
155
+ end
156
+ end
157
+
158
+ def to_traversable
159
+ self
160
+ end
161
+ end
162
+
163
+ end
164
+
@@ -1,7 +1,14 @@
1
1
  # encoding: utf-8
2
2
  RMTools::require 'fs/file'
3
+ RMTools::require 'enumerable/traversal'
3
4
 
4
5
  class Dir
6
+ # included in order to use treeish search in directory content tree
7
+ include RMTools::ValueTraversal
8
+
9
+ def to_traversable
10
+ RMTools::ValueTraversable.new(children)
11
+ end
5
12
 
6
13
  def include?(name)
7
14
  #content.map {|f| File.split(f)[1]}.include? name
@@ -12,9 +19,9 @@ class Dir
12
19
  list = []
13
20
  cont = content.map {|f|
14
21
  if File.directory?(f)
15
- rc = Dir.new(f).recursive_content.map {|f| f.sub(/^\.\//, '')}
22
+ rc = Dir.new(f).recursive_content(flat)
16
23
  flat ? list.concat(rc) : rc
17
- else flat ? (list << f) : f
24
+ else flat ? (list << f.sub(/^\.\//, '')) : f.sub(/^\.\//, '')
18
25
  end
19
26
  }
20
27
  (flat ? list : cont)
data/lib/rmtools/fs/io.rb CHANGED
@@ -12,21 +12,26 @@ class IO
12
12
  end
13
13
 
14
14
  module RMTools
15
-
16
- def rw(df, value=nil)
17
- return false if value.nil?
18
- df = df.tr '\\', '/'
19
- path = File.dirname(df)
20
- FileUtils.mkpath(path) if !File.directory?(path)
15
+
16
+ def self.prepare_write(df, value)
17
+ return false if value.nil?
18
+ value = value.inspect unless value.class == String
19
+ value = value.force_encoding('UTF-8') if RUBY_VERSION > '1.9'
20
+ df = df.tr '\\', '/'
21
+ path = File.dirname(df)
22
+ FileUtils.mkpath(path) if !File.directory?(path)
23
+ yield df, value
24
+ value.size
25
+ end
26
+
27
+ def rw(df, value=nil)
28
+ RMTools::prepare_write df, value do
21
29
  File.open(df, File::CREAT|File::WRONLY|File::TRUNC) {|f| f << value}
22
- value.size
23
30
  end
24
-
25
- def write(df, value='', pos=0)
26
- return false if value.nil?
27
- df = df.tr '\\', '/'
28
- path = File.dirname(df)
29
- FileUtils.mkpath(path) if !File.directory?(path)
31
+ end
32
+
33
+ def write(df, value='', pos=0)
34
+ RMTools::prepare_write df, value do
30
35
  if pos == 0
31
36
  File.open(df, File::CREAT|File::WRONLY|File::APPEND) {|f| f << value}
32
37
  else
@@ -40,8 +45,8 @@ module RMTools
40
45
  end
41
46
  File.open(df, File::CREAT|File::WRONLY) {|f| f.pos = pos; f << value}
42
47
  end
43
- value.size
44
48
  end
49
+ end
45
50
 
46
51
  # read('filename')
47
52
  ### => 'text from filename'
@@ -1,4 +1,6 @@
1
1
  # Emulate python's @-operator
2
+ # Consider as proof of concept since there is alias_method_chain
3
+ # that rubyists used to use for decorating
2
4
  class Module
3
5
 
4
6
  private
@@ -7,10 +7,12 @@ module RMTools
7
7
  module Cyrillic
8
8
  RU_LETTERS = "абвгдеёжзийклмнопрстуфхцчшщьыъэюя", "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ"
9
9
 
10
+ ANSI_LETTERS_UC = ["\270\340-\377", "\250\300-\337"]
11
+ ANSI_LETTERS_DC = ANSI_LETTERS_UC.reverse
12
+ ANSI_YOYE = ["\270\250", "\345\305"]
10
13
  if RUBY_VERSION > '1.9'
11
- ANSI_LETTERS_UC = ["\270\340-\377", "\250\300-\337"].force_encodings "Windows-1251"
12
- ANSI_LETTERS_DC = ANSI_LETTERS_UC.reverse
13
- ANSI_YOYE = ["\270\250", "\345\305"].force_encodings "Windows-1251"
14
+ ANSI_LETTERS_UC.force_encodings "Windows-1251"
15
+ ANSI_YOYE.force_encodings "Windows-1251"
14
16
  ANSI_ENCODING = ANSI_LETTERS_UC[0].encoding
15
17
  end
16
18
  end
@@ -17,6 +17,52 @@ class String
17
17
  self !~ /[^А-пр-ёЁ]/
18
18
  end
19
19
 
20
+ def cupcase
21
+ encoding != ANSI_ENCODING ?
22
+ ANSI2UTF[UTF2ANSI[self].tr(*ANSI_LETTERS_UC)] :
23
+ tr(*ANSI_LETTERS_UC)
24
+ end
25
+ def cupcase!
26
+ encoding != ANSI_ENCODING ?
27
+ ANSI2UTF[UTF2ANSI[self].tr!(*ANSI_LETTERS_UC)] :
28
+ tr!(*ANSI_LETTERS_UC)
29
+ end
30
+
31
+ def cdowncase
32
+ encoding != ANSI_ENCODING ?
33
+ ANSI2UTF[UTF2ANSI[self].tr(*ANSI_LETTERS_DC)] :
34
+ tr(*ANSI_LETTERS_DC)
35
+ end
36
+ def cdowncase!
37
+ encoding != ANSI_ENCODING ?
38
+ ANSI2UTF[UTF2ANSI[self].tr!(*ANSI_LETTERS_DC)] :
39
+ tr!(*ANSI_LETTERS_DC)
40
+ end
41
+
42
+ def rmumlaut
43
+ encoding != ANSI_ENCODING ?
44
+ ANSI2UTF[UTF2ANSI[self].tr(*ANSI_YOYE)] :
45
+ tr(*ANSI_YOYE)
46
+ end
47
+
48
+ # full upcase, because cdowncase doesn't convert non-cyrillic
49
+ def fupcase
50
+ upcase.cupcase
51
+ end
52
+ def fupcase!
53
+ res = upcase!
54
+ cupcase! or res
55
+ end
56
+
57
+ # full downcase, because cdowncase doesn't convert non-cyrillic
58
+ def fdowncase
59
+ downcase.cdowncase
60
+ end
61
+ def fdowncase!
62
+ res = downcase!
63
+ cdowncase! or res
64
+ end
65
+
20
66
  if RUBY_VERSION > "1.9"
21
67
 
22
68
  def translit
@@ -31,33 +77,18 @@ class String
31
77
  tr "`qwertyuiop[]asdfghjkl;:'zxcvbnm,./|?\"@\#$^&~QWERTYUIOP{}ASDFGHJKLZXCVBNM<>", "ёйцукенгшщзхъфывапролджЖэячсмитьбю./,Э\"№;:?ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЯЧСМИТЬБЮ"
32
78
  end
33
79
 
34
- def cupcase
35
- encoding != ANSI_ENCODING ?
36
- ANSI2UTF[UTF2ANSI[self].tr(*ANSI_LETTERS_UC)]:
37
- tr(*ANSI_LETTERS_UC)
38
- end
39
-
40
- def cdowncase
41
- encoding != ANSI_ENCODING ?
42
- ANSI2UTF[UTF2ANSI[self].tr(*ANSI_LETTERS_DC)]:
43
- tr(*ANSI_LETTERS_DC)
80
+ def ccap
81
+ self[0].cupcase + self[1..-1]
44
82
  end
45
83
 
46
84
  def cuncap
47
85
  self[0].cdowncase + self[1..-1]
48
86
  end
49
-
50
- def rmumlaut
51
- encoding != ANSI_ENCODING ?
52
- ANSI2UTF[UTF2ANSI[self].tr(*ANSI_YOYE)]:
53
- tr(*ANSI_YOYE)
54
- end
55
87
 
56
88
  alias csize size
57
89
  alias cljust ljust
58
90
  alias cjust rjust
59
91
  alias ccenter center
60
- alias ccap capitalize
61
92
  alias csqueeze squeeze
62
93
 
63
94
  def ci; self end
@@ -84,18 +115,6 @@ class String
84
115
  ANSI2UTF[UTF2ANSI[self].center(*args)]
85
116
  end
86
117
 
87
- def cupcase(encode=1)
88
- encode ?
89
- ANSI2UTF[UTF2ANSI[self].tr("\270\340-\377", "\250\300-\337")]:
90
- tr("\270\340-\377", "\250\300-\337")
91
- end
92
-
93
- def cdowncase(encode=1)
94
- encode ?
95
- ANSI2UTF[UTF2ANSI[self].tr("\250\300-\337", "\270\340-\377")]:
96
- tr("\250\300-\337", "\270\340-\377")
97
- end
98
-
99
118
  def ccap(encode=1)
100
119
  self[0,2].cupcase(encode) + self[2..-1]
101
120
  end
@@ -108,12 +127,6 @@ class String
108
127
  ANSI2UTF[UTF2ANSI[self].squeeze]
109
128
  end
110
129
 
111
- def rmumlaut(encode=1)
112
- encode ?
113
- ANSI2UTF[UTF2ANSI[self].tr("\270\250", "\345\305")]:
114
- tr("\270\250", "\345\305")
115
- end
116
-
117
130
  def ru2en
118
131
  gsub("ё", "`").gsub("й", "q").gsub("ц", "w").gsub("у", "e").gsub("к", "r").gsub("е", "t").gsub("н", "y").gsub("г", "u").gsub("ш", "i").gsub("щ", "o").gsub("з", "p").gsub("х", "[").gsub("ъ", "]").gsub("ф", "a").gsub("ы", "s").gsub("в", "d").gsub("а", "f").gsub("п", "g").gsub("р", "h").gsub("о", "j").gsub("л", "k").gsub("д", "l").gsub("э", "'").gsub("я", "z").gsub("ч", "x").gsub("с", "c").gsub("м", "v").gsub("и", "b").gsub("т", "n").gsub("ь", "m").gsub("/", "|").gsub(".", "/").gsub("ю", ".").gsub("?", "&").gsub(",", "?").gsub("б", ",").gsub("\"", "@").gsub("№", "#").gsub(";", "$").gsub(":", "^").gsub("ж", ";").gsub("Ё", "~").gsub("Й", "Q").gsub("Ц", "W").gsub("У", "E").gsub("К", "R").gsub("Е", "T").gsub("Н", "Y").gsub("Г", "U").gsub("Ш", "I").gsub("Щ", "O").gsub("З", "P").gsub("Х", "{").gsub("Ъ", "}").gsub("Ф", "A").gsub("Ы", "S").gsub("В", "D").gsub("А", "F").gsub("П", "G").gsub("Р", "H").gsub("О", "J").gsub("Л", "K").gsub("Д", "L").gsub("Ж", ":").gsub("Э", "\"").gsub("Я", "Z").gsub("Ч", "X").gsub("С", "C").gsub("М", "V").gsub("И", "B").gsub("Т", "N").gsub("Ь", "M").gsub("Б", "<").gsub("Ю", ">")
119
132
  end
@@ -2,14 +2,20 @@
2
2
  RMTools::require 'conversions/string'
3
3
 
4
4
  class String
5
- CALLER_RE = %r{^(.*?([^/\\]+?))#{ # ( path ( file ) )
6
- }:(\d+)(?::in #{ # :( line )[ :in
7
- }`(block (?:\((\d+) levels\) )?in )?(.+?)'#{ # `[ block in ] ( closure )' ]
8
- })?$}
9
- SIMPLE_CALLER_RE = %r{^(.*?([^/\\]+?))#{ # ( path ( file ) )
10
- }:(\d+)(?::in #{ # :( line )[ :in
11
- }`(.+?)'#{ # `( closure )' ]
12
- })?$}
5
+ CALLER_RE = %r{^(.*?([^/\\]+?))#{ # ( path ( file ) )
6
+ }:(\d+)(?::in #{ # :( line )[ :in
7
+ }`(block (?:\((\d+) levels\) )?in )?(.+?)'#{ # `[ block in ] ( closure )' ]
8
+ })?$}
9
+ SIMPLE_CALLER_RE = %r{^(.*?([^/\\]+?))#{ # ( path ( file ) )
10
+ }:(\d+)(?::in #{ # :( line )[ :in
11
+ }`(.+?)'#{ # `( closure )' ]
12
+ })?$}
13
+ JS_CALLER_RE = %r{^(?:(\S*)[\s@])?\(?(?:[^:]+://#{ # ( func ) (protocol
14
+ }[^/:]*(?::\d+)?)?#{ # root[:port]
15
+ }/([^?#]*?\/(\w+(?:\.\w+)?)#{ # ( path/( file[ .fileext ] )
16
+ }(?:\?.*?)?)#{ # [ ?query ] )
17
+ }:(\d+)?(?::(\d+))?#{ # :( line ):( char ))
18
+ }\)?$}
13
19
  URL_RE = %r{^((?:([^:]+)://)#{ # ( protocol
14
20
  }([^/:]*(?::(\d+))?))?#{ # root[:port] )
15
21
  }((/[^?#]*?(?:\.(\w+))?)#{ # ( path[.( fileext )]
@@ -47,6 +53,15 @@ class String
47
53
  'fullpath' => m[1] =~ /[\(\[]/ ?
48
54
  m[1] :
49
55
  File.expand_path(m[1]) }
56
+ when :js_caller
57
+ m = match JS_CALLER_RE
58
+ !m || m[0].empty? ? nil :
59
+ { 'func' => m[1],
60
+ 'fullpath' => m[2],
61
+ 'file' => m[3],
62
+ 'line' => m[4] && m[4].to_i,
63
+ 'char' => m[5] && m[5].to_i,
64
+ 'from' => m[3..5].compact*':' }
50
65
  when :ip; self[IP_RE]
51
66
  when :ip_range; (m = match IP_RANGE_RE) && m[1]..m[2]
52
67
  else raise ArgumentError, "Incorrect flag. Correct flags: :uri, :caller, :ip, :ip_range"
@@ -79,6 +79,7 @@ class String
79
79
  #end
80
80
  #
81
81
  # this method defined in Enumerable and returns Enumerable::Enumerator that should be converted to array of integers, not hex-strings
82
+
82
83
  if RUBY_VERSION < '1.9'
83
84
  def symbols_count
84
85
  unpack('U*').size
@@ -89,4 +90,31 @@ class String
89
90
  end
90
91
  end
91
92
 
93
+
94
+ # make simple strings readable by FTS engines and make results more cacheable by key-value dbs
95
+ def to_search
96
+ gsub(/[\0-\/:-@\[-`{-~ \s]/, ' ').strip.squeeze(' ').fdowncase
97
+ end
98
+
99
+ # remove empty strings from html output
100
+ def squeeze_newlines
101
+ gsub(/\s+\n+/, "\n").squeeze("\n")
102
+ end
103
+
104
+ # polymorphic helper
105
+ def recordize(whiny=true)
106
+ classname, id = split('#')
107
+ unless id
108
+ if whiny
109
+ raise ArgumentError, "Could not find record by string: #{inspect}"
110
+ else return false
111
+ end
112
+ end
113
+ model = classname.constantize
114
+ model.respond_to?(:get) ?
115
+ model.get(id) :
116
+ model.where(:id => id).first
117
+ end
118
+ alias :to_record :recordize
119
+
92
120
  end
data/lib/rmtools.so ADDED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rmtools
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.14
4
+ version: 1.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-05 00:00:00.000000000 Z
12
+ date: 2013-03-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -66,7 +66,7 @@ dependencies:
66
66
  requirements:
67
67
  - - ~>
68
68
  - !ruby/object:Gem::Version
69
- version: '3.0'
69
+ version: '3.5'
70
70
  type: :development
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -74,7 +74,7 @@ dependencies:
74
74
  requirements:
75
75
  - - ~>
76
76
  - !ruby/object:Gem::Version
77
- version: '3.0'
77
+ version: '3.5'
78
78
  description: Applied library primarily for debug and text/arrays/files processing
79
79
  purposes.
80
80
  email:
@@ -83,107 +83,111 @@ executables: []
83
83
  extensions:
84
84
  - ext/extconf.rb
85
85
  extra_rdoc_files:
86
- - ./Manifest.txt
87
- - ./License.txt
88
- - ./README.txt
86
+ - License.txt
87
+ - README.txt
88
+ - Manifest.txt
89
89
  files:
90
- - ext/extconf.rb
91
- - ext/rmtools.h
92
- - ext/rmtools.cpp
93
- - lib/rmtools.rb
94
- - lib/rmtools/db/active_record.rb
95
- - lib/rmtools/fs/io.rb
96
- - lib/rmtools/fs/file.rb
90
+ - License.txt
91
+ - README.txt
92
+ - lib/rmtools_dev.rb
93
+ - lib/rmtools.so
94
+ - lib/rmtools/core/module.rb
95
+ - lib/rmtools/core/js.rb
96
+ - lib/rmtools/core/string_compliance.rb
97
+ - lib/rmtools/core/kernel.rb
98
+ - lib/rmtools/core/arguments.rb
99
+ - lib/rmtools/core/object.rb
100
+ - lib/rmtools/core/deprecation.rb
101
+ - lib/rmtools/core/aliases.rb
102
+ - lib/rmtools/core/proc.rb
103
+ - lib/rmtools/core/class.rb
104
+ - lib/rmtools/core/numeric.rb
105
+ - lib/rmtools/core/boolean.rb
106
+ - lib/rmtools/core/regexp.rb
107
+ - lib/rmtools/core/threadify.rb
108
+ - lib/rmtools/rand/range.rb
109
+ - lib/rmtools/rand/string.rb
110
+ - lib/rmtools/rand/array.rb
111
+ - lib/rmtools/rand/enum.rb
112
+ - lib/rmtools/db.rb
113
+ - lib/rmtools/install.rb
114
+ - lib/rmtools/conversions.rb
115
+ - lib/rmtools/functional.rb
116
+ - lib/rmtools/require.rb
117
+ - lib/rmtools/lang.rb
118
+ - lib/rmtools/time.rb
119
+ - lib/rmtools/fs.rb
97
120
  - lib/rmtools/fs/dir.rb
121
+ - lib/rmtools/fs/file.rb
98
122
  - lib/rmtools/fs/tools.rb
99
- - lib/rmtools/ip/numeric.rb
100
- - lib/rmtools/ip/string.rb
101
- - lib/rmtools/dev/present.rb
102
- - lib/rmtools/dev/blackhole.rb
103
- - lib/rmtools/dev/observing.rb
123
+ - lib/rmtools/fs/io.rb
104
124
  - lib/rmtools/dev/traceback.rb
105
- - lib/rmtools/dev/binding.rb
106
125
  - lib/rmtools/dev/logging.rb
107
- - lib/rmtools/dev/trace_format.rb
108
- - lib/rmtools/dev/highlight.rb
126
+ - lib/rmtools/dev/binding.rb
109
127
  - lib/rmtools/dev/timer.rb
128
+ - lib/rmtools/dev/blackhole.rb
110
129
  - lib/rmtools/dev/code_reader.rb
111
- - lib/rmtools/xml/xpath.rb
130
+ - lib/rmtools/dev/trace_format.rb
131
+ - lib/rmtools/dev/highlight.rb
132
+ - lib/rmtools/dev/present.rb
133
+ - lib/rmtools/dev/observing.rb
134
+ - lib/rmtools/b.rb
135
+ - lib/rmtools/init.rb
136
+ - lib/rmtools/text.rb
112
137
  - lib/rmtools/xml/string.rb
113
- - lib/rmtools/xml/libxml.rb
114
- - lib/rmtools/xml/finders.rb
115
138
  - lib/rmtools/xml/node.rb
139
+ - lib/rmtools/xml/xpath.rb
116
140
  - lib/rmtools/xml/document.rb
117
- - lib/rmtools/b.rb
118
- - lib/rmtools/core/arguments.rb
119
- - lib/rmtools/core/numeric.rb
120
- - lib/rmtools/core/js.rb
121
- - lib/rmtools/core/string_compliance.rb
122
- - lib/rmtools/core/kernel.rb
123
- - lib/rmtools/core/boolean.rb
124
- - lib/rmtools/core/aliases.rb
125
- - lib/rmtools/core/threadify.rb
126
- - lib/rmtools/core/module.rb
127
- - lib/rmtools/core/object.rb
128
- - lib/rmtools/core/deprecation.rb
129
- - lib/rmtools/core/regexp.rb
130
- - lib/rmtools/core/class.rb
131
- - lib/rmtools/core/proc.rb
132
- - lib/rmtools/lang/ansi.rb
133
- - lib/rmtools/lang/regexp.rb
134
- - lib/rmtools/lang/cyrillic.rb
135
- - lib/rmtools/rand/string.rb
136
- - lib/rmtools/rand/enum.rb
137
- - lib/rmtools/rand/range.rb
138
- - lib/rmtools/rand/array.rb
141
+ - lib/rmtools/xml/finders.rb
142
+ - lib/rmtools/xml/libxml.rb
143
+ - lib/rmtools/ip.rb
144
+ - lib/rmtools/dev.rb
145
+ - lib/rmtools/rand.rb
146
+ - lib/rmtools/db/active_record.rb
147
+ - lib/rmtools/core.rb
148
+ - lib/rmtools/console.rb
139
149
  - lib/rmtools/text/string_simple.rb
150
+ - lib/rmtools/text/string_split.rb
140
151
  - lib/rmtools/text/string_scanner.rb
141
152
  - lib/rmtools/text/textilize.rb
142
153
  - lib/rmtools/text/string_rtl.rb
143
- - lib/rmtools/text/string_split.rb
144
- - lib/rmtools/text/string_parse.rb
145
154
  - lib/rmtools/text/regexp.rb
155
+ - lib/rmtools/text/string_parse.rb
156
+ - lib/rmtools/lang/cyrillic.rb
157
+ - lib/rmtools/lang/ansi.rb
158
+ - lib/rmtools/lang/regexp.rb
159
+ - lib/rmtools/conversions/string.rb
160
+ - lib/rmtools/conversions/json.rb
161
+ - lib/rmtools/conversions/enum.rb
162
+ - lib/rmtools/conversions/int.rb
146
163
  - lib/rmtools/time/russian.rb
147
164
  - lib/rmtools/time/global.rb
148
- - lib/rmtools/rand.rb
149
- - lib/rmtools/console/coloring.rb
150
- - lib/rmtools/console/printing.rb
151
- - lib/rmtools/console/highlight.rb
152
- - lib/rmtools/core.rb
153
- - lib/rmtools/db.rb
154
- - lib/rmtools/fs.rb
155
- - lib/rmtools/ip.rb
156
- - lib/rmtools/lang.rb
157
- - lib/rmtools/functional.rb
158
- - lib/rmtools/install.rb
159
- - lib/rmtools/functional/decorate.rb
165
+ - lib/rmtools/enumerable.rb
166
+ - lib/rmtools/dev_min.rb
167
+ - lib/rmtools/ip/string.rb
168
+ - lib/rmtools/ip/numeric.rb
169
+ - lib/rmtools/xml.rb
160
170
  - lib/rmtools/functional/fold.rb
171
+ - lib/rmtools/functional/decorate.rb
161
172
  - lib/rmtools/functional/unfold.rb
162
- - lib/rmtools/text.rb
163
- - lib/rmtools/console.rb
164
- - lib/rmtools/time.rb
165
- - lib/rmtools/dev.rb
166
- - lib/rmtools/enumerable/common.rb
167
173
  - lib/rmtools/enumerable/range.rb
168
- - lib/rmtools/enumerable/hash.rb
169
- - lib/rmtools/enumerable/array.rb
174
+ - lib/rmtools/enumerable/traversal.rb
175
+ - lib/rmtools/enumerable/common.rb
170
176
  - lib/rmtools/enumerable/object_space.rb
171
177
  - lib/rmtools/enumerable/array_iterators.rb
172
- - lib/rmtools/require.rb
173
- - lib/rmtools/xml.rb
174
- - lib/rmtools/conversions.rb
175
- - lib/rmtools/conversions/json.rb
176
- - lib/rmtools/conversions/string.rb
177
- - lib/rmtools/conversions/enum.rb
178
- - lib/rmtools/conversions/int.rb
179
- - lib/rmtools/enumerable.rb
180
- - lib/rmtools/init.rb
181
- - lib/rmtools/dev_min.rb
182
- - lib/rmtools_dev.rb
183
- - ./Rakefile
184
- - ./Manifest.txt
185
- - ./License.txt
186
- - ./README.txt
178
+ - lib/rmtools/enumerable/array.rb
179
+ - lib/rmtools/enumerable/hash.rb
180
+ - lib/rmtools/console/coloring.rb
181
+ - lib/rmtools/console/printing.rb
182
+ - lib/rmtools/console/highlight.rb
183
+ - lib/rmtools.rb
184
+ - README.md
185
+ - Manifest.txt
186
+ - ext/rmtools.cpp
187
+ - ext/rmtools.h
188
+ - ext/extconf.rb
189
+ - LICENSE
190
+ - Rakefile
187
191
  homepage: https://github.com/tinbka/rmtools
188
192
  licenses: []
189
193
  post_install_message:
@@ -206,8 +210,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
206
210
  version: '0'
207
211
  requirements: []
208
212
  rubyforge_project: rmtools
209
- rubygems_version: 1.8.24
213
+ rubygems_version: 1.8.23
210
214
  signing_key:
211
215
  specification_version: 3
212
- summary: Yet another Ruby applied lib
216
+ summary: ''
213
217
  test_files: []