rubyexts 0.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.
- data/CHANGELOG +2 -0
- data/LICENSE +20 -0
- data/README.textile +0 -0
- data/Rakefile +79 -0
- data/TODO.txt +6 -0
- data/lib/rubyexts.rb +102 -0
- data/lib/rubyexts/array.rb +20 -0
- data/lib/rubyexts/attribute.rb +151 -0
- data/lib/rubyexts/capture_io.rb +32 -0
- data/lib/rubyexts/class.rb +177 -0
- data/lib/rubyexts/colored_string.rb +103 -0
- data/lib/rubyexts/enumerable.rb +30 -0
- data/lib/rubyexts/file.rb +84 -0
- data/lib/rubyexts/hash.rb +180 -0
- data/lib/rubyexts/kernel.rb +91 -0
- data/lib/rubyexts/module.rb +53 -0
- data/lib/rubyexts/object.rb +56 -0
- data/lib/rubyexts/object_space.rb +16 -0
- data/lib/rubyexts/os.rb +89 -0
- data/lib/rubyexts/platform.rb +27 -0
- data/lib/rubyexts/random.rb +25 -0
- data/lib/rubyexts/string.rb +92 -0
- data/lib/rubyexts/time.rb +15 -0
- data/lib/rubyexts/time_dsl.rb +62 -0
- data/lib/rubyexts/try_dup.rb +43 -0
- data/lib/rubyexts/unique_array.rb +16 -0
- data/rubyexts.gemspec +36 -0
- data/script/spec +12 -0
- data/spec/rubyexts/array_spec.rb +19 -0
- data/spec/rubyexts/attribute_spec.rb +37 -0
- data/spec/rubyexts/class_spec.rb +1 -0
- data/spec/rubyexts/cli_spec.rb +0 -0
- data/spec/rubyexts/colored_string_spec.rb +9 -0
- data/spec/rubyexts/enumerable_spec.rb +52 -0
- data/spec/rubyexts/file_spec.rb +78 -0
- data/spec/rubyexts/hash_spec.rb +91 -0
- data/spec/rubyexts/kernel_spec.rb +9 -0
- data/spec/rubyexts/module_spec.rb +0 -0
- data/spec/rubyexts/object_space_spec.rb +17 -0
- data/spec/rubyexts/object_spec.rb +57 -0
- data/spec/rubyexts/os_spec.rb +121 -0
- data/spec/rubyexts/platform_spec.rb +0 -0
- data/spec/rubyexts/random_spec.rb +31 -0
- data/spec/rubyexts/string_spec.rb +23 -0
- data/spec/rubyexts/time_dsl_spec.rb +88 -0
- data/spec/rubyexts/time_spec.rb +11 -0
- data/spec/rubyexts/unique_array_spec.rb +0 -0
- data/spec/rubyexts_spec.rb +182 -0
- data/spec/spec.opts +5 -0
- data/spec/spec_helper.rb +16 -0
- metadata +104 -0
@@ -0,0 +1,43 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class TrueClass
|
4
|
+
def try_dup
|
5
|
+
self
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class FalseClass
|
10
|
+
def try_dup
|
11
|
+
self
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Symbol
|
16
|
+
def try_dup
|
17
|
+
self
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Object
|
22
|
+
def try_dup
|
23
|
+
self.dup
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class Numeric
|
28
|
+
def try_dup
|
29
|
+
self
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class NilClass
|
34
|
+
def try_dup
|
35
|
+
self
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class Module
|
40
|
+
def try_dup
|
41
|
+
self
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# Get is using it
|
4
|
+
# co treba udelat to pres observery?
|
5
|
+
module RubyExts
|
6
|
+
class UniqueArray < Array
|
7
|
+
def push(*args)
|
8
|
+
args.each do |arg|
|
9
|
+
unless self.include?(arg)
|
10
|
+
super(arg)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
alias_method :<<, :push
|
15
|
+
end
|
16
|
+
end
|
data/rubyexts.gemspec
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/env gem1.9 build
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
Dir[File.join(File.dirname(__FILE__), "vendor", "*")].each do |path|
|
5
|
+
if File.directory?(path) && Dir["#{path}/*"].empty?
|
6
|
+
warn "Dependency #{File.basename(path)} in vendor seems to be empty. Run git submodule init && git submodule update to checkout it."
|
7
|
+
elsif File.directory?(path) && File.directory?(File.join(path, "lib"))
|
8
|
+
$:.unshift File.join(path, "lib")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# Run thor package:gem or gem build rango.gemspec
|
13
|
+
# NOTE: we can't use require_relative because when we run gem build, it use eval for executing this file
|
14
|
+
require File.join(File.dirname(__FILE__), "lib", "rubyexts")
|
15
|
+
|
16
|
+
Gem::Specification.new do |s|
|
17
|
+
s.name = "rubyexts"
|
18
|
+
s.version = RubyExts::VERSION
|
19
|
+
s.authors = ["Jakub Šťastný aka Botanicus"]
|
20
|
+
s.homepage = "http://github.com/botanicus/rubyexts"
|
21
|
+
s.summary = "Tiny library with Ruby extensions"
|
22
|
+
s.description = "" # TODO: long description
|
23
|
+
s.cert_chain = nil
|
24
|
+
s.email = ["knava.bestvinensis", "gmail.com"].join("@")
|
25
|
+
s.has_rdoc = true
|
26
|
+
|
27
|
+
# files
|
28
|
+
s.files = Dir.glob("**/*") - Dir.glob("pkg/*")
|
29
|
+
s.require_paths = ["lib"]
|
30
|
+
|
31
|
+
# Ruby version
|
32
|
+
s.required_ruby_version = ::Gem::Requirement.new(">= 1.9.1")
|
33
|
+
|
34
|
+
# RubyForge
|
35
|
+
s.rubyforge_project = "rubyexts"
|
36
|
+
end
|
data/script/spec
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby1.9
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
Dir[File.join(File.dirname(__FILE__), "..", "vendor", "*")].each do |path|
|
5
|
+
if File.directory?(path) && Dir["#{path}/*"].empty?
|
6
|
+
warn "Dependency #{File.basename(path)} in vendor seems to be empty. Run git submodule init && git submodule update to checkout it."
|
7
|
+
elsif File.directory?(path) && File.directory?(File.join(path, "lib"))
|
8
|
+
$:.unshift File.join(path, "lib")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
load File.expand_path(File.join(File.dirname(__FILE__), "..", "vendor", "rspec", "bin", "spec"))
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative "../../lib/rubyexts/array"
|
4
|
+
|
5
|
+
describe Array do
|
6
|
+
describe "#only" do
|
7
|
+
it "should returns the only item in array" do
|
8
|
+
[:first].only.should eql(:first)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should raise IndexError if the array has more items" do
|
12
|
+
-> { [1, 2].only }.should raise_error(IndexError)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should raise IndexError if the array is empty" do
|
16
|
+
-> { Array.new.only }.should raise_error(IndexError)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative "../../lib/rubyexts/attribute"
|
4
|
+
|
5
|
+
describe AttributeMixin do
|
6
|
+
describe "#private_alias" do
|
7
|
+
before(:each) do
|
8
|
+
@class = Class.new { private_alias :class }
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should creates __alias__ of given method" do
|
12
|
+
@class.new.tap do |instance|
|
13
|
+
instance.class.should eql(instance.send(:__class__))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should be private" do
|
18
|
+
@class.private_instance_methods.should include(:__class__)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#attribute" do
|
23
|
+
it
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#hattribute" do
|
27
|
+
it
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#questionable" do
|
31
|
+
it
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#default_hattribute_names" do
|
35
|
+
it
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# TODO: take it from Rails
|
File without changes
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative "../../lib/rubyexts/enumerable"
|
4
|
+
|
5
|
+
describe Enumerable do
|
6
|
+
describe "#none?" do
|
7
|
+
describe "withtout block" do
|
8
|
+
it "should be true for empty collections " do
|
9
|
+
Array.new.should be_none
|
10
|
+
Hash.new.should be_none
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should returns true for collections with just nils and false" do
|
14
|
+
[nil].should be_none
|
15
|
+
[false].should be_none
|
16
|
+
[false, nil].should be_none
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should returns false if collections contains some objects" do
|
20
|
+
[1].should_not be_none
|
21
|
+
{one: 1, two: 2}.should_not be_none
|
22
|
+
{key: nil, other: false}.should_not be_none
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "with block" do
|
27
|
+
describe "for array" do
|
28
|
+
it "should returns false if all iteractions returns true" do
|
29
|
+
array = Array.new(3) { Array.new }
|
30
|
+
array.none? { |item| item.empty? }.should be_false
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should returns true if all iteractions returns false" do
|
34
|
+
array = Array.new(3) { [1] }
|
35
|
+
array.none? { |item| item.empty? }.should be_true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "for hash" do
|
40
|
+
it "should returns false if all iteractions returns true" do
|
41
|
+
hash = {key: Array.new, another: Hash.new, last: Array.new}
|
42
|
+
hash.none? { |key, value| value.empty? }.should be_false
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should returns true if all iteractions returns false" do
|
46
|
+
hash = {key: [1], another: [2], last: [nil]}
|
47
|
+
hash.none? { |item| item.empty? }.should be_true
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative "../../lib/rubyexts/file"
|
4
|
+
|
5
|
+
# TODO: don't test everything in $HOME
|
6
|
+
describe File do
|
7
|
+
before(:each) do
|
8
|
+
@token = rand(360 ** 50).to_s(36)
|
9
|
+
@path = File.join("~", @token)
|
10
|
+
end
|
11
|
+
|
12
|
+
after(:each) do
|
13
|
+
FileUtils.rm(File.expand_path(@path), force: true)
|
14
|
+
FileUtils.rm(File.expand_path("#{@path}.rw"), force: true)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ".puts" do
|
18
|
+
it "should write each argument as a line" do
|
19
|
+
path = File.puts(@path, "first", "second")
|
20
|
+
File.read(path).should eql("first\nsecond\n")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe ".print" do
|
25
|
+
it "should write all arguments without any extra whitespaces" do
|
26
|
+
path = File.print(@path, "first", "second")
|
27
|
+
File.read(path).should eql("firstsecond")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe ".append" do
|
32
|
+
it "should works like File.puts for new files" do
|
33
|
+
path = File.append(@path, "first", "second")
|
34
|
+
File.read(path).should eql("first\nsecond\n")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should append all arguments separated by \\n" do
|
38
|
+
File.puts(@path, "first")
|
39
|
+
path = File.append(@path, "second")
|
40
|
+
File.read(path).should eql("first\nsecond\n")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe ".add" do
|
45
|
+
it "should works like File.print for new files" do
|
46
|
+
path = File.add(@path, "first", "second")
|
47
|
+
File.read(path).should eql("firstsecond")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should append all arguments without any extra whitespaces" do
|
51
|
+
File.print(@path, "first")
|
52
|
+
path = File.add(@path, "second")
|
53
|
+
File.read(path).should eql("firstsecond")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe ".write" do
|
58
|
+
it "should expand file path" do
|
59
|
+
File.write(:puts, "w", @path, "content")
|
60
|
+
File.exist?(File.expand_path(@path)).should be_true
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should returns expanded file path" do
|
64
|
+
File.write(:puts, "w", @path, "test").should eql(File.expand_path(@path))
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should use first argument as method sended to file" do
|
68
|
+
first = File.puts("#{@path}.rw", "first", "second")
|
69
|
+
second = File.write(:puts, "w", @path, "first", "second")
|
70
|
+
File.read(first).should eql(File.read(second))
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should use 3..n arguments as arguments of given method" do
|
74
|
+
path = File.write(:printf, "w", @path, "%d %04x", 123, 123)
|
75
|
+
File.read(path).should eql("123 007b")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative "../../lib/rubyexts/hash"
|
4
|
+
|
5
|
+
describe Hash do
|
6
|
+
before(:each) do
|
7
|
+
@hash = {"one" => 1, "two" => {"inner" => 3}}
|
8
|
+
@one = {class: "post", id: 12}
|
9
|
+
@two = {class: "post", id: 14}
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#symbolize_keys" do
|
13
|
+
it "should transform keys into symbols" do
|
14
|
+
@hash.symbolize_keys.should eql(one: 1, two: {"inner" => 3})
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#symbolize_keys!" do
|
19
|
+
it "should transform keys into symbols" do
|
20
|
+
@hash.symbolize_keys!
|
21
|
+
@hash.should eql(one: 1, two: {"inner" => 3})
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#deep_symbolize_keys" do
|
26
|
+
it "should transform keys into symbols" do
|
27
|
+
@hash.deep_symbolize_keys.should eql(one: 1, two: {inner: 3})
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#deep_symbolize_keys!" do
|
32
|
+
it "should transform keys into symbols" do
|
33
|
+
@hash.deep_symbolize_keys!
|
34
|
+
@hash.should eql(one: 1, two: {inner: 3})
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#extract!" do
|
39
|
+
it "should returns just values for given keys" do
|
40
|
+
hash = {foo: "bar"}.merge(@one)
|
41
|
+
hash.extract!(:id, :foo).should eql([12, "bar"])
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "#to_html_attrs" do
|
46
|
+
it "should convert hash into URL format" do
|
47
|
+
@one.to_html_attrs.should eql("class='post' id='12'")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "#to_url_attrs" do
|
52
|
+
it "should convert hash into URL format" do
|
53
|
+
@one.to_url_attrs.should eql("class=post&id=12")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#reverse_merge" do
|
58
|
+
it "should returns result of merge the origin hash with first argument" do
|
59
|
+
@one.reverse_merge(@two).should eql(class: "post", id: 12)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "#reverse_merge!" do
|
64
|
+
it "should replace hash by result of merge with first argument which" do
|
65
|
+
@one.reverse_merge!(@two)
|
66
|
+
@one.should eql(class: "post", id: 12)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#get" do
|
71
|
+
before(:each) do
|
72
|
+
@hash = {inner: @one}
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should raise argument error any argument given" do
|
76
|
+
-> { @hash.get }.should raise_error(ArgumentError)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should get item if the path exist" do
|
80
|
+
@hash.get(:inner, :class).should eql("post")
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should returns nil if the path doesn't exist" do
|
84
|
+
@hash.get(:inner, :foobar).should be_nil
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should raise index error if trying to work with non-hash-like object like hash" do
|
88
|
+
-> { @hash.get(:inner, :class, :inner) }.should raise_error(IndexError)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
File without changes
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative "../../lib/rubyexts/object_space"
|
4
|
+
|
5
|
+
describe ObjectSpace do
|
6
|
+
describe "#classes" do
|
7
|
+
it "should returns the only item in array" do
|
8
|
+
-> { Class.new }.should change { ObjectSpace.classes.length }.by(1)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should returns the only item in array" do
|
12
|
+
ObjectSpace.classes.each do |klass|
|
13
|
+
klass.should be_kind_of(Class)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|