tins 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 +4 -0
- data/.travis.yml +7 -0
- data/Gemfile +5 -0
- data/LICENSE +18 -0
- data/README.rdoc +20 -0
- data/Rakefile +28 -0
- data/TODO +1 -0
- data/VERSION +1 -0
- data/lib/spruz.rb +1 -0
- data/lib/tins.rb +34 -0
- data/lib/tins/alias.rb +1 -0
- data/lib/tins/attempt.rb +51 -0
- data/lib/tins/bijection.rb +46 -0
- data/lib/tins/count_by.rb +8 -0
- data/lib/tins/deep_dup.rb +11 -0
- data/lib/tins/file_binary.rb +85 -0
- data/lib/tins/generator.rb +68 -0
- data/lib/tins/go.rb +43 -0
- data/lib/tins/hash_symbolize_keys_recursive.rb +28 -0
- data/lib/tins/hash_union.rb +15 -0
- data/lib/tins/limited.rb +38 -0
- data/lib/tins/lines_file.rb +123 -0
- data/lib/tins/memoize.rb +78 -0
- data/lib/tins/minimize.rb +55 -0
- data/lib/tins/module_group.rb +13 -0
- data/lib/tins/null.rb +26 -0
- data/lib/tins/once.rb +25 -0
- data/lib/tins/p.rb +23 -0
- data/lib/tins/partial_application.rb +31 -0
- data/lib/tins/range_plus.rb +9 -0
- data/lib/tins/round.rb +51 -0
- data/lib/tins/secure_write.rb +25 -0
- data/lib/tins/shuffle.rb +17 -0
- data/lib/tins/string_camelize.rb +16 -0
- data/lib/tins/string_underscore.rb +15 -0
- data/lib/tins/string_version.rb +105 -0
- data/lib/tins/subhash.rb +42 -0
- data/lib/tins/time_dummy.rb +31 -0
- data/lib/tins/to_proc.rb +11 -0
- data/lib/tins/uniq_by.rb +10 -0
- data/lib/tins/version.rb +10 -0
- data/lib/tins/write.rb +19 -0
- data/lib/tins/xt.rb +25 -0
- data/lib/tins/xt/attempt.rb +7 -0
- data/lib/tins/xt/blank.rb +67 -0
- data/lib/tins/xt/count_by.rb +11 -0
- data/lib/tins/xt/deep_dup.rb +7 -0
- data/lib/tins/xt/file_binary.rb +7 -0
- data/lib/tins/xt/full.rb +33 -0
- data/lib/tins/xt/hash_symbolize_keys_recursive.rb +7 -0
- data/lib/tins/xt/hash_union.rb +11 -0
- data/lib/tins/xt/irb.rb +17 -0
- data/lib/tins/xt/named.rb +35 -0
- data/lib/tins/xt/null.rb +5 -0
- data/lib/tins/xt/p.rb +7 -0
- data/lib/tins/xt/partial_application.rb +11 -0
- data/lib/tins/xt/range_plus.rb +12 -0
- data/lib/tins/xt/round.rb +13 -0
- data/lib/tins/xt/secure_write.rb +11 -0
- data/lib/tins/xt/shuffle.rb +11 -0
- data/lib/tins/xt/string.rb +5 -0
- data/lib/tins/xt/string_camelize.rb +6 -0
- data/lib/tins/xt/string_underscore.rb +6 -0
- data/lib/tins/xt/string_version.rb +7 -0
- data/lib/tins/xt/subhash.rb +11 -0
- data/lib/tins/xt/symbol_to_proc.rb +7 -0
- data/lib/tins/xt/time_dummy.rb +7 -0
- data/lib/tins/xt/uniq_by.rb +15 -0
- data/lib/tins/xt/write.rb +11 -0
- data/tests/tins_file_binary_test.rb +67 -0
- data/tests/tins_lines_file_test.rb +84 -0
- data/tests/tins_memoize_test.rb +52 -0
- data/tests/tins_secure_write_test.rb +44 -0
- data/tests/tins_test.rb +629 -0
- data/tins.gemspec +35 -0
- metadata +212 -0
data/lib/tins/xt/full.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'tins/xt/blank'
|
2
|
+
|
3
|
+
module Tins
|
4
|
+
module Full
|
5
|
+
# Returns the object if it isn't blank (as in Object#blank?), otherwise it
|
6
|
+
# returns nil. If a block was given as an argument and the object isn't
|
7
|
+
# blank, the block is executed with the object as its first argument. If an
|
8
|
+
# argument +dispatch+ was given and the object wasn't blank the method
|
9
|
+
# given by dispatch is called on the object. This is the same as
|
10
|
+
# foo.full?(&:bar) in the previous block form.
|
11
|
+
def full?(dispatch = nil, *args)
|
12
|
+
if blank?
|
13
|
+
obj = nil
|
14
|
+
#elsif Module === dispatch # TODO
|
15
|
+
# dispatch.found?(self)
|
16
|
+
elsif dispatch
|
17
|
+
obj = __send__(dispatch, *args)
|
18
|
+
obj = nil if obj.blank?
|
19
|
+
else
|
20
|
+
obj = self
|
21
|
+
end
|
22
|
+
if block_given? and obj
|
23
|
+
yield obj
|
24
|
+
else
|
25
|
+
obj
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class ::Object
|
31
|
+
include Full
|
32
|
+
end
|
33
|
+
end
|
data/lib/tins/xt/irb.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'irb'
|
2
|
+
|
3
|
+
module Tins
|
4
|
+
IRB = ::IRB
|
5
|
+
|
6
|
+
module ::IRB
|
7
|
+
def self.examine(binding = TOPLEVEL_BINDING)
|
8
|
+
setup nil
|
9
|
+
workspace = WorkSpace.new binding
|
10
|
+
irb = Irb.new workspace
|
11
|
+
@CONF[:MAIN_CONTEXT] = irb.context
|
12
|
+
catch(:IRB_EXIT) { irb.eval_input }
|
13
|
+
rescue Interrupt
|
14
|
+
exit
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'tins/xt/string_version'
|
2
|
+
|
3
|
+
class Object
|
4
|
+
if RUBY_VERSION.version >= '1.9'.version
|
5
|
+
def named(name, method, *args, &named_block)
|
6
|
+
extend Module.new {
|
7
|
+
define_method(name) do |*rest, &block|
|
8
|
+
block = named_block if named_block
|
9
|
+
__send__(method, *(args + rest), &block)
|
10
|
+
end
|
11
|
+
}
|
12
|
+
end
|
13
|
+
else
|
14
|
+
def named(name, method, *args, &block)
|
15
|
+
extend Module.new { define_method(name) { |*rest| __send__(method, *(args + rest), &block) } }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Module
|
21
|
+
if RUBY_VERSION.version >= '1.9'.version
|
22
|
+
def named(name, method, *args, &named_block)
|
23
|
+
include Module.new {
|
24
|
+
define_method(name) do |*rest, &block|
|
25
|
+
block = named_block if named_block
|
26
|
+
__send__(method, *(args + rest), &block)
|
27
|
+
end
|
28
|
+
}
|
29
|
+
end
|
30
|
+
else
|
31
|
+
def named(name, method, *args, &block)
|
32
|
+
include Module.new { define_method(name) { |*rest| __send__(method, *(args + rest), &block) } }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/tins/xt/null.rb
ADDED
data/lib/tins/xt/p.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'tempfile'
|
5
|
+
require 'tins/xt/file_binary'
|
6
|
+
|
7
|
+
module Tins
|
8
|
+
class TinsFileBinaryTest < Test::Unit::TestCase
|
9
|
+
def test_ascii_buffer_size
|
10
|
+
write_file do |file|
|
11
|
+
file.write "A" * 10 + "\x00"
|
12
|
+
assert_equal true, file.ascii?(:buffer_size => 10)
|
13
|
+
assert_equal true, File.ascii?(file.path, :buffer_size => 10)
|
14
|
+
assert_equal false, file.binary?(:buffer_size => 10)
|
15
|
+
assert_equal false, File.binary?(file.path, :buffer_size => 10)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_binary
|
20
|
+
write_file do |file|
|
21
|
+
file.write "A" * 69 + "\x01" * 31
|
22
|
+
assert_equal true, file.binary?
|
23
|
+
assert_equal true, File.binary?(file.path)
|
24
|
+
assert_equal false, file.ascii?
|
25
|
+
assert_equal false, File.ascii?(file.path)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_ascii_offset
|
30
|
+
write_file do |file|
|
31
|
+
file.write "\x01" * 31 + "A" * 70
|
32
|
+
assert_equal false, file.binary?(:offset => 1)
|
33
|
+
assert_equal false, File.binary?(file.path, :offset => 1)
|
34
|
+
assert_equal true, file.ascii?(:offset => 1)
|
35
|
+
assert_equal true, File.ascii?(file.path, :offset => 1)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_binary_zero
|
40
|
+
write_file do |file|
|
41
|
+
file.write "A" * 50 + "\0" + "A" * 49
|
42
|
+
assert_equal true, file.binary?
|
43
|
+
assert_equal true, File.binary?(file.path)
|
44
|
+
assert_equal false, file.ascii?
|
45
|
+
assert_equal false, File.ascii?(file.path)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_ascii
|
50
|
+
write_file do |file|
|
51
|
+
file.write "A" * 100
|
52
|
+
assert_equal false, file.binary?
|
53
|
+
assert_equal false, File.binary?(file.path)
|
54
|
+
assert_equal true, file.ascii?
|
55
|
+
assert_equal true, File.ascii?(file.path)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def write_file
|
62
|
+
File.open(File.join(Dir.tmpdir, "temp.#$$"), 'wb+') do |file|
|
63
|
+
yield file
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'tempfile'
|
5
|
+
require 'tins/lines_file'
|
6
|
+
|
7
|
+
module Tins
|
8
|
+
class TinsLinesFileTest < Test::Unit::TestCase
|
9
|
+
FILE = <<EOT
|
10
|
+
def foo
|
11
|
+
end
|
12
|
+
|
13
|
+
def bar
|
14
|
+
end
|
15
|
+
|
16
|
+
def baz
|
17
|
+
end
|
18
|
+
EOT
|
19
|
+
|
20
|
+
def test_instantiation
|
21
|
+
write_file do |file|
|
22
|
+
file.write FILE
|
23
|
+
file.rewind
|
24
|
+
assert_kind_of Tins::LinesFile, lf = Tins::LinesFile.for_file(file)
|
25
|
+
assert_equal [ "def foo\n", 1 ], [ lf.line, lf.line.line_number ]
|
26
|
+
assert_kind_of Tins::LinesFile, lf = Tins::LinesFile.for_filename(file.path)
|
27
|
+
assert_equal [ "def foo\n", 1 ], [ lf.line, lf.line.line_number ]
|
28
|
+
file.rewind
|
29
|
+
assert_kind_of Tins::LinesFile, lf = Tins::LinesFile.for_lines(file.readlines)
|
30
|
+
assert_equal [ "def foo\n", 1 ], [ lf.line, lf.line.line_number ]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_match
|
35
|
+
write_file do |file|
|
36
|
+
file.write FILE
|
37
|
+
file.rewind
|
38
|
+
lf = Tins::LinesFile.for_file(file)
|
39
|
+
assert_equal "def foo\n", lf.line
|
40
|
+
assert_equal 1, lf.line.line_number
|
41
|
+
assert_equal %w[foo], lf.match_forward(/def (\S+)/)
|
42
|
+
assert_equal "def foo\n", lf.line
|
43
|
+
assert_equal %w[foo], lf.match_forward(/def (\S+)/, true)
|
44
|
+
assert_equal 2, lf.line.line_number
|
45
|
+
assert_equal "end\n", lf.line
|
46
|
+
assert_equal %w[bar], lf.match_forward(/def (\S+)/, true)
|
47
|
+
assert_equal 5, lf.line.line_number
|
48
|
+
assert_equal %w[baz], lf.match_forward(/def (\S+)/, true)
|
49
|
+
assert_nil lf.match_forward(/def (\S+)/, true)
|
50
|
+
assert_equal "end\n", lf.line
|
51
|
+
assert_equal 8, lf.line.line_number
|
52
|
+
assert_equal %w[baz], lf.match_backward(/def (\S+)/)
|
53
|
+
assert_equal "def baz\n", lf.line
|
54
|
+
assert_equal 7, lf.line.line_number
|
55
|
+
assert_equal %w[baz], lf.match_backward(/def (\S+)/, true)
|
56
|
+
assert_equal "\n", lf.line
|
57
|
+
assert_equal 6, lf.line.line_number
|
58
|
+
assert_equal %w[bar], lf.match_backward(/def (\S+)/, true)
|
59
|
+
assert_equal %w[foo], lf.match_backward(/def (\S+)/, true)
|
60
|
+
assert_equal nil, lf.match_backward(/nada/, true)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_empty_and_not
|
65
|
+
lf = Tins::LinesFile.for_lines []
|
66
|
+
assert_equal true, lf.empty?
|
67
|
+
assert_equal 0, lf.last_line_number
|
68
|
+
assert_equal [], lf.to_a
|
69
|
+
lf = Tins::LinesFile.for_lines [ "foo\n" ]
|
70
|
+
assert_equal false, lf.empty?
|
71
|
+
assert_equal 1, lf.last_line_number
|
72
|
+
assert_equal [ "foo\n" ], lf.to_a
|
73
|
+
assert_equal [ "foo\n", 1 ], [ lf.line, lf.line.line_number ]
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def write_file
|
79
|
+
File.open(File.join(Dir.tmpdir, "temp.#$$"), 'wb+') do |file|
|
80
|
+
yield file
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|