io_shuten 0.0.1.dev1 → 0.0.1.dev3

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/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ rvm:
2
+ - 1.9.3
3
+ - 1.9.2
4
+
5
+ branches:
6
+ only:
7
+ - develop
8
+ - master
data/README.md CHANGED
@@ -1,8 +1,9 @@
1
- # IO::shuten
1
+ # IO::shuten 【五百::終点】 [![Build Status](https://secure.travis-ci.org/asaaki/io_shuten.png)](http://travis-ci.org/asaaki/io_shuten)
2
2
 
3
3
  Use databases as IO handler like you would do with files and streams.
4
4
 
5
- # Motivation
5
+
6
+ ## Motivation
6
7
 
7
8
  One purpose for creating this project is to have an IO like interface to database storages.
8
9
 
@@ -20,7 +21,31 @@ logger = Logger.new(logdev)
20
21
  logger.info "This message will be stored in redis."
21
22
  ```
22
23
 
23
- # Not for production!
24
+
25
+ ## IO::shuten? 【五百::終点】(io shūten)!
26
+
27
+ In japanese `io` means *500* or *big amount*, `shū・ten` means *endpoint* (train terminus/last stop or mathematical endpoint).
28
+
29
+
30
+ ## Types
31
+
32
+
33
+ ### IO_shuten::Base
34
+
35
+ An in-memory storage system (handles simple StringIO objects).
36
+
37
+
38
+ ### IO_shuten::Redis
39
+
40
+ Stores content in a redis database.
41
+
42
+
43
+ ### IO_shuten::Mongo
44
+
45
+ Stores content in a mongodb database.
46
+
47
+
48
+ ## Not for production!
24
49
 
25
50
  This project is freshly started and currently not usable.
26
51
 
@@ -28,7 +53,8 @@ Everything can and maybe will change.
28
53
 
29
54
  Feel free to contribute, write issues if you want to support me with your ideas and insights.
30
55
 
31
- # git flowed
56
+
57
+ ## git flowed
32
58
 
33
59
  Development will happen in the `develop` branch now, master should be in a deployable state.
34
60
 
@@ -39,9 +65,9 @@ Read more about `git flow` and the branchin model here:
39
65
 
40
66
  I like this approach and try to use it whenever possible, also in one-man-development.
41
67
 
42
- # License
68
+
69
+ ## License
43
70
 
44
71
  This gem/software is licensed under MIT/X11 license. See [LICENSE](https://raw.github.com/asaaki/io_shuten/develop/LICENSE) (or [LICENSE.de](https://raw.github.com/asaaki/io_shuten/develop/LICENSE.de) for german translation).
45
72
 
46
73
  — [Christoph 'asaaki' Grabo](https://github.com/asaaki)
47
-
data/Rakefile CHANGED
@@ -20,7 +20,7 @@ Jeweler::Tasks.new do |gem|
20
20
  gem.email = ["chris@dinarrr.com"]
21
21
  gem.licenses = ["MIT"]
22
22
  gem.homepage = "http://github.com/asaaki/io_shuten"
23
- gem.summary = "IO::shuten – Use databases as IO handler."
23
+ gem.summary = "IO::shuten – Use databases as IO handler. (NOT YET READY FOR PRODUCTION!)"
24
24
  gem.description = "IO::shuten – Use databases as IO handler like you would do with files and streams."
25
25
  end
26
26
 
@@ -28,7 +28,7 @@ end
28
28
 
29
29
  task :gem => :build
30
30
 
31
- # Helper task because jeweler doesn't want to push my gem - how to fix it?
31
+ desc "Release current gem version to rubygems.org"
32
32
  task "gem:release" => :gem do
33
33
  system "gem push pkg/io_shuten-#{IO_shuten::VERSION}.gem"
34
34
  end
data/io_shuten.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "io_shuten"
8
- s.version = "0.0.1.dev1"
8
+ s.version = "0.0.1.dev3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Christoph Grabo"]
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
21
21
  ".rspec",
22
22
  ".rvmrc",
23
23
  ".simplecov",
24
+ ".travis.yml",
24
25
  "Gemfile",
25
26
  "Gemfile.lock",
26
27
  "LICENSE",
@@ -43,7 +44,7 @@ Gem::Specification.new do |s|
43
44
  s.licenses = ["MIT"]
44
45
  s.require_paths = ["lib"]
45
46
  s.rubygems_version = "1.8.10"
46
- s.summary = "IO::shuten \u{2013} Use databases as IO handler."
47
+ s.summary = "IO::shuten \u{2013} Use databases as IO handler. (NOT YET READY FOR PRODUCTION!)"
47
48
 
48
49
  if s.respond_to? :specification_version then
49
50
  s.specification_version = 3
@@ -2,19 +2,45 @@
2
2
  module IO_shuten
3
3
  class Base
4
4
 
5
- class NodeNotFound < StandardError; end
5
+ class NodeNotFoundError < StandardError; end
6
+ class NodeNameError < StandardError; end
7
+ class NotImplementedYet < StandardError; end
6
8
 
7
- attr_reader :object_name
8
- attr :object_content, :object_content_size
9
+ @@instances = []
10
+
11
+ attr_reader :object_name
12
+ attr :container, :container_size
9
13
 
10
14
  def initialize(object_name = nil, *args)
11
- @object_name = object_name
12
- @object_content = StringIO.new("","w+")
13
- @object_content_size = @object_content.size
15
+ if [String,Symbol,NilClass].include?(object_name.class)
16
+ @object_name = object_name
17
+ @container = StringIO.new("","w+")
18
+ @container_size = @container.size
19
+
20
+ @@instances << self unless @@instances.include?(self)
21
+ else
22
+ raise NodeNameError, "Name must be kind of String or Symbol."
23
+ end
14
24
  end
15
25
 
16
26
  class << self
17
27
 
28
+ def instances
29
+ @@instances
30
+ end
31
+
32
+ def purge_instances
33
+ @@instances = []
34
+ end
35
+
36
+ def delete_instance object_name_or_instance
37
+ @@instances.delete_if do |object|
38
+ (object_name_or_instance.is_a?(Symbol) && object.object_name == object_name_or_instance) ||
39
+ (object_name_or_instance.is_a?(String) && object.object_name == object_name_or_instance) ||
40
+ (object_name_or_instance.is_a?(Base) && object == object_name_or_instance)
41
+ end
42
+ end
43
+
18
44
  def open object_name, *args
19
45
  if Base.exists? object_name
20
46
  if block_given?
@@ -27,7 +53,7 @@ module IO_shuten
27
53
  end
28
54
 
29
55
  else
30
- raise NodeNotFound
56
+ raise NodeNotFoundError
31
57
  end
32
58
  end
33
59
 
@@ -40,37 +66,30 @@ module IO_shuten
40
66
 
41
67
  def load object_name
42
68
  obj = Base.new object_name
43
- obj.send :set_object_content, ""
69
+ obj.string ""
44
70
  obj
45
71
  end
46
72
  alias_method :load_object, :load
47
73
 
48
74
  end
49
75
 
50
- def close
51
- end
52
-
53
- def read
54
- end
55
-
56
- def each
57
- end
58
- alias_method :each_line, :each
59
- alias_method :lines, :each
60
-
61
- def write str
62
- @object_content.puts str.to_s
76
+ def respond_to_missing? sym, include_private = true
77
+ unless object_respond_to?(sym, include_private)
78
+ raise NotImplementedYet, "Method :#{sym} is not (yet) supported by #{self.class} or #{self.container.class}."
79
+ else
80
+ true
81
+ end
63
82
  end
64
83
 
65
84
  private
66
85
 
67
- def set_object_content object_content
68
- @object_content.string = object_content.to_s
69
- @object_content_size = @object_content.size
86
+ def object_respond_to? sym, include_private
87
+ @container.respond_to? sym, include_private
70
88
  end
71
89
 
72
- def get_object_content
73
- @object_content.string
90
+ def set_object_content object_content
91
+ @container.string = object_content.to_s
92
+ @container_size = @container.size
74
93
  end
75
94
 
76
95
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module IO_shuten
3
- VERSION = [0,0,1,'dev1'].join('.')
3
+ VERSION = [0,0,1,'dev3'].join('.')
4
4
  end
@@ -3,7 +3,7 @@ require File.expand_path("../../spec_helper.rb", __FILE__)
3
3
  require "logger"
4
4
 
5
5
  describe "Logger" do
6
- it "accepts an IO_shouten::Base as logdev" do
6
+ it "accepts an IO_shuten::Base as logdev" do
7
7
  logdev = IO_shuten::Base.new("logdev")
8
8
  logger = Logger.new(logdev)
9
9
  end
@@ -17,18 +17,83 @@ describe Base do
17
17
  end
18
18
 
19
19
  context "with object_name" do
20
- it "creates a new object with given name" do
20
+ it "creates a new object with name as String" do
21
21
  object_name = "foo bar"
22
22
  ios = Base.new(object_name)
23
23
  ios.should be_an(IO_shuten::Base)
24
24
  ios.object_name.should == object_name
25
25
  end
26
+
27
+ it "creates a new object with name as Symbol" do
28
+ object_name = :foobar
29
+ ios = Base.new(object_name)
30
+ ios.should be_an(IO_shuten::Base)
31
+ ios.object_name.should == object_name
32
+ end
33
+ end
34
+
35
+ end
36
+
37
+ describe "class based memory storage" do
38
+ describe :purge_instances do
39
+ it "purges all instances" do
40
+ Base.purge_instances
41
+ Base.instances.should have(0).items
42
+ end
26
43
  end
27
44
 
45
+ describe :instances do
46
+ it "retrieves all @@instances" do
47
+ Base.purge_instances
48
+ objects = %w[first second last]
49
+ objects.each do |object_name|
50
+ Base.new(object_name)
51
+ end
52
+
53
+ Base.instances.should have(3).items
54
+ end
55
+ end
56
+
57
+ describe :delete_instance do
58
+ before do
59
+ Base.purge_instances
60
+ @object_names = %w[first second last]
61
+ @objects = @object_names.inject([]) do |store, object_name|
62
+ store << Base.new(object_name)
63
+ store
64
+ end
65
+ end
66
+
67
+ it "removes an instance by name from store" do
68
+ Base.delete_instance(@object_names.first)
69
+ Base.instances.should_not include(@objects.first)
70
+ end
71
+
72
+ it "removes an instance by object from store" do
73
+ Base.delete_instance(@objects.first)
74
+ Base.instances.should_not include(@objects.first)
75
+ end
76
+
77
+ it "removes an instance by symbolized name from store" do
78
+ Base.purge_instances
79
+ @object_names = %w[first second last].map(&:to_sym)
80
+ @objects = @object_names.inject([]) do |store, object_name|
81
+ store << Base.new(object_name)
82
+ store
83
+ end
84
+ Base.delete_instance(@object_names.first)
85
+ Base.instances.should_not include(@objects.first)
86
+ end
87
+
88
+ end
28
89
  end
29
90
 
30
91
  describe :open do
31
92
 
93
+ before do
94
+ Base.purge_instances
95
+ end
96
+
32
97
  context "without any args" do
33
98
  it "raises ArgumentError" do
34
99
  expect { Base.open }.to raise_error(ArgumentError)
@@ -40,7 +105,7 @@ describe Base do
40
105
  context "and object does not exist" do
41
106
  it "raises NodeNotFound error" do
42
107
  Base.stub(:exists?).and_return(false)
43
- expect { Base.open("foo bar") }.to raise_error(Base::NodeNotFound)
108
+ expect { Base.open("foo bar") }.to raise_error(Base::NodeNotFoundError)
44
109
  end
45
110
  end
46
111
 
@@ -48,7 +113,7 @@ describe Base do
48
113
  it "returns the requested object" do
49
114
  object_name = "foo bar"
50
115
  object_cont = "demo content of object"
51
- object_mock = double(Base, :object_name => object_name, :object_content => object_cont)
116
+ object_mock = double(Base, :object_name => object_name, :container => object_cont)
52
117
 
53
118
  Base.should_receive(:exists?).with(object_name).and_return(true)
54
119
  Base.should_receive(:load).and_return(object_mock)
@@ -56,7 +121,7 @@ describe Base do
56
121
  ios = Base.open(object_name)
57
122
 
58
123
  ios.object_name.should == object_name
59
- ios.object_content.should == object_cont
124
+ ios.container.should == object_cont
60
125
  end
61
126
  end
62
127
  end
@@ -77,31 +142,29 @@ describe Base do
77
142
 
78
143
  describe "Instance Methods" do
79
144
 
80
- describe :each do
81
- context "without block" do
82
- it "creates an Enumerable for lines"
83
- end
84
-
85
- context "with block" do
86
- it "iterates the lines"
87
- end
88
- end
89
-
90
- describe :each_line do
91
- it "is an alias to #each"
92
- end
93
-
94
- describe :lines do
95
- it "is an alias to #each"
96
- end
97
-
98
- describe :each_byte do
99
- context "without block" do
100
- it "creates an Enumerable for bytes"
101
- end
102
-
103
- context "with block" do
104
- it "iterates the bytes"
145
+ describe "StringIO method wrapper" do
146
+ method_list = %w[
147
+ binmode bytes
148
+ chars close close_read close_write closed? closed_read? closed_write? codepoints
149
+ each each_byte each_char each_codepoint each_line
150
+ eof eof?
151
+ external_encoding
152
+ fcntl fileno flush fsync
153
+ getbyte getc gets
154
+ internal_encoding isatty
155
+ length lineno lineno= lines
156
+ pid pos pos= print printf putc puts
157
+ read read_nonblock readbyte readchar readline readlines readpartial
158
+ reopen rewind
159
+ seek set_encoding size string string= sync sync= sysread syswrite
160
+ tell truncate tty?
161
+ ungetbyte ungetc
162
+ write write_nonblock
163
+ ]
164
+ method_list.each do |method_name|
165
+ it "- responds to ##{method_name}" do
166
+ Base.new.should respond_to(method_name)
167
+ end
105
168
  end
106
169
  end
107
170
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: io_shuten
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.dev1
4
+ version: 0.0.1.dev3
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-01-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: hiredis
16
- requirement: &23546880 !ruby/object:Gem::Requirement
16
+ requirement: &23011240 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.4.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *23546880
24
+ version_requirements: *23011240
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: redis
27
- requirement: &23546400 !ruby/object:Gem::Requirement
27
+ requirement: &23010760 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 2.2.2
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *23546400
35
+ version_requirements: *23010760
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bson_ext
38
- requirement: &23545920 !ruby/object:Gem::Requirement
38
+ requirement: &23010280 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.5.2
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *23545920
46
+ version_requirements: *23010280
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: mongo
49
- requirement: &23545440 !ruby/object:Gem::Requirement
49
+ requirement: &23009800 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.5.2
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *23545440
57
+ version_requirements: *23009800
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rake
60
- requirement: &23544960 !ruby/object:Gem::Requirement
60
+ requirement: &23009320 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *23544960
68
+ version_requirements: *23009320
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: jeweler
71
- requirement: &23544480 !ruby/object:Gem::Requirement
71
+ requirement: &23008840 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *23544480
79
+ version_requirements: *23008840
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rspec
82
- requirement: &23544000 !ruby/object:Gem::Requirement
82
+ requirement: &23008360 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 2.8.0
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *23544000
90
+ version_requirements: *23008360
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: simplecov
93
- requirement: &23543520 !ruby/object:Gem::Requirement
93
+ requirement: &23007880 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *23543520
101
+ version_requirements: *23007880
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: simplecov-rcov
104
- requirement: &23543040 !ruby/object:Gem::Requirement
104
+ requirement: &23007400 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *23543040
112
+ version_requirements: *23007400
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: simplecov-csv
115
- requirement: &23542560 !ruby/object:Gem::Requirement
115
+ requirement: &23006920 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *23542560
123
+ version_requirements: *23006920
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: pry
126
- requirement: &23542080 !ruby/object:Gem::Requirement
126
+ requirement: &23006440 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *23542080
134
+ version_requirements: *23006440
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: pry-doc
137
- requirement: &23541600 !ruby/object:Gem::Requirement
137
+ requirement: &23005960 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,7 +142,7 @@ dependencies:
142
142
  version: '0'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *23541600
145
+ version_requirements: *23005960
146
146
  description: IO::shuten – Use databases as IO handler like you would do with files
147
147
  and streams.
148
148
  email:
@@ -157,6 +157,7 @@ files:
157
157
  - .rspec
158
158
  - .rvmrc
159
159
  - .simplecov
160
+ - .travis.yml
160
161
  - Gemfile
161
162
  - Gemfile.lock
162
163
  - LICENSE
@@ -189,7 +190,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
189
190
  version: '0'
190
191
  segments:
191
192
  - 0
192
- hash: -3373594909679872610
193
+ hash: 2524218372988733480
193
194
  required_rubygems_version: !ruby/object:Gem::Requirement
194
195
  none: false
195
196
  requirements:
@@ -201,5 +202,5 @@ rubyforge_project:
201
202
  rubygems_version: 1.8.10
202
203
  signing_key:
203
204
  specification_version: 3
204
- summary: IO::shuten – Use databases as IO handler.
205
+ summary: IO::shuten – Use databases as IO handler. (NOT YET READY FOR PRODUCTION!)
205
206
  test_files: []