skeevy 0.0.2 → 1.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.
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