quick_store 0.0.1 → 0.1.0

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: dc979e2e5e8ac6debcf84aedacbdddef39abfaa4
4
- data.tar.gz: c65348865e6a22cc2facd0556b46a7673aff600d
3
+ metadata.gz: 288ad220c7a70b7417fc5e90b24d797ae159144f
4
+ data.tar.gz: 4b9873b3ca493c87f3cbf1ee6179273622e08150
5
5
  SHA512:
6
- metadata.gz: 2bfea78a041c46588bc532a3ad04588dff6a1baed59edaabec645b93de63a2f4e78b98976501e05caf5db9dbfce4c4e18b7b7e9d2b9e44ac5395e03b106ccba9
7
- data.tar.gz: db7808449b82ce2d1be9a4b82702ce6e83f7a50daf3743c6e660d683c668ae71d3936897990f0acdf323cb9e826074811c495ceb430a7fb8e499d66a2faca27f
6
+ metadata.gz: 77326c038ccdac3e1f66ba85ecb55d480a9f26a0bbe6d67bc38ada47b0c532707e8a40b95873eff858095fd586d48e83d8b29a9c576e73d89a25a3b134837bf0
7
+ data.tar.gz: 410501cb9cfbf8ad412c31c03f895879ce33198ecca62443adf1a2080b058d49f212e8e4c48f9b365d3fe31dd59da2b1c2a5492e4e537ce5c00f264cec373a2e
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.2.0
6
+ - ruby-head
7
+ - jruby-19mode
8
+ - rbx-2
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # QuickStore
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/quick_store.svg)](http://badge.fury.io/rb/quick_store)
4
+ [![Travis Build](https://travis-ci.org/daigaku-ruby/quick_store.svg)](https://travis-ci.org/daigaku-ruby/quick_store)
5
+
3
6
  Simple local key-value store based on YAML::Store.
4
7
 
5
8
  ## Installation
@@ -33,23 +36,34 @@ QuickStore.configure do |config|
33
36
  end
34
37
  ```
35
38
 
36
- ### Storing and fetching data
37
- You can store and receive data from the store using different methods:
39
+ ### Storing, fetching, and deleting data
40
+ You can store, receive, and remove data from the store by using different methods:
38
41
 
39
42
  ```ruby
40
43
  # Using dynamic setters and getters
41
- QuickStore.store.arbitrary_key = 'value' # => "value"
42
- QuickStore.store.arbitrary_key # => "value"
44
+ QuickStore.store.arbitrary_key = 'value' # => "value"
45
+ QuickStore.store.arbitrary_key # => "value"
46
+ QuickStore.store.delete_arbitrary_key # => "value"
43
47
 
44
- # Using the ::set and ::get methods
48
+ # Using the ::set, ::get, and ::delete methods
45
49
  QuickStore.store.set(:arbitrary_key, 'value') # => "value"
46
50
  QuickStore.store.get(:arbitrary_key) # => "value"
51
+ QuickStore.store.delete(:arbitrary_key) # => "value"
47
52
 
48
53
  # Example for a nested key ('/' is the default key separator)
49
- QuickStore.store.set('a/b/c', 'value') # => {"b"=>{"c"=>"value"}}
50
- QuickStore.store.get('a/b/c') # => "value"
51
- QuickStore.store.get('a/b') # => {"c"=>"value"}
52
- QuickStore.store.get('a') # => {"b"=>{"c"=>"value"}}
54
+ QuickStore.store.set('a/b/c', 'value') # => {"b"=>{"c"=>"value"}}
55
+
56
+ QuickStore.store.get('a/b/c') # => "value"
57
+ QuickStore.store.get('a/b') # => {"c"=>"value"}
58
+ QuickStore.store.get('a') # => {"b"=>{"c"=>"value"}}
59
+
60
+ # Removing data for a certain nested key
61
+ QuickStore.store.delete('a/b/c') # => {"b"=>{"c"=>nil}}
62
+ QuickStore.get('a') # => {"b"=>{"c"=>nil}}
63
+
64
+ # Removing data for all nested keys under a certain key
65
+ QuickStore.store.delete('a') # => {"b"=>{"c"=>nil}}
66
+ QuickStore.get('a') # => nil
53
67
  ```
54
68
 
55
69
  ## Contributing
data/Rakefile CHANGED
@@ -1,2 +1,5 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
2
3
 
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task default: :spec
@@ -45,7 +45,7 @@ module QuickStore
45
45
 
46
46
  old_value = get(base_key)
47
47
 
48
- if old_value.is_a? Hash
48
+ if old_value.is_a?(Hash) && final_value.is_a?(Hash)
49
49
  updated_values = old_value ? old_value.deep_merge(final_value) : final_value
50
50
  else
51
51
  updated_values = final_value
@@ -73,47 +73,63 @@ module QuickStore
73
73
  base_key = keys.shift
74
74
 
75
75
  @db.transaction do
76
- data = @db[base_key.to_s]
76
+ data = @db[base_key.to_s]
77
77
 
78
- if data
79
- keys.reduce(data) { |value, key| value ? value = value[key] : nil }
80
- end
81
- end
78
+ if data
79
+ keys.reduce(data) { |value, key| value ? value = value[key] : nil }
80
+ end
81
+ end
82
82
  end
83
83
 
84
- def self.get(key)
85
- instance.get(key)
84
+ def delete(key)
85
+ if key.to_s =~ Regexp.new(QuickStore.config.key_separator)
86
+ set(key, nil)
87
+ else
88
+ @db.transaction { @db.delete(key.to_s) }
89
+ end
86
90
  end
87
91
 
88
- def self.set(key, value)
89
- instance.set(key, value)
90
- end
92
+ class << self
93
+ def get(key)
94
+ instance.get(key)
95
+ end
91
96
 
92
- def self.file
93
- instance.file
94
- end
97
+ def set(key, value)
98
+ instance.set(key, value)
99
+ end
95
100
 
96
- # Defines getter and setter methods for arbitrarily named methods.
97
- #
98
- # QuickStore::Store.answer = 42 # saves 'answer: 42' to the store
99
- # # => 42
100
- #
101
- # QuickStore::Store.answer
102
- # # => 42
103
- def self.method_missing(method, *args, &block)
104
- if method =~ /.*=$/
105
- if singleton_methods.include?(method.to_s.chop.to_sym)
106
- raise "There is a \"#{method.to_s.chop}\" instance method already " +
101
+ def file
102
+ instance.file
103
+ end
104
+
105
+ def delete(key)
106
+ instance.delete(key)
107
+ end
108
+
109
+ # Defines getter and setter methods for arbitrarily named methods.
110
+ #
111
+ # QuickStore::Store.answer = 42 # saves 'answer: 42' to the store
112
+ # # => 42
113
+ #
114
+ # QuickStore::Store.answer
115
+ # # => 42
116
+ def method_missing(method, *args, &block)
117
+ if method =~ /.*=$/
118
+ if singleton_methods.include?(method.to_s.chop.to_sym)
119
+ raise "There is a \"#{method.to_s.chop}\" instance method already " +
107
120
  "defined. This will lead to problems while getting values " +
108
121
  "from the store. Please use another key than " +
109
122
  "#{singleton_methods.map(&:to_s)}."
123
+ end
124
+
125
+ instance.set(method.to_s.gsub(/=$/, ''), args[0])
126
+ elsif method =~/\Adelete\_.*$/
127
+ instance.delete(method.to_s.gsub(/\Adelete\_/, ''))
128
+ elsif args.count == 0
129
+ instance.get(method)
130
+ else
131
+ super
110
132
  end
111
-
112
- instance.set(method.to_s.gsub(/=$/, ''), args[0])
113
- elsif args.count == 0
114
- instance.get(method)
115
- else
116
- super
117
133
  end
118
134
  end
119
135
  end
@@ -1,3 +1,3 @@
1
1
  module QuickStore
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
data/quick_store.gemspec CHANGED
@@ -6,11 +6,12 @@ require 'quick_store/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "quick_store"
8
8
  spec.version = QuickStore::VERSION
9
+ spec.required_ruby_version = '>= 1.9.3'
9
10
  spec.authors = ["Paul Götze"]
10
11
  spec.email = ["paul.christoph.goetze@gmail.com"]
11
12
  spec.summary = %q{Simple local key-value store based on YAML::Store.}
12
13
  spec.description = %q{Simple local key-value store based on YAML::Store.}
13
- spec.homepage = ""
14
+ spec.homepage = "https://github.com/daigaku-ruby/quick_store"
14
15
  spec.license = "MIT"
15
16
 
16
17
  spec.files = `git ls-files -z`.split("\x0")
@@ -27,6 +27,15 @@ describe QuickStore::Store do
27
27
  expect(QuickStore::Store.carrots).to eq "carrots"
28
28
  end
29
29
 
30
+ it "allows deleting arbitrary keys by dynamic delete" do
31
+ value = 'chips'
32
+ QuickStore::Store.potatoes_variation = value
33
+ expect(QuickStore::Store.potatoes_variation).to eq value
34
+
35
+ QuickStore::Store::delete_potatoes_variation
36
+ expect(QuickStore::Store.potatoes_variation).to be_nil
37
+ end
38
+
30
39
  it "returns nil for not set simple keys" do
31
40
  expect(QuickStore::Store.hamburger).to be_nil
32
41
  end
@@ -41,16 +50,10 @@ describe QuickStore::Store do
41
50
  .to raise_error NoMethodError
42
51
  end
43
52
 
44
- it "responds to ::get" do
45
- expect(QuickStore::Store).to respond_to :get
46
- end
47
-
48
- it "responds to ::set" do
49
- expect(QuickStore::Store).to respond_to :set
50
- end
51
-
52
- it "responds to ::file" do
53
- expect(QuickStore::Store).to respond_to :file
53
+ [:get, :set, :file, :delete].each do |method|
54
+ it "responds to ::#{method}" do
55
+ expect(QuickStore::Store).to respond_to method
56
+ end
54
57
  end
55
58
 
56
59
  describe "::get" do
@@ -103,6 +106,41 @@ describe QuickStore::Store do
103
106
  end
104
107
  end
105
108
 
109
+ describe "::delete" do
110
+ [:to_delete, 'to_delete'].each do |key|
111
+ it "removes the key from the store" do
112
+ statement = 'I really love deleting things!'
113
+
114
+ QuickStore.store.to_delete = statement
115
+ expect(QuickStore.store.to_delete).to eq statement
116
+
117
+ QuickStore.store.delete(:to_delete)
118
+ expect(QuickStore.store.to_delete).to be_nil
119
+ end
120
+ end
121
+
122
+ it "removes nested keys, but keeps other keys on same level" do
123
+ key = 'a/deeply/nested/key'
124
+ other_key = 'a/deeply/nested/other_key'
125
+ value = 'Such worth being deleted.'
126
+ other_value = 'Such worth being kept.'
127
+
128
+ QuickStore.store.set(key, value)
129
+ QuickStore.store.set(other_key, other_value)
130
+
131
+ expect(QuickStore.store.get(key)).to eq value
132
+ expect(QuickStore.store.get(other_key)).to eq other_value
133
+
134
+ QuickStore.store.delete(key)
135
+
136
+ expect(QuickStore.store.get(key)).to be_nil
137
+ expect(QuickStore.store.get(other_key)).to eq other_value
138
+
139
+ hash = { 'nested' => { 'key' => nil, 'other_key' => other_value } }
140
+ expect(QuickStore.store.get('a/deeply')).to eq hash
141
+ end
142
+ end
143
+
106
144
  it "raises an error if the related getter for a setter is already defined" do
107
145
  expect { QuickStore::Store.clone = 'defined' }.to raise_error
108
146
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quick_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Götze
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-08 00:00:00.000000000 Z
11
+ date: 2015-05-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -74,6 +74,7 @@ extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
76
  - ".gitignore"
77
+ - ".travis.yml"
77
78
  - Gemfile
78
79
  - README.md
79
80
  - Rakefile
@@ -85,7 +86,7 @@ files:
85
86
  - spec/quick_store_spec.rb
86
87
  - spec/spec_helper.rb
87
88
  - spec/support/macros/test_helpers.rb
88
- homepage: ''
89
+ homepage: https://github.com/daigaku-ruby/quick_store
89
90
  licenses:
90
91
  - MIT
91
92
  metadata: {}
@@ -97,7 +98,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
97
98
  requirements:
98
99
  - - ">="
99
100
  - !ruby/object:Gem::Version
100
- version: '0'
101
+ version: 1.9.3
101
102
  required_rubygems_version: !ruby/object:Gem::Requirement
102
103
  requirements:
103
104
  - - ">="
@@ -105,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
106
  version: '0'
106
107
  requirements: []
107
108
  rubyforge_project:
108
- rubygems_version: 2.4.3
109
+ rubygems_version: 2.4.6
109
110
  signing_key:
110
111
  specification_version: 4
111
112
  summary: Simple local key-value store based on YAML::Store.