adapter-file 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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +12 -0
- data/Readme.md +4 -0
- data/adapter-file.gemspec +24 -0
- data/examples/file_example.rb +25 -0
- data/lib/adapter/file.rb +101 -0
- data/lib/adapter/file/version.rb +5 -0
- metadata +70 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
|
2
|
+
require 'rubygems'
|
3
|
+
require 'bundler'
|
4
|
+
require "bundler/gem_tasks"
|
5
|
+
|
6
|
+
begin
|
7
|
+
Bundler.setup(:default, :development)
|
8
|
+
rescue Bundler::BundlerError => e
|
9
|
+
$stderr.puts e.message
|
10
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
11
|
+
exit e.status_code
|
12
|
+
end
|
data/Readme.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "adapter/file/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "adapter-file"
|
7
|
+
s.version = Adapter::File::VERSION
|
8
|
+
s.authors = ["Michael Fairchild"]
|
9
|
+
s.email = ["fairchild@stimble.net"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{key value storage adapter to use files for persistence}
|
12
|
+
s.description = %q{key value storage adapter to use files for persistence}
|
13
|
+
|
14
|
+
s.rubyforge_project = "adapter-file"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
# s.add_development_dependency "rspec"
|
23
|
+
s.add_runtime_dependency "adapter"
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
3
|
+
|
4
|
+
require 'adapter/file'
|
5
|
+
|
6
|
+
adapter = Adapter[:file].new(File.dirname(__FILE__)+"/files")
|
7
|
+
|
8
|
+
adapter.clear
|
9
|
+
|
10
|
+
adapter.write('foo', 'bar')
|
11
|
+
puts 'Should be bar: ' + adapter.read('foo').inspect
|
12
|
+
p [:files, Dir.entries(File.dirname(__FILE__)+"/files") ]
|
13
|
+
|
14
|
+
adapter.delete('foo')
|
15
|
+
puts 'Should be nil: ' + adapter.read('foo').inspect
|
16
|
+
|
17
|
+
adapter.write('foo', 'bar')
|
18
|
+
adapter.clear
|
19
|
+
puts 'Should be nil: ' + adapter.read('foo').inspect
|
20
|
+
|
21
|
+
# puts 'Should be bar: ' + adapter.fetch('foo', 'bar').inspect
|
22
|
+
# puts 'Should be bar: ' + adapter.read('foo').inspect
|
23
|
+
|
24
|
+
p [:files, Dir.entries(File.dirname(__FILE__)+"/files") ]
|
25
|
+
|
data/lib/adapter/file.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
# require "adapter-file/version"
|
2
|
+
require 'adapter'
|
3
|
+
require 'find'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'adapter/file/version'
|
6
|
+
|
7
|
+
module Adapter
|
8
|
+
module File
|
9
|
+
|
10
|
+
def initialize(client='./files', options={})
|
11
|
+
FileUtils.mkdir_p(client)# unless ::File.directory?(client)
|
12
|
+
base_directory client # this will be the base directory
|
13
|
+
end
|
14
|
+
|
15
|
+
# does the file already exist?
|
16
|
+
def key?(key)
|
17
|
+
raise "you are not allowed to use double dot '..' notation in paths" if key.match(/\.\.\//)
|
18
|
+
::File.exists?(full_key(key))
|
19
|
+
end
|
20
|
+
|
21
|
+
def keys
|
22
|
+
files=[]
|
23
|
+
::Find.find(base_directory) do |item|
|
24
|
+
files << item[(base_directory.length)..-1] if ::File.file?(item)
|
25
|
+
end
|
26
|
+
files
|
27
|
+
end
|
28
|
+
|
29
|
+
#return the file contents, or the directory listing if a directory
|
30
|
+
def read(key)
|
31
|
+
if ::File.file?(full_key(key))
|
32
|
+
::File.read(full_key(key))
|
33
|
+
elsif ::File.directory?(full_key(key))
|
34
|
+
Dir.entries('.')[2..-1] #don't return the . and .. directories
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
#TODO implement fetch
|
39
|
+
# def fetch(key)
|
40
|
+
# raise "not implemented yet. will return value or passed default"
|
41
|
+
# end
|
42
|
+
|
43
|
+
def write(key, value)
|
44
|
+
paths = ::File.split(full_key(key))
|
45
|
+
FileUtils.mkdir_p(paths.first) unless ::File.directory?(paths.first)
|
46
|
+
f = ::File.open(full_key(key), 'w') {|f| f.write(value) }
|
47
|
+
end
|
48
|
+
|
49
|
+
def delete(key, options={:recursive=>false})
|
50
|
+
if key?(key)
|
51
|
+
value=read(key)
|
52
|
+
if ::File.file?(full_key(key))
|
53
|
+
::File.delete(full_key(key))
|
54
|
+
elsif ::File.directory?(full_key(key))
|
55
|
+
if options[:recursive]
|
56
|
+
keys.each{|f| ::FileUtils.rm_r(full_key(f)) }
|
57
|
+
else
|
58
|
+
::FileUtils.rm(full_key(key)) unless options[:recursive]
|
59
|
+
end
|
60
|
+
elsif !::File.directory?(full_key(key))
|
61
|
+
true
|
62
|
+
else
|
63
|
+
raise 'unknown error'
|
64
|
+
end
|
65
|
+
value
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def clear
|
70
|
+
delete('', {:recursive=>true})
|
71
|
+
# if ::File.directory?(base_directory)
|
72
|
+
# delete('', {:recursive=>true})
|
73
|
+
# else
|
74
|
+
# p [:client, client]
|
75
|
+
# p [:base_dir, base_directory, ::File.directory?(base_directory)]
|
76
|
+
# end
|
77
|
+
end
|
78
|
+
|
79
|
+
def encode(value)
|
80
|
+
value
|
81
|
+
end
|
82
|
+
|
83
|
+
def decode(value)
|
84
|
+
value
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
# private
|
89
|
+
def base_directory(root='./')
|
90
|
+
@base_directory ||= ::File.expand_path(client)
|
91
|
+
end
|
92
|
+
|
93
|
+
def full_key(key)
|
94
|
+
raise "you are not allowed to use double dot '..' notation in paths" if key.match(/\.\.\//)
|
95
|
+
::File.expand_path(::File.join(base_directory,key_for(key)))
|
96
|
+
end
|
97
|
+
|
98
|
+
Adapter.define(:file, Adapter::File)
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: adapter-file
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Michael Fairchild
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-03-12 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: adapter
|
16
|
+
requirement: &2157750420 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2157750420
|
25
|
+
description: key value storage adapter to use files for persistence
|
26
|
+
email:
|
27
|
+
- fairchild@stimble.net
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- .gitignore
|
33
|
+
- Gemfile
|
34
|
+
- Rakefile
|
35
|
+
- Readme.md
|
36
|
+
- adapter-file.gemspec
|
37
|
+
- examples/file_example.rb
|
38
|
+
- lib/adapter/file.rb
|
39
|
+
- lib/adapter/file/version.rb
|
40
|
+
homepage: ''
|
41
|
+
licenses: []
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
segments:
|
53
|
+
- 0
|
54
|
+
hash: 104781492289905102
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
hash: 104781492289905102
|
64
|
+
requirements: []
|
65
|
+
rubyforge_project: adapter-file
|
66
|
+
rubygems_version: 1.8.6
|
67
|
+
signing_key:
|
68
|
+
specification_version: 3
|
69
|
+
summary: key value storage adapter to use files for persistence
|
70
|
+
test_files: []
|