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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in adapter-file.gemspec
4
+ gemspec
@@ -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
@@ -0,0 +1,4 @@
1
+ A keyvalue adapter that uses the filesytem to store data.
2
+
3
+ extends https://github.com/jnunemaker/adapter with adapter/file
4
+
@@ -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
+
@@ -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
@@ -0,0 +1,5 @@
1
+ module Adapter
2
+ module File
3
+ VERSION = "0.0.1"
4
+ end
5
+ 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: []