soup 1.0.1 → 1.0.2
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/Rakefile +10 -4
- data/lib/soup/backends/file_backend.rb +3 -2
- data/lib/soup/backends/yaml_backend.rb +2 -1
- data/lib/soup/empty_class.rb +1 -1
- data/lib/soup/snip.rb +20 -1
- data/test/snip_test.rb +41 -0
- data/test/soup_test.rb +3 -3
- metadata +5 -4
data/Rakefile
CHANGED
@@ -21,7 +21,7 @@ spec = Gem::Specification.new do |s|
|
|
21
21
|
|
22
22
|
# Change these as appropriate
|
23
23
|
s.name = "soup"
|
24
|
-
s.version = "1.0.
|
24
|
+
s.version = "1.0.2"
|
25
25
|
s.summary = "A super-simple data store"
|
26
26
|
s.author = "James Adam"
|
27
27
|
s.email = "james@lazyatom.com"
|
@@ -60,8 +60,8 @@ end
|
|
60
60
|
|
61
61
|
task :package => :gemspec
|
62
62
|
|
63
|
-
desc '
|
64
|
-
task :
|
63
|
+
desc 'Tag the repository in git with gem version number'
|
64
|
+
task :tag => [:gemspec, :package] do
|
65
65
|
if `git diff --cached`.empty?
|
66
66
|
if `git tag`.split("\n").include?("v#{spec.version}")
|
67
67
|
raise "Version #{spec.version} has already been released"
|
@@ -69,12 +69,18 @@ task :release => [:gemspec, :package] do
|
|
69
69
|
`git add #{File.expand_path("../#{spec.name}.gemspec", __FILE__)}`
|
70
70
|
`git commit -m "Released version #{spec.version}"`
|
71
71
|
`git tag v#{spec.version}`
|
72
|
-
`
|
72
|
+
`git push --tags`
|
73
|
+
`git push`
|
73
74
|
else
|
74
75
|
raise "Unstaged changes still waiting to be committed"
|
75
76
|
end
|
76
77
|
end
|
77
78
|
|
79
|
+
desc 'Release the gem to gemcutter and tag the repo'
|
80
|
+
task :release => [:tag] do
|
81
|
+
`gem push pkg/#{spec.name}-#{spec.version}.gem`
|
82
|
+
end
|
83
|
+
|
78
84
|
# Generate documentation
|
79
85
|
Rake::RDocTask.new do |rd|
|
80
86
|
rd.main = "README"
|
@@ -21,10 +21,11 @@ class Soup
|
|
21
21
|
default_attributes = {:name => name, :updated_at => file.mtime, :created_at => file.mtime}
|
22
22
|
if attribute_start = data.index("\n:")
|
23
23
|
content = data[0, attribute_start].strip
|
24
|
-
attributes = default_attributes.merge(YAML.load(data[attribute_start, data.length])
|
24
|
+
attributes = default_attributes.merge(YAML.load(data[attribute_start, data.length]))
|
25
25
|
else
|
26
|
-
attributes = default_attributes
|
26
|
+
attributes = default_attributes
|
27
27
|
end
|
28
|
+
attributes.update(:content => content) if content && content.length > 0
|
28
29
|
Snip.new(attributes, self)
|
29
30
|
else
|
30
31
|
nil
|
@@ -21,10 +21,11 @@ class Soup
|
|
21
21
|
file = File.read(path)
|
22
22
|
if attribute_start = file.index(ATTRIBUTE_TOKEN)
|
23
23
|
content = file.slice(0...attribute_start)
|
24
|
-
attributes = {:name => name}.merge(YAML.load(file.slice(attribute_start..-1))
|
24
|
+
attributes = {:name => name}.merge(YAML.load(file.slice(attribute_start..-1)))
|
25
25
|
else
|
26
26
|
attributes = {:content => file, :name => name}
|
27
27
|
end
|
28
|
+
attributes.update(:content => content) if content && content.length > 0
|
28
29
|
Snip.new(attributes, self)
|
29
30
|
else
|
30
31
|
nil
|
data/lib/soup/empty_class.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Based on Builder's BlankSlate object
|
2
2
|
class Soup
|
3
3
|
class EmptyClass
|
4
|
-
instance_methods.each { |m| undef_method(m) unless m =~ /^(__|object_id|instance_eval|respond_to\?)/ }
|
4
|
+
instance_methods.each { |m| undef_method(m) unless m =~ /^(is_a\?|__|object_id|instance_eval|respond_to\?)/ }
|
5
5
|
end
|
6
6
|
end
|
data/lib/soup/snip.rb
CHANGED
@@ -19,8 +19,15 @@ class Soup
|
|
19
19
|
self
|
20
20
|
end
|
21
21
|
|
22
|
+
def ==(other)
|
23
|
+
other.is_a?(Snip) && matching_attributes(other)
|
24
|
+
end
|
25
|
+
|
22
26
|
def inspect
|
23
|
-
|
27
|
+
keys = @attributes.keys.dup
|
28
|
+
keys.delete(:name)
|
29
|
+
attrs = keys.inject([[:name, self.name]]) { |a, key| a + [[key, @attributes[key]]] }
|
30
|
+
"<Snip #{attrs.map { |(key,value)| "#{key}:#{value.inspect}"}.join(" ")}>"
|
24
31
|
end
|
25
32
|
|
26
33
|
def respond_to?(method)
|
@@ -35,5 +42,17 @@ class Soup
|
|
35
42
|
@attributes[method]
|
36
43
|
end
|
37
44
|
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def matching_attributes(other)
|
49
|
+
my_attributes = self.attributes.dup
|
50
|
+
their_attributes = other.attributes.dup
|
51
|
+
[:created_at, :updated_at].each do |attribute_to_ignore|
|
52
|
+
my_attributes.delete(attribute_to_ignore)
|
53
|
+
their_attributes.delete(attribute_to_ignore)
|
54
|
+
end
|
55
|
+
my_attributes == their_attributes
|
56
|
+
end
|
38
57
|
end
|
39
58
|
end
|
data/test/snip_test.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class SnipTest < Test::Unit::TestCase
|
4
|
+
context "A snip" do
|
5
|
+
setup do
|
6
|
+
@snip = Soup::Snip.new({:name => "james", :content => "is awesome"}, nil)
|
7
|
+
end
|
8
|
+
|
9
|
+
should "be equal to another snip with the same attributes" do
|
10
|
+
other_snip = Soup::Snip.new({:name => "james", :content => "is awesome"}, nil)
|
11
|
+
assert other_snip == @snip
|
12
|
+
end
|
13
|
+
|
14
|
+
should "not be equal to another snip with differing attributes" do
|
15
|
+
other_snip = Soup::Snip.new({:name => "james", :content => "is really awesome"}, nil)
|
16
|
+
assert other_snip != @snip
|
17
|
+
end
|
18
|
+
|
19
|
+
should "be comparable in arrays" do
|
20
|
+
other_snip = Soup::Snip.new({:name => "james", :content => "is awesome"}, nil)
|
21
|
+
assert [@snip] == [other_snip]
|
22
|
+
end
|
23
|
+
|
24
|
+
context "loaded from the soup" do
|
25
|
+
setup do
|
26
|
+
@base_path = File.join(File.dirname(__FILE__), *%w[.. tmp soup])
|
27
|
+
backend = Soup::Backends::FileBackend.new(@base_path)
|
28
|
+
@soup = Soup.new(backend)
|
29
|
+
end
|
30
|
+
|
31
|
+
teardown do
|
32
|
+
FileUtils.rm_rf(@base_path)
|
33
|
+
end
|
34
|
+
|
35
|
+
should "ignore empty content when comparing" do
|
36
|
+
@soup << {:name => 'test'}
|
37
|
+
assert_equal Soup::Snip.new({:name => 'test'}, nil), @soup['test']
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/test/soup_test.rb
CHANGED
@@ -17,12 +17,12 @@ class SoupTest < Test::Unit::TestCase
|
|
17
17
|
teardown do
|
18
18
|
FileUtils.rm_rf(base_path)
|
19
19
|
end
|
20
|
-
yield
|
20
|
+
yield
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
each_backend do
|
25
|
+
each_backend do
|
26
26
|
should "be able to store content" do
|
27
27
|
@soup << {:name => 'test', :content => "I like stuff, and things"}
|
28
28
|
assert_equal "I like stuff, and things", @soup['test'].content
|
@@ -48,7 +48,7 @@ class SoupTest < Test::Unit::TestCase
|
|
48
48
|
end
|
49
49
|
|
50
50
|
should "match using all parameters" do
|
51
|
-
assert_equal @
|
51
|
+
assert_equal [@murray], @soup[:powers => 'yes', :colour => 'red']
|
52
52
|
end
|
53
53
|
|
54
54
|
should "return an array if more than one snip matches" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: soup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 2
|
10
|
+
version: 1.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- James Adam
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-11-
|
18
|
+
date: 2010-11-30 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -46,6 +46,7 @@ files:
|
|
46
46
|
- README
|
47
47
|
- test/file_backend_test.rb
|
48
48
|
- test/multi_soup_backend_test.rb
|
49
|
+
- test/snip_test.rb
|
49
50
|
- test/soup_test.rb
|
50
51
|
- test/test_helper.rb
|
51
52
|
- lib/soup/backends/base.rb
|