libciel 0.0.0.2 → 0.0.0.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/LICENSE.txt +1 -1
- data/README.md +5 -1
- data/lib/array/permutation2.rb +20 -0
- data/lib/dbi/connect_transaction.rb +27 -0
- data/lib/enumerable/squeeze.rb +16 -0
- data/lib/enumerator/lazy/squeeze.rb +20 -0
- data/lib/hash/fetch_nested.rb +11 -0
- data/lib/kernel/zip.rb +7 -0
- data/lib/libciel.rb +12 -133
- data/lib/object/extract.rb +10 -0
- data/lib/string/rotate.rb +10 -0
- data/spec/libciel_spec.rb +36 -20
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4fa58b86ead83f8e76fad4c6c059365dcee1c1c2
|
4
|
+
data.tar.gz: 6554e526034c197a4ede4383e89326891f2b0d04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a65062be26d7329516af9e9da16b041e130e68bbd2573fb5f6c433b1284e47e99e1d402f58973f3cb58b6f15a7a2af5b31350a4e7d00d5fe9f1a08c1db4a1c35
|
7
|
+
data.tar.gz: c0a1048afdc5b940e230ce6204c74970e7e580145df124bc19da37784a7bf596c1365c9e5372ddd2c0c9e4f6f1adfb13caaf6a2f08b2f481f29fb5e3532853d1
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,10 @@
|
|
1
1
|
# ChangeLog
|
2
2
|
|
3
|
+
## 0.0.0.3 (2014 Jan 24)
|
4
|
+
- Refined source structure.
|
5
|
+
- Kernel::zip doesn't modify original Array anymore.
|
6
|
+
- Removed Hash#patch, which is actually the same as Hash#merge. Thank you smackesey.
|
7
|
+
- Dropped Hash#exists_rec? and introduced Hash#fetch_nested.
|
8
|
+
|
3
9
|
## 0.0.0.2 (2014 Jan 22)
|
4
10
|
- Initial release
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -9,6 +9,10 @@
|
|
9
9
|
* 2.2.1 and 2.2.2 are not working.
|
10
10
|
* (Possibly) ironruby / macruby / topaz etc
|
11
11
|
|
12
|
-
##
|
12
|
+
## Note
|
13
13
|
* **Ruby 2.0+ cannot handle dbd-sqlite3.**
|
14
14
|
* jruby cannot handle dbi.
|
15
|
+
|
16
|
+
## Warning
|
17
|
+
* This library is experimental. Incompatible API change might happen. You might want to include the source directly.
|
18
|
+
* None of my projects (cTouch (builder) / yomebrowser / picrawler) don't depend on this gem.
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Array
|
2
|
+
#Enumerates permutation of Array.
|
3
|
+
#Unlike Array#permutation, there are no duplicates in generated permutations.
|
4
|
+
#Instead, elements must be comparable.
|
5
|
+
def permutation2(n=self.size)
|
6
|
+
return to_enum(:permutation2,n) unless block_given?
|
7
|
+
return if n<0||self.size<n
|
8
|
+
a=self.sort
|
9
|
+
yield a.dup[0,n]
|
10
|
+
loop{
|
11
|
+
a=a[0,n]+a[n..-1].reverse
|
12
|
+
k=(a.size-2).downto(0).find{|i|a[i]<a[i+1]}
|
13
|
+
break if !k
|
14
|
+
l=(a.size-1).downto(k+1).find{|i|a[k]<a[i]}
|
15
|
+
a[k],a[l]=a[l],a[k]
|
16
|
+
a=a[0,k+1]+a[k+1..-1].reverse
|
17
|
+
yield a.dup[0,n]
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module DBI
|
2
|
+
#connect-transaction-disconnect triplet.
|
3
|
+
# To use this method, you need to require dbi before requiring libciel.
|
4
|
+
def self.connect_transaction(driver_url, user=nil, auth=nil, params=nil, &block)
|
5
|
+
x=connect(driver_url, user, auth, params)
|
6
|
+
begin
|
7
|
+
x.transaction(&block)
|
8
|
+
ensure
|
9
|
+
x.disconnect
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class DatabaseHandle
|
14
|
+
#execute-map,count-finish triplet.
|
15
|
+
# To use this method, you need to require dbi before requiring libciel.
|
16
|
+
def execute_immediate(stmt,*bindvars,&block)
|
17
|
+
sth=execute(stmt,*bindvars)
|
18
|
+
ret=0
|
19
|
+
begin
|
20
|
+
if block then ret=sth.map(&block).count end
|
21
|
+
ensure
|
22
|
+
sth.finish
|
23
|
+
end
|
24
|
+
ret
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Enumerable
|
2
|
+
#Squeezes the same element. This behaves like C++ unique().
|
3
|
+
#To get the similar result to Array#uniq, you need to sort it prior.
|
4
|
+
# Calculation order is O(n).
|
5
|
+
def squeeze
|
6
|
+
r=[]
|
7
|
+
cur=nil
|
8
|
+
self.each{|e|
|
9
|
+
if r.empty?||cur!=e
|
10
|
+
r<<e
|
11
|
+
cur=e
|
12
|
+
end
|
13
|
+
}
|
14
|
+
r
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Enumerator
|
2
|
+
begin
|
3
|
+
Lazy.class_eval{
|
4
|
+
#Enumerator.Lazy version of Enumerable#squeeze.
|
5
|
+
#Enumerator.Lazy is evaluated as Enumerable::Lazy on Ruby 1.9 + enumerable/lazy, otherwise Enumerator::Lazy.
|
6
|
+
# To use this method, on Ruby <2.0, you need to require enumerable/lazy or backports before requiring libciel.
|
7
|
+
def squeeze
|
8
|
+
first=true
|
9
|
+
cur=nil
|
10
|
+
self.class.new(self){|y,v|
|
11
|
+
if first||cur!=v
|
12
|
+
y<<v
|
13
|
+
first=false
|
14
|
+
cur=v
|
15
|
+
end
|
16
|
+
}
|
17
|
+
end
|
18
|
+
}
|
19
|
+
rescue NameError=>e; end
|
20
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class Hash
|
2
|
+
#nil safe version of Hash#[].
|
3
|
+
# h.fetch_nested(*['hello','world']) is basically the same as h['hello'].try.send(:[],'world').
|
4
|
+
def fetch_nested(*keys)
|
5
|
+
begin
|
6
|
+
keys.reduce(self){|accum, k| accum.fetch(k)}
|
7
|
+
rescue (RUBY_VERSION<'1.9' ? IndexError : KeyError)
|
8
|
+
block_given? ? yield(*keys) : nil
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/kernel/zip.rb
ADDED
data/lib/libciel.rb
CHANGED
@@ -1,136 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
def extract(h,overwrite=false)
|
9
|
-
h.each{|k,v|
|
10
|
-
if overwrite || !self.instance_variable_defined?('@'+k) then
|
11
|
-
self.instance_variable_set('@'+k,v) #k should always be String
|
12
|
-
end
|
13
|
-
}
|
14
|
-
end
|
15
|
-
end
|
1
|
+
require File.expand_path(File.dirname(__FILE__)+'/array/permutation2')
|
2
|
+
require File.expand_path(File.dirname(__FILE__)+'/enumerable/squeeze')
|
3
|
+
require File.expand_path(File.dirname(__FILE__)+'/enumerator/lazy/squeeze')
|
4
|
+
require File.expand_path(File.dirname(__FILE__)+'/hash/fetch_nested')
|
5
|
+
require File.expand_path(File.dirname(__FILE__)+'/kernel/zip')
|
6
|
+
require File.expand_path(File.dirname(__FILE__)+'/object/extract')
|
7
|
+
require File.expand_path(File.dirname(__FILE__)+'/string/rotate')
|
16
8
|
|
17
|
-
|
18
|
-
|
19
|
-
def zip(a) a.shift.zip(*a) end
|
20
|
-
end
|
21
|
-
|
22
|
-
module Enumerable
|
23
|
-
#Squeezes the same element. This behaves like C++ unique().
|
24
|
-
#To get the similar result to Array#uniq, you need to sort it prior.
|
25
|
-
# Calculation order is O(n).
|
26
|
-
def squeeze
|
27
|
-
r=[]
|
28
|
-
cur=nil
|
29
|
-
self.each{|e|
|
30
|
-
if r.empty?||cur!=e
|
31
|
-
r<<e
|
32
|
-
cur=e
|
33
|
-
end
|
34
|
-
}
|
35
|
-
r
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
class Enumerator
|
40
|
-
begin
|
41
|
-
Lazy.class_eval{
|
42
|
-
#Enumerator.Lazy version of Enumerable#squeeze.
|
43
|
-
#Enumerator.Lazy is evaluated as Enumerable::Lazy on Ruby 1.9 + enumerable/lazy, otherwise Enumerator::Lazy.
|
44
|
-
# To use this method, on Ruby <2.0, you need to require enumerable/lazy or backports before requiring libciel.
|
45
|
-
def squeeze
|
46
|
-
first=true
|
47
|
-
cur=nil
|
48
|
-
self.class.new(self){|y,v|
|
49
|
-
if first||cur!=v
|
50
|
-
y<<v
|
51
|
-
first=false
|
52
|
-
cur=v
|
53
|
-
end
|
54
|
-
}
|
55
|
-
end
|
56
|
-
}
|
57
|
-
rescue NameError=>e; end
|
58
|
-
end
|
9
|
+
#DBI stuff will be dropped in the future (maybe)
|
10
|
+
require File.expand_path(File.dirname(__FILE__)+'/dbi/connect_transaction')
|
59
11
|
|
60
|
-
|
61
|
-
#
|
62
|
-
|
63
|
-
#Instead, elements must be comparable.
|
64
|
-
def permutation2(n=self.size)
|
65
|
-
return to_enum(:permutation2,n) unless block_given?
|
66
|
-
return if n<0||self.size<n
|
67
|
-
a=self.sort
|
68
|
-
yield a.dup[0,n]
|
69
|
-
loop{
|
70
|
-
a=a[0,n]+a[n..-1].reverse
|
71
|
-
k=(a.size-2).downto(0).find{|i|a[i]<a[i+1]}
|
72
|
-
break if !k
|
73
|
-
l=(a.size-1).downto(k+1).find{|i|a[k]<a[i]}
|
74
|
-
a[k],a[l]=a[l],a[k]
|
75
|
-
a=a[0,k+1]+a[k+1..-1].reverse
|
76
|
-
yield a.dup[0,n]
|
77
|
-
}
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
class String
|
82
|
-
#Rotate string to the left with count.
|
83
|
-
#Specifying negative number indicates rotation to the right.
|
84
|
-
def rotate(count=1)
|
85
|
-
count+=self.length if count<0
|
86
|
-
self.slice(count,self.length-count)+self.slice(0,count)
|
87
|
-
end
|
88
|
-
#Destructive version of String#rotate
|
89
|
-
def rotate!(count=1) self.replace(self.rotate(count)) end
|
90
|
-
end
|
91
|
-
|
92
|
-
class Hash
|
93
|
-
#nil safe version of Hash#[].
|
94
|
-
# h.exists_rec?(['hello','world']) is the same as h['hello'].try.send(:[],'world').
|
95
|
-
def exists_rec?(a)
|
96
|
-
#if a.length<1 then return false
|
97
|
-
if !self.include?(a[0]) then return nil end #if not found
|
98
|
-
if a.length==1 then return self[a[0]] end #if found and last
|
99
|
-
if !self[a[0]].is_a?(Hash) then return nil end #if not last and child not hash
|
100
|
-
return self[a[0]].exists_rec?(a[1..-1]) #check child
|
101
|
-
end
|
102
|
-
#Returns self.dup with overwriting par.
|
103
|
-
def patch(par)
|
104
|
-
h=self.dup
|
105
|
-
par.each{|k,v|h[k]=v}
|
106
|
-
return h
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
module DBI
|
111
|
-
#connect-transaction-disconnect triplet.
|
112
|
-
# To use this method, you need to require dbi before requiring libciel.
|
113
|
-
def self.connect_transaction(driver_url, user=nil, auth=nil, params=nil, &block)
|
114
|
-
x=connect(driver_url, user, auth, params)
|
115
|
-
begin
|
116
|
-
x.transaction(&block)
|
117
|
-
ensure
|
118
|
-
x.disconnect
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
class DatabaseHandle
|
123
|
-
#execute-map,count-finish triplet.
|
124
|
-
# To use this method, you need to require dbi before requiring libciel.
|
125
|
-
def execute_immediate(stmt,*bindvars,&block)
|
126
|
-
sth=execute(stmt,*bindvars)
|
127
|
-
ret=0
|
128
|
-
begin
|
129
|
-
if block then ret=sth.map(&block).count end
|
130
|
-
ensure
|
131
|
-
sth.finish
|
132
|
-
end
|
133
|
-
ret
|
134
|
-
end
|
135
|
-
end
|
12
|
+
module LibCiel
|
13
|
+
#Version string
|
14
|
+
VERSION='0.0.0.3'
|
136
15
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class Object
|
2
|
+
#PHPic extract(). Hash will be injected into self as instance variables (@var).
|
3
|
+
def extract(h,overwrite=false)
|
4
|
+
h.each{|k,v|
|
5
|
+
if overwrite || !self.instance_variable_defined?('@'+k) then
|
6
|
+
self.instance_variable_set('@'+k,v) #k should always be String
|
7
|
+
end
|
8
|
+
}
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class String
|
2
|
+
#Rotate string to the left with count.
|
3
|
+
#Specifying negative number indicates rotation to the right.
|
4
|
+
def rotate(count=1)
|
5
|
+
count+=self.length if count<0
|
6
|
+
self.slice(count,self.length-count)+self.slice(0,count)
|
7
|
+
end
|
8
|
+
#Destructive version of String#rotate
|
9
|
+
def rotate!(count=1) self.replace(self.rotate(count)) end
|
10
|
+
end
|
data/spec/libciel_spec.rb
CHANGED
@@ -11,27 +11,50 @@ describe Object do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
describe Kernel do
|
14
|
-
|
15
|
-
|
14
|
+
context 'zip' do
|
15
|
+
specify 'basic case' do
|
16
|
+
a=[[1,2],[3,4]]
|
17
|
+
zip(a).should eq [[1,3],[2,4]]
|
18
|
+
a.transpose.should eq [[1,3],[2,4]]
|
19
|
+
end
|
20
|
+
specify 'awkward case' do
|
21
|
+
a=[[1,2,3],[4,5]]
|
22
|
+
zip(a).should eq [[1, 4],[2, 5],[3, nil]]
|
23
|
+
lambda{a.transpose}.should raise_error
|
24
|
+
end
|
16
25
|
end
|
17
26
|
end
|
18
27
|
|
19
28
|
describe Enumerable do
|
20
|
-
|
21
|
-
|
29
|
+
context 'squeeze' do
|
30
|
+
specify 'example' do
|
31
|
+
[1,2,2,3,3,2,1].squeeze.should eq [1,2,3,2,1]
|
32
|
+
end
|
33
|
+
specify 'sort.squeeze is eq uniq' do
|
34
|
+
[1,2,2,3,3,2,1].sort.squeeze.should eq [1,2,3]
|
35
|
+
end
|
22
36
|
end
|
23
37
|
end
|
24
38
|
|
25
39
|
describe Enumerator::Lazy do
|
26
|
-
specify 'squeeze' do
|
40
|
+
specify 'squeeze enum' do
|
27
41
|
[1,2,2,3,3,2,1].lazy.squeeze.select(&:odd?).to_a.should eq [1,3,1]
|
28
42
|
end
|
29
43
|
end
|
30
44
|
|
31
45
|
describe Array do
|
32
|
-
|
33
|
-
|
34
|
-
|
46
|
+
context 'permutation2' do
|
47
|
+
specify 'example' do
|
48
|
+
[1,1,2,2,3].permutation2(2).to_a.should eq [
|
49
|
+
[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2]
|
50
|
+
]
|
51
|
+
end
|
52
|
+
it 'is not eq permutation.to_a' do
|
53
|
+
[1,1,2,3].permutation2.to_a.should_not eq [1,1,2,3].permutation.to_a
|
54
|
+
end
|
55
|
+
it 'is eq permutation.to_a.uniq' do
|
56
|
+
[1,1,2,3].permutation2.to_a.should eq [1,1,2,3].permutation.to_a.uniq
|
57
|
+
end
|
35
58
|
end
|
36
59
|
end
|
37
60
|
|
@@ -64,8 +87,8 @@ describe Hash do
|
|
64
87
|
specify 'usual search' do
|
65
88
|
h['hello']['world'].should eq 42
|
66
89
|
end
|
67
|
-
specify '
|
68
|
-
h.
|
90
|
+
specify 'fetch_nested' do
|
91
|
+
h.fetch_nested(*['hello','world']).should eq 42
|
69
92
|
end
|
70
93
|
end
|
71
94
|
context 'dangerous case' do
|
@@ -73,24 +96,17 @@ describe Hash do
|
|
73
96
|
specify 'usual search' do
|
74
97
|
lambda{h['hello']['world']}.should raise_error
|
75
98
|
end
|
76
|
-
specify '
|
77
|
-
h.
|
99
|
+
specify 'fetch_nested' do
|
100
|
+
h.fetch_nested(*['hello','world']).should eq nil
|
78
101
|
end
|
79
102
|
end
|
80
|
-
specify 'patch' do
|
81
|
-
h={'hello'=>1,'world'=>2}
|
82
|
-
h_dup=h.dup
|
83
|
-
answer={'hello'=>1,'world'=>42}
|
84
|
-
h.patch({'world'=>42}).should eq answer
|
85
|
-
h_dup.should eq h
|
86
|
-
end
|
87
103
|
end
|
88
104
|
|
89
105
|
describe DBI do
|
90
106
|
specify 'connect and execute' do
|
91
107
|
pending 'dbd-sqlite3 seems stopped working from Ruby 2.0' if RUBY_VERSION>='2.0'
|
92
108
|
pending 'dbd-sqlite3 is not supported by jruby' if defined?(RUBY_ENGINE)&&RUBY_ENGINE=='jruby'
|
93
|
-
DBI.
|
109
|
+
DBI.connect_transaction('DBI:SQLite3:'+File.dirname(__FILE__)+'/test.sqlite',nil,nil,'AutoCommit'=>false){|dbi|
|
94
110
|
#dbi.execute_immediate("create table test ( message varchar )")
|
95
111
|
dbi.execute_immediate("select * from test"){|e|
|
96
112
|
e.should eq ['hello']
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libciel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.0.
|
4
|
+
version: 0.0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- cielavenir
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -67,7 +67,15 @@ files:
|
|
67
67
|
- LICENSE.txt
|
68
68
|
- README.md
|
69
69
|
- Rakefile
|
70
|
+
- lib/array/permutation2.rb
|
71
|
+
- lib/dbi/connect_transaction.rb
|
72
|
+
- lib/enumerable/squeeze.rb
|
73
|
+
- lib/enumerator/lazy/squeeze.rb
|
74
|
+
- lib/hash/fetch_nested.rb
|
75
|
+
- lib/kernel/zip.rb
|
70
76
|
- lib/libciel.rb
|
77
|
+
- lib/object/extract.rb
|
78
|
+
- lib/string/rotate.rb
|
71
79
|
- libciel.gemspec
|
72
80
|
- spec/libciel_spec.rb
|
73
81
|
- spec/spec_helper.rb
|