gaga 0.0.2 → 0.0.3
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.
- data/README.md +40 -0
- data/lib/gaga.rb +30 -12
- data/lib/gaga/version.rb +1 -1
- data/test/gaga_test.rb +89 -1
- data/test/helper.rb +5 -0
- metadata +4 -4
data/README.md
CHANGED
@@ -60,6 +60,46 @@ Returns an array of commit messages along with meta data about each key/value sa
|
|
60
60
|
]
|
61
61
|
```
|
62
62
|
|
63
|
+
### Options
|
64
|
+
|
65
|
+
Custom commit options can be set globally when creating a new Gaga instance, or
|
66
|
+
passed in with calls to #set, #delete, or #clear.
|
67
|
+
|
68
|
+
Examples:
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
# Global options
|
72
|
+
store1 = Gaga.new(
|
73
|
+
:repo => '/path/to/repo/',
|
74
|
+
:branch => :example,
|
75
|
+
:author => {
|
76
|
+
:name => 'Jim Bob',
|
77
|
+
:email => 'jbob@example.com'
|
78
|
+
},
|
79
|
+
:committer => {
|
80
|
+
:name => 'Jane Doe',
|
81
|
+
:email => 'jdoe@example.com'
|
82
|
+
}
|
83
|
+
)
|
84
|
+
|
85
|
+
# Custom message when storing a key/value
|
86
|
+
store1.set('key_1', 'Hello World', {:message => 'This is a custom commit log message'})
|
87
|
+
|
88
|
+
store2 = Gaga.new(:repo => '/path/to/repo/', :branch => :example)
|
89
|
+
|
90
|
+
# Assigns an author when storing a key/value
|
91
|
+
store2.set('key_1', 'Goodbye', {
|
92
|
+
:message => 'Another custom log message',
|
93
|
+
:author => {
|
94
|
+
:name => 'Sally',
|
95
|
+
:email => 'sally@example.com'
|
96
|
+
}
|
97
|
+
})
|
98
|
+
|
99
|
+
# Delete operations can also have a custom message
|
100
|
+
store2.delete('key_1', {:message => 'Farewell message'})
|
101
|
+
```
|
102
|
+
|
63
103
|
Installing Gaga
|
64
104
|
----------
|
65
105
|
|
data/lib/gaga.rb
CHANGED
@@ -5,9 +5,14 @@ require 'gaga/version'
|
|
5
5
|
class Gaga
|
6
6
|
|
7
7
|
def initialize(options = {})
|
8
|
+
@author = options.delete(:author)
|
9
|
+
@committer = options.delete(:committer)
|
8
10
|
@options = options
|
9
|
-
|
10
|
-
|
11
|
+
|
12
|
+
if path.end_with?('.git/')
|
13
|
+
Grit::Repo.init_bare(path) unless File.exists?(File.join(path,'refs'))
|
14
|
+
else
|
15
|
+
Grit::Repo.init(path) unless File.exists?(File.join(path,'.git'))
|
11
16
|
end
|
12
17
|
end
|
13
18
|
|
@@ -17,9 +22,11 @@ class Gaga
|
|
17
22
|
# @store.set('key', 'value')
|
18
23
|
#
|
19
24
|
# Returns nothing
|
20
|
-
def set(key, value)
|
21
|
-
|
22
|
-
|
25
|
+
def set(key, value, opts = {})
|
26
|
+
unless value == get(key)
|
27
|
+
save(setup_commit_options({:message => "set '#{key}'"}.merge(opts))) do |index|
|
28
|
+
index.add(key_for(key), encode(value))
|
29
|
+
end
|
23
30
|
end
|
24
31
|
end
|
25
32
|
|
@@ -68,17 +75,18 @@ class Gaga
|
|
68
75
|
# @store.delete('key')
|
69
76
|
#
|
70
77
|
# Returns nothing
|
71
|
-
def delete(key,
|
78
|
+
def delete(key, opts = {})
|
79
|
+
options = setup_commit_options({:message => "deleted #{key}"}.merge(opts))
|
72
80
|
self[key].tap do
|
73
|
-
save(
|
81
|
+
save(options) {|index| index.delete(key_for(key)) }
|
74
82
|
end
|
75
83
|
end
|
76
84
|
|
77
85
|
# Deletes all contents of the store
|
78
86
|
#
|
79
87
|
# Returns nothing
|
80
|
-
def clear
|
81
|
-
save("all clear") do |index|
|
88
|
+
def clear(opts = {})
|
89
|
+
save(setup_commit_options({:message => "all clear"}.merge(opts))) do |index|
|
82
90
|
if tree = index.current_tree
|
83
91
|
tree.contents.each do |entry|
|
84
92
|
index.delete(key_for(entry.name))
|
@@ -108,6 +116,13 @@ class Gaga
|
|
108
116
|
end
|
109
117
|
|
110
118
|
private
|
119
|
+
|
120
|
+
def setup_commit_options(opts = {})
|
121
|
+
{
|
122
|
+
:author => @author,
|
123
|
+
:committer => @committer
|
124
|
+
}.merge(opts)
|
125
|
+
end
|
111
126
|
|
112
127
|
# Format the given key so that it ensures it's git worthy
|
113
128
|
def key_for(key)
|
@@ -121,7 +136,7 @@ class Gaga
|
|
121
136
|
|
122
137
|
# The git branch to use for this store
|
123
138
|
def branch
|
124
|
-
@options[:branch]
|
139
|
+
(@options[:branch] || 'master').to_s
|
125
140
|
end
|
126
141
|
|
127
142
|
# Checks out the branch on the repo
|
@@ -130,14 +145,17 @@ class Gaga
|
|
130
145
|
end
|
131
146
|
|
132
147
|
# Commits the the value into the git repository with the given commit message
|
133
|
-
def save(
|
148
|
+
def save(options)
|
149
|
+
author = options[:author] ? Grit::Actor.new(options[:author][:name], options[:author][:email]) : nil
|
150
|
+
committer = options[:committer] ? Grit::Actor.new(options[:committer][:name], options[:committer][:email]) : nil
|
151
|
+
|
134
152
|
index = git.index
|
135
153
|
if head
|
136
154
|
commit = head.commit
|
137
155
|
index.current_tree = commit.tree
|
138
156
|
end
|
139
157
|
yield index
|
140
|
-
index.commit(message, :parents => Array(commit), :head => branch) if index.tree.any?
|
158
|
+
index.commit(options[:message], :parents => Array(commit), :author => author, :committer => committer, :head => branch) if index.tree.any?
|
141
159
|
end
|
142
160
|
|
143
161
|
# Converts the value to yaml format
|
data/lib/gaga/version.rb
CHANGED
data/test/gaga_test.rb
CHANGED
@@ -23,10 +23,59 @@ describe Gaga do
|
|
23
23
|
@store[key] = "value"
|
24
24
|
@store[key].must_equal "value"
|
25
25
|
end
|
26
|
+
|
27
|
+
it "writes String values to keys with explicit custom log data" do
|
28
|
+
@store.set(key, "value", {:message => "Custom message", :author => {:name => 'Test', :email => 'test@example.com'} })
|
29
|
+
@store[key].must_equal "value"
|
30
|
+
|
31
|
+
entry = @store.log(key).first
|
32
|
+
entry['message'].must_equal "Custom message"
|
33
|
+
entry['author'].must_equal({'name' => 'Test', 'email' => 'test@example.com'})
|
34
|
+
end
|
35
|
+
|
36
|
+
it "writes String values to keys with global custom log data" do
|
37
|
+
store = Gaga.new(
|
38
|
+
:repo => tmp_dir,
|
39
|
+
:branch => :lady,
|
40
|
+
:author => {:name => 'Test', :email => 'test@example.com'},
|
41
|
+
:committer => {:name => 'Test2', :email => 'test2@example.com'}
|
42
|
+
)
|
43
|
+
|
44
|
+
store.set(key, "value", {:message => "Custom message"})
|
45
|
+
store[key].must_equal "value"
|
46
|
+
|
47
|
+
entry = store.log(key).first
|
48
|
+
entry['message'].must_equal "Custom message"
|
49
|
+
entry['author'].must_equal({'name' => 'Test', 'email' => 'test@example.com'})
|
50
|
+
entry['committer'].must_equal({'name' => 'Test2', 'email' => 'test2@example.com'})
|
51
|
+
end
|
52
|
+
|
53
|
+
it "does not create empty commit" do
|
54
|
+
grit = Grit::Repo.new(tmp_dir)
|
55
|
+
initial_count = grit.commit_count
|
56
|
+
|
57
|
+
@master.set(key, "value", {:message => 'First commit'})
|
58
|
+
@master.set(key, "value", {:message => 'Second commit'})
|
59
|
+
|
60
|
+
current_count = grit.commit_count
|
61
|
+
|
62
|
+
(current_count - initial_count).must_equal 1
|
63
|
+
@master[key].must_equal "value"
|
64
|
+
end
|
26
65
|
|
27
66
|
it "reads from keys" do
|
28
67
|
@store[key].must_be_nil
|
29
68
|
end
|
69
|
+
|
70
|
+
it "should default to master when no branch is specified" do
|
71
|
+
value = 'testing'
|
72
|
+
@master[key] = value
|
73
|
+
@master[key].must_equal value
|
74
|
+
@store[key].must_be_nil
|
75
|
+
|
76
|
+
tmp = Gaga.new(:repo => tmp_dir, :branch => :master)
|
77
|
+
tmp[key].must_equal value
|
78
|
+
end
|
30
79
|
|
31
80
|
it 'guarantess the key is stored in the right branch' do
|
32
81
|
@store[key] = 'value'
|
@@ -70,6 +119,15 @@ describe Gaga do
|
|
70
119
|
@store.delete(key).must_equal "value"
|
71
120
|
@store.key?(key).must_equal false
|
72
121
|
end
|
122
|
+
|
123
|
+
it "removes a key using a custom commit message" do
|
124
|
+
@store[key] = "value"
|
125
|
+
@store.delete(key, {:message => "Removed it"}).must_equal "value"
|
126
|
+
@store.key?(key).must_equal false
|
127
|
+
|
128
|
+
entry = @store.log(key).first
|
129
|
+
entry['message'].must_equal "Removed it"
|
130
|
+
end
|
73
131
|
|
74
132
|
it "returns nil from delete if an element for a key does not exist" do
|
75
133
|
@store.delete(key).must_be_nil
|
@@ -82,6 +140,19 @@ describe Gaga do
|
|
82
140
|
@store.key?(key).wont_equal true
|
83
141
|
@store.key?(key2).wont_equal true
|
84
142
|
end
|
143
|
+
|
144
|
+
it "removes all keys from the store with clear and custom commit message" do
|
145
|
+
@store[key] = "value"
|
146
|
+
@store[key2] = "value2"
|
147
|
+
@store.clear({:message => "All gone"})
|
148
|
+
@store.key?(key).wont_equal true
|
149
|
+
@store.key?(key2).wont_equal true
|
150
|
+
|
151
|
+
[key, key2].each do |k|
|
152
|
+
entry = @store.log(k).first
|
153
|
+
entry['message'].must_equal "All gone"
|
154
|
+
end
|
155
|
+
end
|
85
156
|
|
86
157
|
it "does not run the block if the #{type} key is available" do
|
87
158
|
@store[key] = "value"
|
@@ -99,7 +170,24 @@ describe Gaga do
|
|
99
170
|
@store[key] = "value"
|
100
171
|
@store.log(key).first['message'].must_equal("set '#{key}'")
|
101
172
|
end
|
102
|
-
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'creates a bare repository' do
|
176
|
+
bare = Gaga.new(:repo => tmp_bare, :branch => :lady)
|
177
|
+
File.exists?(File.join(tmp_bare, '.git')).must_equal false
|
178
|
+
File.exists?(File.join(tmp_bare, 'refs')).must_equal true
|
179
|
+
bare['key1'] = 'Value 1'
|
180
|
+
bare['key2'] = 'Value 2'
|
181
|
+
bare['key3'] = 'Value 3'
|
182
|
+
bare['key1'].must_equal 'Value 1'
|
183
|
+
bare['key2'].must_equal 'Value 2'
|
184
|
+
bare.keys.must_equal %w(key1 key2 key3)
|
185
|
+
bare.delete('key1')
|
186
|
+
bare['key1'].must_be_nil
|
187
|
+
bare.clear
|
188
|
+
bare.keys.must_equal []
|
189
|
+
|
190
|
+
remove_tmpdir!(tmp_bare)
|
103
191
|
end
|
104
192
|
|
105
193
|
end
|
data/test/helper.rb
CHANGED
@@ -10,11 +10,16 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
10
10
|
require 'gaga'
|
11
11
|
|
12
12
|
TMP_DIR = '/tmp/gaga_test'
|
13
|
+
TMP_BARE = '/tmp/gaga_test_bare.git'
|
13
14
|
|
14
15
|
def tmp_dir
|
15
16
|
TMP_DIR
|
16
17
|
end
|
17
18
|
|
19
|
+
def tmp_bare
|
20
|
+
TMP_BARE
|
21
|
+
end
|
22
|
+
|
18
23
|
def remove_tmpdir!(passed_dir = nil)
|
19
24
|
FileUtils.rm_rf(passed_dir || tmp_dir)
|
20
25
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gaga
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-12-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: grit
|
16
|
-
requirement: &
|
16
|
+
requirement: &70238515496040 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70238515496040
|
25
25
|
description: Gaga is a Git-backed key/value store
|
26
26
|
email:
|
27
27
|
- matt@mattsears.com
|