skeevy 0.0.2 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 56219e553136787ef81221e9d1c30198ce3c456e
4
- data.tar.gz: 41318a6e7228958f487258630c11373930523a59
3
+ metadata.gz: 708fca8af138d7576b3bea4151c4d8e6ba68ff34
4
+ data.tar.gz: d8e76988b05d3750e8c10825f6afc4a954ac83b2
5
5
  SHA512:
6
- metadata.gz: 8de217cf5b58469ee7bea8f55653d23da85184e017a0b320e30419c6d78fd63f9b6b9f3e866b4b31642b7fd66c3a0badc7fe9b9e7ba52600d19ab5dcf3d6a191
7
- data.tar.gz: 7509329ca813f8ec828d18cb4bfa32719cba9b184c508ae97534d0d2e9651e2afb8e90acf5fa8b2db8d3e1ab1403d532f9ec879a8c009635d76a25b1b238ff94
6
+ metadata.gz: 5ec8aff61eb16ba1fc9abe0ff3d4bf93235f606afd02b7fac24c1524b2bb1f4c2e986422fdd3aa9ad2a791a464b8a66f086237b2a005f0fdb11c0da7e069a28c
7
+ data.tar.gz: 2612ff0d14ee9ebb86eba73ce2dd7bfcdf44030a665f6d6f9a97a2622fc704d2fe1be78ade77b4a3c68c282e86f7e61c422dfe6f24fe09cc2315c156aa029054
@@ -4,6 +4,9 @@ require 'skeevy/cutter'
4
4
  require 'skeevy/cutters/standard_key'
5
5
  require 'skeevy/engines/symbolic_hash'
6
6
  require 'skeevy/engines/directory_file'
7
+ require 'skeevy/filter'
8
+ require 'skeevy/filters/rot_13'
9
+ require 'skeevy/filters/zlib_compression'
7
10
  require 'skeevy/instance'
8
11
 
9
12
  fail "Skeevy #{Skeevy::VERSION} requires Ruby 2.1 or later." if RUBY_VERSION < '2.1.0'
@@ -12,12 +15,13 @@ module Skeevy
12
15
 
13
16
  # Poor-man's singleton
14
17
  class << self
15
- def register!(identifier:, engine: nil, cutter: nil)
18
+ def register!(identifier:, engine: nil, cutter: nil, filters: nil)
16
19
  raise(ArgumentError, "Identifier must be a symbol") unless identifier.is_a?(Symbol)
17
20
  @instances ||= {}
18
21
  @instances[identifier] = Instance.new identifier: identifier,
19
22
  engine: engine,
20
- cutter: cutter
23
+ cutter: cutter,
24
+ filters: filters || []
21
25
  end
22
26
 
23
27
  def instance(identifier)
@@ -18,5 +18,9 @@ module Skeevy
18
18
  def delete!(key:)
19
19
  raise NoMethodError, "Your Engine is missing .delete!"
20
20
  end
21
+
22
+ def keys
23
+ raise NoMethodError, "Your Engine is missing .keys"
24
+ end
21
25
  end
22
26
  end
@@ -35,9 +35,7 @@ module Skeevy
35
35
  def read(key:)
36
36
  path = path_for(key: key)
37
37
  if exist?(path: path, key: nil)
38
- File.open(path, "r:#{@encoding}") { |f|
39
- f.read
40
- }
38
+ IO.binread(path)
41
39
  else
42
40
  nil
43
41
  end
@@ -45,9 +43,7 @@ module Skeevy
45
43
 
46
44
  def write!(key:, content:)
47
45
  path = path_for(key: key)
48
- File.open(path, "w:#{@encoding}") { |f|
49
- f.write content
50
- }
46
+ IO.binwrite(path, content)
51
47
  end
52
48
 
53
49
  def delete!(key:)
@@ -59,6 +55,12 @@ module Skeevy
59
55
  false
60
56
  end
61
57
 
58
+ def keys
59
+ @files = []
60
+ check_directory(dir: "#{@base_dir}/*")
61
+ @files
62
+ end
63
+
62
64
  private
63
65
 
64
66
  def ensure_exists(path:)
@@ -69,6 +71,16 @@ module Skeevy
69
71
  def ensure_base_dir_exists
70
72
  ensure_exists(path: @base_dir)
71
73
  end
74
+
75
+ def check_directory(dir:, prefix: '')
76
+ Dir.glob(dir).each do |f|
77
+ if(File.directory? f)
78
+ check_directory(dir: "#{f}/*", prefix: f)
79
+ else
80
+ @files << f.gsub("#{@base_dir}/", '').gsub('/', @delimiter)
81
+ end
82
+ end
83
+ end
72
84
  end
73
85
  end
74
86
  end
@@ -32,6 +32,9 @@ module Skeevy
32
32
  false
33
33
  end
34
34
 
35
+ def keys
36
+ @items.keys.map(&:to_s)
37
+ end
35
38
  end
36
39
  end
37
40
  end
@@ -0,0 +1,11 @@
1
+ module Skeevy
2
+ module Filter
3
+ def filter_write(content: )
4
+ raise NoMethodError, "Your Filter is missing .filter_write"
5
+ end
6
+
7
+ def filter_read(content: )
8
+ raise NoMethodError, "Your Filter is missing filter_read"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ module Skeevy
2
+ module Filters
3
+ class Rot13
4
+ include Skeevy::Filters
5
+
6
+ def filter_write(content:)
7
+ content.tr!("abcdefghijklmnopqrstuvwxyz",
8
+ "nopqrstuvwxyzabcdefghijklm")
9
+ end
10
+
11
+ def filter_read(content:)
12
+ filter_write(content: content)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module Skeevy
2
+ module Filters
3
+ class ZlibCompression
4
+ include Skeevy::Filters
5
+ require 'zlib'
6
+
7
+ def filter_write(content:)
8
+ Zlib.deflate(content)
9
+ end
10
+
11
+ def filter_read(content:)
12
+ Zlib.inflate(content)
13
+ end
14
+ end
15
+ end
16
+ end
17
+
@@ -5,12 +5,16 @@ module Skeevy
5
5
 
6
6
  def initialize(identifier:,
7
7
  engine: nil,
8
- cutter: nil)
8
+ cutter: nil,
9
+ filters: []
10
+ )
9
11
  raise(ArgumentError, "identifier must be a Symbol") unless identifier.is_a?(Symbol)
10
12
  raise(ArgumentError, "engine #{engine} is not a Skeevy Engine!") unless engine.is_a?(Skeevy::Engine) || engine.nil?
11
13
  raise(ArgumentError, "cutter #{cutter} is not a Skeevy Cutter!") unless cutter.is_a?(Skeevy::Cutter) || cutter.nil?
14
+ raise(ArgumentError, "filters must be an array") unless filters.is_a?(Array)
12
15
  @cutter = cutter || Skeevy::Cutters::StandardKey.new(instance: self)
13
16
  @engine = engine || Skeevy::Engines::SymbolicHash.new(instance: self)
17
+ @filters = filters
14
18
  @cutter.instance ||= self
15
19
  @engine.instance ||= self
16
20
  @identifier = identifier
@@ -25,10 +29,17 @@ module Skeevy
25
29
  end
26
30
 
27
31
  def read(key:)
28
- @engine.read(key: key)
32
+ content = @engine.read(key: key)
33
+ @filters.reverse.each do |f|
34
+ content = f.filter_read(content: content)
35
+ end
36
+ content
29
37
  end
30
38
 
31
39
  def write!(key:, content:)
40
+ @filters.each do |f|
41
+ content = f.filter_write(content: content)
42
+ end
32
43
  @engine.write!(key: key, content: content)
33
44
  end
34
45
 
@@ -44,5 +55,8 @@ module Skeevy
44
55
  { identifier: @identifier, engine: @engine, cutter: @cutter}.to_s
45
56
  end
46
57
 
58
+ def add_filter(filter:)
59
+ @filters << filter
60
+ end
47
61
  end
48
62
  end
@@ -1,3 +1,3 @@
1
1
  module Skeevy
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'skeevy'
3
- s.version = '0.0.2'
4
- s.date = '2014-12-30'
3
+ s.version = '1.0.1'
4
+ s.date = '2015-02-13'
5
5
  s.summary = "Skeevy"
6
6
  s.description = "A simple key-value store for objects"
7
7
  s.authors = ["Craig Waterman"]
@@ -15,5 +15,5 @@ Gem::Specification.new do |s|
15
15
  s.require_paths = ['lib']
16
16
 
17
17
  s.add_development_dependency 'rspec', '~> 3.1'
18
- s.add_development_dependency 'guard-rspec', '~> 4.4.2'
19
- end
18
+ s.add_development_dependency 'guard-rspec', '~> 4.4'
19
+ end
@@ -0,0 +1,15 @@
1
+ RSpec.describe :rot_13 do
2
+ let(:filter) { Skeevy::Filters::Rot13.new }
3
+
4
+ describe '#filter_write' do
5
+ it 'performs a rot13 translation on the content' do
6
+ expect(filter.filter_write(content: 'testing')).to eq 'grfgvat'
7
+ end
8
+ end
9
+
10
+ describe '#filter_read' do
11
+ it 'performs a reverse rot13 (same as rot13) on the content' do
12
+ expect(filter.filter_write(content: 'grfgvat')).to eq 'testing'
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ RSpec.describe :zlib_compression do
2
+ let(:filter) { Skeevy::Filters::ZlibCompression.new }
3
+
4
+ describe '#filter_write' do
5
+ it 'zlib deflates the content' do
6
+ expect(filter.filter_write(content: 'testing')).to eq Zlib.deflate('testing')
7
+ end
8
+ end
9
+
10
+ describe '#filter_read' do
11
+ it 'zlib inflates the content' do
12
+ expect(filter.filter_read(content: Zlib.deflate('testing'))).to eq 'testing'
13
+ end
14
+ end
15
+ end
@@ -46,4 +46,23 @@ RSpec.describe :instance do
46
46
  end
