io_shuten 0.0.1.dev1 → 0.0.1.dev3

Sign up to get free protection for your applications and to get access to all the features.
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: []