quick_store 0.0.1 → 0.1.0

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: 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.