47
47
  end
48
48
 
49
+ describe '#add_filter' do
50
+ let(:filter_rot13) { Skeevy::Filters::Rot13.new }
51
+ let(:filter_zlib) { Skeevy::Filters::ZlibCompression.new }
52
+
53
+ it 'adds the filter to the internal @filters variable' do
54
+ instance.add_filter(filter: filter_rot13)
55
+ expect(instance.instance_variable_get(:@filters)).to eq [filter_rot13]
56
+ instance.add_filter(filter: filter_zlib)
57
+ expect(instance.instance_variable_get(:@filters)).to eq [filter_rot13, filter_zlib]
58
+ end
59
+
60
+ it 'returns the same data put in regardless of filters' do
61
+ instance.add_filter(filter: filter_rot13)
62
+ instance.add_filter(filter: filter_zlib)
63
+ instance.write!(key: 'testing', content: 'testing_content')
64
+ expect(instance.read(key: 'testing')).to eq 'testing_content'
65
+ end
66
+ end
67
+
49
68
  end
@@ -54,4 +54,14 @@ RSpec.shared_examples 'a skeevy engine' do
54
54
  end
55
55
  end
56
56
 
57
+ describe '#keys' do
58
+ it 'lists all existing keys' do
59
+ puts the_engine.keys
60
+ k = 'keys_test-file.json'
61
+ k2 = 'a-b-c-file.json'
62
+ the_engine.write!(key: k, content: '{}')
63
+ the_engine.write!(key: k2, content: '{}')
64
+ expect(the_engine.keys.sort).to eq ['a-b-c-file.json', 'keys_test-file.json']
65
+ end
66
+ end
57
67
  end
@@ -11,7 +11,7 @@ RSpec.configure do |config|
11
11
  mocks.verify_partial_doubles = true
12
12
  end
13
13
 
14
- config.after(:all) do
14
+ config.after(:each) do
15
15
  FileUtils.rm_rf(Dir["tmp/[^.]*"])
16
16
  end
17
17
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skeevy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Craig Waterman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-30 00:00:00.000000000 Z
11
+ date: 2015-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 4.4.2
33
+ version: '4.4'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 4.4.2
40
+ version: '4.4'
41
41
  description: A simple key-value store for objects
42
42
  email: craigwaterman@gmail.com
43
43
  executables: []
@@ -56,12 +56,17 @@ files:
56
56
  - lib/skeevy/engine.rb
57
57
  - lib/skeevy/engines/directory_file.rb
58
58
  - lib/skeevy/engines/symbolic_hash.rb
59
+ - lib/skeevy/filter.rb
60
+ - lib/skeevy/filters/rot_13.rb
61
+ - lib/skeevy/filters/zlib_compression.rb
59
62
  - lib/skeevy/instance.rb
60
63
  - lib/skeevy/version.rb
61
64
  - skeevy.gemspec
62
65
  - spec/lib/skeevy/cutters/standard_key_spec.rb
63
66
  - spec/lib/skeevy/engines/directory_file_spec.rb
64
67
  - spec/lib/skeevy/engines/symbolic_hash_spec.rb
68
+ - spec/lib/skeevy/filters/rot_13_spec.rb
69
+ - spec/lib/skeevy/filters/zlib_compression_spec.rb
65
70
  - spec/lib/skeevy/instance_spec.rb
66
71
  - spec/lib/skeevy/version_spec.rb
67
72
  - spec/lib/skeevy_spec.rb
@@ -96,6 +101,8 @@ test_files:
96
101
  - spec/lib/skeevy/cutters/standard_key_spec.rb
97
102
  - spec/lib/skeevy/engines/directory_file_spec.rb
98
103
  - spec/lib/skeevy/engines/symbolic_hash_spec.rb
104
+ - spec/lib/skeevy/filters/rot_13_spec.rb
105
+ - spec/lib/skeevy/filters/zlib_compression_spec.rb
99
106
  - spec/lib/skeevy/instance_spec.rb
100
107
  - spec/lib/skeevy/version_spec.rb
101
108
  - spec/lib/skeevy_spec.rb