ramdo 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cec4df65cd2840f109a7205163af45c47a64df4b
4
+ data.tar.gz: 5e19b6915b85392c75a7868058952a8a0db75c6e
5
+ SHA512:
6
+ metadata.gz: 39ddd3e6dca71a664eaffd8224571bbd07878d57dd719d45ecbb859661b1387cf7397a06590e61efafb988bb7a48dea73f2433cc0431b3e54daeb070f1154376
7
+ data.tar.gz: 1d3e76937dfa7c108c56cfd8f5e7093f641358a5aba78bdf18d3f930a5a49aed3ea34b8626e7f1aea318b44705f48ff95d60c5f841ac019a8101b5d61249a2e1
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in aisler_eda.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,76 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ramdo (0.0.2)
5
+ cocaine
6
+ filesize
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (5.0.0)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (~> 0.7)
14
+ minitest (~> 5.1)
15
+ tzinfo (~> 1.1)
16
+ builder (3.2.2)
17
+ climate_control (0.0.3)
18
+ activesupport (>= 3.0)
19
+ cocaine (0.5.8)
20
+ climate_control (>= 0.0.3, < 1.0)
21
+ concurrent-ruby (1.0.2)
22
+ diff-lcs (1.2.5)
23
+ faraday (0.9.2)
24
+ multipart-post (>= 1.2, < 3)
25
+ filesize (0.1.1)
26
+ geminabox (0.12.4)
27
+ builder
28
+ faraday
29
+ httpclient (>= 2.2.7)
30
+ nesty
31
+ sinatra (>= 1.2.7)
32
+ httpclient (2.7.0.1)
33
+ i18n (0.7.0)
34
+ minitest (5.9.0)
35
+ multipart-post (2.0.0)
36
+ nesty (1.0.2)
37
+ rack (1.6.4)
38
+ rack-protection (1.5.3)
39
+ rack
40
+ rake (10.4.2)
41
+ rspec (3.3.0)
42
+ rspec-core (~> 3.3.0)
43
+ rspec-expectations (~> 3.3.0)
44
+ rspec-mocks (~> 3.3.0)
45
+ rspec-core (3.3.2)
46
+ rspec-support (~> 3.3.0)
47
+ rspec-expectations (3.3.1)
48
+ diff-lcs (>= 1.2.0, < 2.0)
49
+ rspec-support (~> 3.3.0)
50
+ rspec-mocks (3.3.2)
51
+ diff-lcs (>= 1.2.0, < 2.0)
52
+ rspec-support (~> 3.3.0)
53
+ rspec-support (3.3.0)
54
+ sinatra (1.4.5)
55
+ rack (~> 1.4)
56
+ rack-protection (~> 1.4)
57
+ tilt (~> 1.3, >= 1.3.4)
58
+ thread_safe (0.3.5)
59
+ tilt (1.4.1)
60
+ tzinfo (1.2.2)
61
+ thread_safe (~> 0.1)
62
+ yard (0.8.7.6)
63
+
64
+ PLATFORMS
65
+ ruby
66
+
67
+ DEPENDENCIES
68
+ bundler
69
+ geminabox
70
+ rake
71
+ ramdo!
72
+ rspec
73
+ yard
74
+
75
+ BUNDLED WITH
76
+ 1.12.4
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Patrick Franken
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,47 @@
1
+ # Ramdo
2
+
3
+ Fast temporary store supported by RAM disks.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'ramdo'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ ## How to use
18
+
19
+ Acutally quite simple
20
+
21
+ ```ruby
22
+ require 'ramdo'
23
+ store = Ramdo::Store.new
24
+ store.data = 'Some Data'
25
+
26
+ puts `cat #{store.file}`
27
+ # Some Data
28
+
29
+ puts store.data
30
+ # Some Data
31
+
32
+ ```
33
+
34
+
35
+ ## Low-level API usage
36
+ ### Create a new RAM disk
37
+
38
+ ```ruby
39
+ require 'ramdo'
40
+ wrapper = Ramdo::Ramdisk::Factory.get
41
+ disk = wrapper.create('100 mb')
42
+
43
+ IO.write(disk.path + '/test_file', 'some important data')
44
+ ```
45
+
46
+
47
+ by Patrick Franken, created through Tamyca FunFriday 29.07.2016
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
@@ -0,0 +1,64 @@
1
+ module Ramdo
2
+ module Ramdisk
3
+ class DarwinWrapper
4
+ def initialize
5
+ end
6
+
7
+ def list
8
+ disks = []
9
+
10
+ line = Cocaine::CommandLine.new("hdiutil", "info")
11
+ line.run.each_line do |line|
12
+ if line =~ /^[=]+$/
13
+ disks << {}
14
+ elsif line =~ /^image-path[\s]+:[\s]+(ram:\/\/[0-9]+)/
15
+ disks.last[:is_ram_disk] = true
16
+ elsif line =~ /^(\/dev\/disk[0-9]+)[\s]+(\/Volumes\/[A-Za-z0-9_-]+)/
17
+ disks.last[:path] = Regexp.last_match[2].strip
18
+ disks.last[:device] = Regexp.last_match[1].strip
19
+ elsif line =~ /^blockcount[\s]+:[\s]+([0-9]+)/
20
+ size_in_mb = Regexp.last_match[1].to_i / 2048
21
+ disks.last[:size] = Filesize.from("#{size_in_mb} MB")
22
+ end
23
+ end
24
+
25
+ disks.map { |d| Instance.new(d) if d.has_key? :is_ram_disk }.compact
26
+ end
27
+
28
+ def create(size)
29
+ size = Filesize.from(size) if size.is_a? String
30
+ raise NotEnoughFreeRamException.new unless enough_ram? size
31
+
32
+ # Allocate new RAM space
33
+ line = Cocaine::CommandLine.new("hdiutil", "attach -nomount ram://#{(size.to('MB') * 2048).to_i}")
34
+ device = line.run
35
+ device.strip!
36
+
37
+ # Format RAM disk
38
+ line = Cocaine::CommandLine.new("diskutil", "erasevolume HFS+ '#{Instance.generate_name}' #{device}")
39
+ line.run
40
+
41
+ # Receive all disk and select just created one
42
+ list().select { |disk| disk.device == device }.first
43
+ end
44
+
45
+ private
46
+ def enough_ram?(size)
47
+ size = Filesize.from(size) if size.is_a? String
48
+ pages_free = 0
49
+ page_size = 0
50
+
51
+ line = Cocaine::CommandLine.new("vm_stat")
52
+ line.run.each_line do |line|
53
+ if line =~ /^Pages free:[\s]+([0-9]+)./
54
+ pages_free = Regexp.last_match[1].to_i
55
+ elsif line =~ /^Mach Virtual Memory Statistics: +\(page size of ([0-9]+) bytes\)/
56
+ page_size = Regexp.last_match[1].to_i
57
+ end
58
+ end
59
+
60
+ Filesize.new(pages_free * page_size) > size
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,6 @@
1
+ module Ramdo
2
+ module Ramdisk
3
+ class OSNotSupportedException < StandardError; end
4
+ class NotEnoughFreeRamException < StandardError; end
5
+ end
6
+ end
@@ -0,0 +1,16 @@
1
+ module Ramdo
2
+ module Ramdisk
3
+ class Factory
4
+ def self.get
5
+ if RUBY_PLATFORM =~ /linux_not_implemented_yet/
6
+ LinuxWrapper.new
7
+ elsif RUBY_PLATFORM =~ /darwin/
8
+ DarwinWrapper.new
9
+ else
10
+ raise OSNotSupportedException.new("Could not find Ramdisk wrapper for #{RUBY_PLATFORM}")
11
+ end
12
+ end
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ module Ramdo
2
+ module Ramdisk
3
+ class Instance
4
+ def self.generate_name
5
+ "ramdo_#{SecureRandom.uuid}"
6
+ end
7
+
8
+ attr_accessor :device, :path, :size
9
+
10
+ def initialize(info = {})
11
+ @device = info[:device]
12
+ @path = info[:path]
13
+ @size = info[:size]
14
+ end
15
+
16
+ def destroy!
17
+ return false unless File.exist? @device
18
+
19
+ line = Cocaine::CommandLine.new("hdiutil", "detach :device")
20
+ line.run(device: @device)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,7 @@
1
+ module Ramdo
2
+ module Ramdisk
3
+ class LinuxWrapper
4
+
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,34 @@
1
+ module Ramdo
2
+ class Store
3
+ attr_reader :file, :uuid
4
+
5
+ def initialize
6
+ wrapper = Ramdisk::Factory.get
7
+ list = wrapper.list
8
+ if list.length <= 0
9
+ # Create a new Ramdisk
10
+ @disk = wrapper.create(DEFAULT_RAMDISK_SIZE)
11
+ else
12
+ # Use one which is large enough
13
+ list.each { |disk| @disk = disk if disk.size >= Filesize.from(DEFAULT_RAMDISK_SIZE) }
14
+ @disk = wrapper.create(DEFAULT_RAMDISK_SIZE) if @disk.nil?
15
+ end
16
+
17
+ @uuid = SecureRandom.uuid
18
+ @filename = 'ramdo_' + @uuid
19
+ @file = [@disk.path, @filename].join('/') # No Windows support!
20
+ end
21
+
22
+ def data=(data)
23
+ IO.write(@file, data)
24
+ end
25
+
26
+ def data
27
+ IO.read(@file)
28
+ end
29
+
30
+ def truncate
31
+ File.delete(@file)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,3 @@
1
+ module Ramdo
2
+ VERSION = '0.1.1'
3
+ end
data/lib/ramdo.rb ADDED
@@ -0,0 +1,16 @@
1
+ require 'cocaine'
2
+ require 'pp'
3
+ require 'filesize'
4
+ require 'securerandom'
5
+
6
+ require 'ramdo/version'
7
+ require 'ramdo/ramdisk/exceptions'
8
+ require 'ramdo/ramdisk/factory'
9
+ require 'ramdo/ramdisk/instance'
10
+ require 'ramdo/ramdisk/darwin_wrapper'
11
+ require 'ramdo/ramdisk/linux_wrapper'
12
+ require 'ramdo/store'
13
+
14
+ module Ramdo
15
+ DEFAULT_RAMDISK_SIZE = '100mb'
16
+ end
data/ramdo.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ramdo/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "ramdo"
8
+ spec.version = Ramdo::VERSION
9
+ spec.authors = ["Patrick Franken"]
10
+ spec.email = ["p.franken@aisler.net"]
11
+ spec.summary = "Fast temporary store supported by RAM disks"
12
+ spec.description = spec.summary
13
+ spec.homepage = "http://aisler.net"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
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_runtime_dependency 'cocaine'
22
+ spec.add_runtime_dependency 'filesize'
23
+
24
+ spec.add_development_dependency "bundler"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "rspec"
27
+ spec.add_development_dependency "geminabox"
28
+ spec.add_development_dependency "yard"
29
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ include Ramdo
4
+ describe Ramdisk::Factory do
5
+ after(:each) do
6
+ wrapper = Ramdisk::Factory.get
7
+ wrapper.list.each do |disk|
8
+ disk.destroy!
9
+ end
10
+ end
11
+
12
+
13
+ it 'should check if a ramdisk already exists' do
14
+ wrapper = Ramdisk::Factory.get
15
+ disks = wrapper.list
16
+ expect(disks).to be_an(Array)
17
+ expect(disks.length).to be(0)
18
+ end
19
+
20
+ it 'should check if enough RAM space is free' do
21
+ wrapper = Ramdisk::Factory.get
22
+ expect(wrapper.send(:enough_ram?, '100 MB')).to be_truthy
23
+ expect(wrapper.send(:enough_ram?, '100 GB')).to be_falsey
24
+ end
25
+
26
+ it 'should create a new RAM disk and save a file to it' do
27
+ size = '100 MB'
28
+
29
+ wrapper = Ramdisk::Factory.get
30
+ disk = wrapper.create(size)
31
+
32
+ expect(disk).to be_an(Ramdisk::Instance)
33
+ expect { IO.write("#{disk.path}/test.bin", IO.read('/dev/urandom', 100000)) }.not_to raise_error
34
+ expect(disk.size).to eq(Filesize.from(size))
35
+ end
36
+
37
+ it 'should remove a RAM disk' do
38
+ wrapper = Ramdisk::Factory.get
39
+ disk = wrapper.create('100 MB')
40
+
41
+ count = wrapper.list.length
42
+ expect(disk.destroy!).to be_truthy
43
+ expect(disk.destroy!).to be_falsey # Should not work another time
44
+
45
+ expect(wrapper.list.length).to be(count - 1)
46
+ end
47
+
48
+ it 'should list all available RAM disks' do
49
+ wrapper = Ramdisk::Factory.get
50
+ disk = wrapper.create('100 MB')
51
+
52
+ list = wrapper.list
53
+ expect(list.length).to eq(1)
54
+ expect(list.first.device).not_to be_empty
55
+ expect(File.exist?(list.first.device)).to be_truthy
56
+ expect(Dir.exist?(list.first.path)).to be_truthy
57
+ expect(list.first.size).to eq(Filesize.from('100 MB'))
58
+
59
+ disk = wrapper.create('200 MB')
60
+
61
+ list = wrapper.list
62
+ expect(list.length).to eq(2)
63
+ expect(list.last.device).not_to be_empty
64
+ expect(File.exist?(list.last.device)).to be_truthy
65
+ expect(Dir.exist?(list.last.path)).to be_truthy
66
+ expect(list.last.size).to eq(Filesize.from('200 MB'))
67
+ end
68
+ end
@@ -0,0 +1 @@
1
+ require 'ramdo'
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ include Ramdo
4
+ describe Store do
5
+ after(:all) do
6
+ wrapper = Ramdisk::Factory.get
7
+ wrapper.list.each do |disk|
8
+ disk.destroy!
9
+ end
10
+ end
11
+
12
+ it 'should create a new store and append data to it' do
13
+ test_data = 'make me sexy'
14
+
15
+ store = Store.new
16
+ store.data = test_data
17
+
18
+ expect(IO.read(store.file)).to eq(test_data)
19
+ expect(store.data).to eq(test_data)
20
+ end
21
+
22
+ it 'should create a new store and write data to it' do
23
+ test_data = 'make me sexy'
24
+
25
+ store = Store.new
26
+ IO.write(store.file, test_data)
27
+
28
+ expect(IO.read(store.file)).to eq(test_data)
29
+ expect(store.data).to eq(test_data)
30
+ end
31
+
32
+ it 'should be able to truncate any data' do
33
+ store = Store.new
34
+ store.data = 'Test'
35
+ store.truncate
36
+ expect(File.exist?(store.file)).to be_falsey
37
+ end
38
+
39
+ it 'should use existing RAM disk if available' do
40
+ wrapper = Ramdisk::Factory.get
41
+
42
+ wrapper.list.each { |disk| disk.destroy! }
43
+ expect(wrapper.list.length).to eq(0)
44
+ store_1 = Store.new
45
+ expect(wrapper.list.length).to eq(1)
46
+ store_2 = Store.new
47
+ expect(wrapper.list.length).to eq(1)
48
+ end
49
+
50
+ end
data/tmp/.gitkeep ADDED
File without changes
metadata ADDED
@@ -0,0 +1,164 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ramdo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Patrick Franken
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-07-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: cocaine
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: filesize
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: geminabox
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: yard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Fast temporary store supported by RAM disks
112
+ email:
113
+ - p.franken@aisler.net
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - Gemfile
119
+ - Gemfile.lock
120
+ - LICENSE.txt
121
+ - README.md
122
+ - Rakefile
123
+ - lib/ramdo.rb
124
+ - lib/ramdo/ramdisk/darwin_wrapper.rb
125
+ - lib/ramdo/ramdisk/exceptions.rb
126
+ - lib/ramdo/ramdisk/factory.rb
127
+ - lib/ramdo/ramdisk/instance.rb
128
+ - lib/ramdo/ramdisk/linux_wrapper.rb
129
+ - lib/ramdo/store.rb
130
+ - lib/ramdo/version.rb
131
+ - ramdo.gemspec
132
+ - spec/ramdisk_factory_spec.rb
133
+ - spec/spec_helper.rb
134
+ - spec/store_spec.rb
135
+ - tmp/.gitkeep
136
+ homepage: http://aisler.net
137
+ licenses:
138
+ - MIT
139
+ metadata: {}
140
+ post_install_message:
141
+ rdoc_options: []
142
+ require_paths:
143
+ - lib
144
+ required_ruby_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ required_rubygems_version: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ requirements: []
155
+ rubyforge_project:
156
+ rubygems_version: 2.4.5.1
157
+ signing_key:
158
+ specification_version: 4
159
+ summary: Fast temporary store supported by RAM disks
160
+ test_files:
161
+ - spec/ramdisk_factory_spec.rb
162
+ - spec/spec_helper.rb
163
+ - spec/store_spec.rb
164
+ has_rdoc: