io-access_lazy 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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +4 -0
- data/README.md +54 -0
- data/Rakefile +1 -0
- data/hoge.txt +0 -0
- data/io-access_lazy.gemspec +23 -0
- data/lib/io/access_lazy.rb +87 -0
- data/lib/io/access_lazy/version.rb +5 -0
- data/spec/io-access_lazy_spec.rb +43 -0
- data/spec/spec_helper.rb +4 -0
- metadata +86 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 09661a38935bbfd6267f9aa1ddad688585061cd5
|
4
|
+
data.tar.gz: acc5667311824cc15a131f1ec8efeb97bcbd5293
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 30c252855ea8e0dcb5248cb9d69d18e09daf0d1d506726eb07fa4035bbafd53581fa7090b76aed013a55dfad47566667365a9a1ec89934a3c072c591f1fdb653
|
7
|
+
data.tar.gz: 690c244494384b5bf419ae4445ed2260ca52d5c267b4b082f1d95e276d25d9d556a06d742a041490626632689f032a9e09a47a04dde3ab69426c43859742933d
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
data/README.md
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# IO::AccessLazy
|
2
|
+
|
3
|
+
* <del>さいふおとした。<strong>泣いてる</strong>。</del>
|
4
|
+
* <ins>回収されたらしい。世の中捨てたもんじゃない ヾ(〃><)ノ゙☆</ins>
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
gem 'io-access_lazy'
|
11
|
+
|
12
|
+
And then execute:
|
13
|
+
|
14
|
+
$ bundle
|
15
|
+
|
16
|
+
Or install it yourself as:
|
17
|
+
|
18
|
+
$ gem install io-access_lazy
|
19
|
+
|
20
|
+
## 日本語でおk (Japanese)
|
21
|
+
|
22
|
+
* IOオブジェクトから任意の行を遅延して取得します
|
23
|
+
* シェルスクリプティングだと `head(1)` とか `tail(1)` を使ってやるイメージです
|
24
|
+
* **タブンネ**
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
fp = open("hoge.txt", 'r')
|
30
|
+
fp.read
|
31
|
+
# => "A
|
32
|
+
# B
|
33
|
+
# C
|
34
|
+
# D
|
35
|
+
# E
|
36
|
+
# F
|
37
|
+
# G
|
38
|
+
# H"
|
39
|
+
fp_lazy = IO::AccessLazy.new(fp)
|
40
|
+
line5 = fp_lazy[5]
|
41
|
+
# => "F"
|
42
|
+
line2_6 = fp_lazy[2..4]
|
43
|
+
# => ["C\n", "D\n", "E\n"]
|
44
|
+
line3_l = fp_lazy[3..-1]
|
45
|
+
# => ["D\n", "E\n", "F\n", "G\n", "H\n"]
|
46
|
+
```
|
47
|
+
|
48
|
+
## Contributing
|
49
|
+
|
50
|
+
1. Fork it
|
51
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
52
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
53
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
54
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/hoge.txt
ADDED
File without changes
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'io/access_lazy/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "io-access_lazy"
|
8
|
+
spec.version = IO::AccessLazy::VERSION
|
9
|
+
spec.authors = ["USAMI Kenta"]
|
10
|
+
spec.email = ["tadsan@zonu.me"]
|
11
|
+
spec.description = %q{This gem provide lazy access method like array to IO object.}
|
12
|
+
spec.summary = %q{NURUPO}
|
13
|
+
spec.homepage = "http://dt.zonu.me/"
|
14
|
+
spec.license = "GPL Version 3 or NYSL"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'io/access_lazy/version'
|
2
|
+
|
3
|
+
# a class of the Ruby core library
|
4
|
+
class IO; end
|
5
|
+
|
6
|
+
# AccessLazy class
|
7
|
+
class IO::AccessLazy
|
8
|
+
# @param [IO] io
|
9
|
+
# @param [Hash] options
|
10
|
+
def initialize (io, options={})
|
11
|
+
set_io! (io)
|
12
|
+
set_option! (options)
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :io
|
16
|
+
attr_reader :seek_method
|
17
|
+
|
18
|
+
# @param [Fixnum,Range] index
|
19
|
+
# @param [Boolean] cache
|
20
|
+
def [] (index, cache=nil)
|
21
|
+
case index
|
22
|
+
when Fixnum
|
23
|
+
io_init! unless cache
|
24
|
+
seek(index)
|
25
|
+
when Range
|
26
|
+
unless check_range(index)
|
27
|
+
raise ArgumentError, 'require IO object or String'
|
28
|
+
end
|
29
|
+
io_init!
|
30
|
+
index.map{|i| self[i, true] }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# @param [Fixnum] index
|
35
|
+
# @return [String]
|
36
|
+
def seek (index)
|
37
|
+
@point.upto(index){ |i|
|
38
|
+
tmp = io.gets
|
39
|
+
@point += 1
|
40
|
+
return tmp if index == i
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
# @param [IO] io
|
45
|
+
def set_io! (io)
|
46
|
+
case io
|
47
|
+
when IO
|
48
|
+
@io = io
|
49
|
+
when String
|
50
|
+
@io = StringIO.new(io)
|
51
|
+
else
|
52
|
+
raise ArgumentError, 'index is invalid range'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# @param [Hash] options
|
57
|
+
def set_option! (options)
|
58
|
+
# Set IO seek method
|
59
|
+
@seek_method = options[:seek_method] || :gets
|
60
|
+
end
|
61
|
+
|
62
|
+
# @note Side-Effect!
|
63
|
+
def cache_init!
|
64
|
+
@cache = []
|
65
|
+
return true
|
66
|
+
end
|
67
|
+
|
68
|
+
# @note Side-Effect!
|
69
|
+
def io_init!
|
70
|
+
@point = io.rewind
|
71
|
+
return true
|
72
|
+
end
|
73
|
+
|
74
|
+
# @param [Range] range
|
75
|
+
# @return [Boolean]
|
76
|
+
# @note This is a alias method.
|
77
|
+
# @see AccessLazy.check_range
|
78
|
+
def check_range (range); self.class.check_range(range); end
|
79
|
+
|
80
|
+
# @param [Range] range
|
81
|
+
# @return [Boolean]
|
82
|
+
def self.check_range (range)
|
83
|
+
lower = range.begin
|
84
|
+
upper = range.end
|
85
|
+
(lower >= 0) && ((lower <= upper) && (upper >= 0) || (upper == -1))
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe IO::AccessLazy do
|
4
|
+
describe '#[]' do
|
5
|
+
let(:sample){ str = <<-EOT
|
6
|
+
A
|
7
|
+
B
|
8
|
+
C
|
9
|
+
D
|
10
|
+
E
|
11
|
+
F
|
12
|
+
G
|
13
|
+
EOT
|
14
|
+
return IO::AccessLazy.new(str)
|
15
|
+
}
|
16
|
+
it{ expect(sample).to be_a IO::AccessLazy }
|
17
|
+
it{ expect(sample[0]).to eq "A\n" }
|
18
|
+
it{ expect(sample[2..3]).to eq ["C\n", "D\n"] }
|
19
|
+
it{ expect(sample[4..-1]).to eq ["E\n", "F\n", "G\n"] }
|
20
|
+
end
|
21
|
+
describe '.check_range' do
|
22
|
+
context 'lower limit is 0' do
|
23
|
+
it{ expect(IO::AccessLazy.check_range(0..0)).to be_true }
|
24
|
+
it{ expect(IO::AccessLazy.check_range(0..-1)).to be_true }
|
25
|
+
it{ expect(IO::AccessLazy.check_range(0..10)).to be_true }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'lower limit is negative' do
|
29
|
+
it{ expect(IO::AccessLazy.check_range(-1..0)).to be_false }
|
30
|
+
it{ expect(IO::AccessLazy.check_range(-3..5)).to be_false }
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'upper limit is negative' do
|
34
|
+
it{ expect(IO::AccessLazy.check_range(0..-5)).to be_false }
|
35
|
+
it{ expect(IO::AccessLazy.check_range(-1..-1)).to be_false }
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'lower limit is greater than upper limit' do
|
39
|
+
it{ expect(IO::AccessLazy.check_range(10..5)).to be_false }
|
40
|
+
it{ expect(IO::AccessLazy.check_range(8..0)).to be_false }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: io-access_lazy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- USAMI Kenta
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-03-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: This gem provide lazy access method like array to IO object.
|
42
|
+
email:
|
43
|
+
- tadsan@zonu.me
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- .gitignore
|
49
|
+
- Gemfile
|
50
|
+
- LICENSE.txt
|
51
|
+
- README.md
|
52
|
+
- Rakefile
|
53
|
+
- hoge.txt
|
54
|
+
- io-access_lazy.gemspec
|
55
|
+
- lib/io/access_lazy.rb
|
56
|
+
- lib/io/access_lazy/version.rb
|
57
|
+
- spec/io-access_lazy_spec.rb
|
58
|
+
- spec/spec_helper.rb
|
59
|
+
homepage: http://dt.zonu.me/
|
60
|
+
licenses:
|
61
|
+
- GPL Version 3 or NYSL
|
62
|
+
metadata: {}
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options: []
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
requirements: []
|
78
|
+
rubyforge_project:
|
79
|
+
rubygems_version: 2.0.0
|
80
|
+
signing_key:
|
81
|
+
specification_version: 4
|
82
|
+
summary: NURUPO
|
83
|
+
test_files:
|
84
|
+
- spec/io-access_lazy_spec.rb
|
85
|
+
- spec/spec_helper.rb
|
86
|
+
has_rdoc:
|