soup 1.0.8 → 1.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +3 -2
- data/lib/soup/backends/memory.rb +25 -0
- data/lib/soup/backends/multi_soup.rb +4 -0
- data/lib/soup/backends/read_only.rb +4 -0
- data/lib/soup/backends.rb +1 -0
- data/lib/soup/snip.rb +8 -0
- data/lib/soup/test_helper.rb +9 -0
- data/lib/soup.rb +10 -0
- data/test/soup_test.rb +27 -2
- data/test/test_helper_test.rb +21 -0
- metadata +26 -7
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.9"
|
25
25
|
s.summary = "A super-simple data store"
|
26
26
|
s.author = "James Adam"
|
27
27
|
s.email = "james@lazyatom.com"
|
@@ -41,7 +41,8 @@ spec = Gem::Specification.new do |s|
|
|
41
41
|
# s.add_dependency("some_other_gem", "~> 0.1.0")
|
42
42
|
|
43
43
|
# If your tests use any gems, include them here
|
44
|
-
s.add_development_dependency("kintama")
|
44
|
+
s.add_development_dependency("kintama", ">= 0.1.8")
|
45
|
+
s.add_development_dependency("rake")
|
45
46
|
end
|
46
47
|
|
47
48
|
# This task actually builds the gem. We also regenerate a static
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Soup
|
2
|
+
module Backends
|
3
|
+
class Memory < Base
|
4
|
+
def prepare
|
5
|
+
@snips = {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def save_snip(attributes)
|
9
|
+
@snips[attributes[:name]] = Snip.new(attributes, self)
|
10
|
+
end
|
11
|
+
|
12
|
+
def all_snips
|
13
|
+
@snips.values
|
14
|
+
end
|
15
|
+
|
16
|
+
def load_snip(name)
|
17
|
+
@snips[name]
|
18
|
+
end
|
19
|
+
|
20
|
+
def destroy(name)
|
21
|
+
@snips[name] = nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/soup/backends.rb
CHANGED
data/lib/soup/snip.rb
CHANGED
@@ -23,6 +23,10 @@ class Soup
|
|
23
23
|
other.is_a?(Snip) && matching_attributes(other)
|
24
24
|
end
|
25
25
|
|
26
|
+
def eql?(other)
|
27
|
+
self == other
|
28
|
+
end
|
29
|
+
|
26
30
|
def inspect
|
27
31
|
keys = @attributes.keys.dup
|
28
32
|
keys.delete(:name)
|
@@ -30,6 +34,10 @@ class Soup
|
|
30
34
|
"<Snip #{attrs.map { |(key,value)| "#{key}:#{value.inspect}"}.join(" ")}>"
|
31
35
|
end
|
32
36
|
|
37
|
+
def hash
|
38
|
+
@attributes.hash
|
39
|
+
end
|
40
|
+
|
33
41
|
def respond_to?(method)
|
34
42
|
@attributes.keys.include?(method.to_s)
|
35
43
|
end
|
data/lib/soup.rb
CHANGED
@@ -7,10 +7,14 @@ require 'fileutils'
|
|
7
7
|
class Soup
|
8
8
|
autoload :Backends, 'soup/backends'
|
9
9
|
autoload :Snip, 'soup/snip'
|
10
|
+
autoload :TestHelper, 'soup/test_helper'
|
11
|
+
|
12
|
+
class BackendIncompatibleError < StandardError; end
|
10
13
|
|
11
14
|
# Get the soup ready!
|
12
15
|
def initialize(backend=nil)
|
13
16
|
@backend = backend || Soup::Backends::FileBackend.new
|
17
|
+
check_backend_for_compatibility
|
14
18
|
@backend.prepare
|
15
19
|
end
|
16
20
|
|
@@ -50,6 +54,12 @@ class Soup
|
|
50
54
|
|
51
55
|
private
|
52
56
|
|
57
|
+
def check_backend_for_compatibility
|
58
|
+
methods = [:all_snips, :load_snip, :save_snip, :prepare, :destroy]
|
59
|
+
ok = methods.inject(true) { |ok, method| ok && @backend.respond_to?(method) }
|
60
|
+
raise BackendIncompatibleError unless ok
|
61
|
+
end
|
62
|
+
|
53
63
|
def symbolize_keys(hash)
|
54
64
|
hash.inject({}) { |h,(k,v)| h[k.to_sym] = v; h }
|
55
65
|
end
|
data/test/soup_test.rb
CHANGED
@@ -1,11 +1,36 @@
|
|
1
1
|
require "test_helper"
|
2
2
|
|
3
|
+
describe Soup do
|
4
|
+
context "checking backend compatibility" do
|
5
|
+
REQUIRED_METHODS = [:all_snips, :load_snip, :prepare, :save_snip, :destroy]
|
6
|
+
|
7
|
+
def backend_without(method_name)
|
8
|
+
methods = REQUIRED_METHODS - [method_name]
|
9
|
+
Class.new do
|
10
|
+
methods.each do |method|
|
11
|
+
define_method method do
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end.new
|
15
|
+
end
|
16
|
+
|
17
|
+
REQUIRED_METHODS.each do |method|
|
18
|
+
should "ensure #{method} is implemented" do
|
19
|
+
assert_raises Soup::BackendIncompatibleError do
|
20
|
+
Soup.new(backend_without(method))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
3
27
|
def each_backend(&block)
|
4
28
|
base_path = File.join(File.dirname(__FILE__), *%w[.. tmp soup])
|
5
29
|
backends = [
|
6
30
|
yaml_backend = Soup::Backends::YAMLBackend.new(base_path),
|
7
31
|
file_backend = Soup::Backends::FileBackend.new(base_path),
|
8
|
-
Soup::Backends::MultiSoup.new(yaml_backend)
|
32
|
+
Soup::Backends::MultiSoup.new(yaml_backend),
|
33
|
+
Soup::Backends::Memory.new
|
9
34
|
]
|
10
35
|
backends.each do |backend|
|
11
36
|
describe backend.class do
|
@@ -50,7 +75,7 @@ each_backend do
|
|
50
75
|
end
|
51
76
|
|
52
77
|
should "return an array if more than one snip matches" do
|
53
|
-
|
78
|
+
assert_same_elements [@james, @murray].map { |s| s.name }, @soup[:powers => 'yes'].map { |s| s.name }
|
54
79
|
end
|
55
80
|
|
56
81
|
should "return an empty array if no matching snips exist" do
|
@@ -0,0 +1,21 @@
|
|
1
|
+
describe Soup::TestHelper do
|
2
|
+
include Soup::TestHelper
|
3
|
+
|
4
|
+
setup do
|
5
|
+
@soup = stub_soup({:name => "a", :kind => "x"},
|
6
|
+
{:name => "b", :kind => "y"},
|
7
|
+
{:name => "c", :kind => "x"})
|
8
|
+
end
|
9
|
+
|
10
|
+
should "allow stubbing of all snips" do
|
11
|
+
assert_same_elements %w(a b c), @soup.all_snips.map { |s| s.name }
|
12
|
+
end
|
13
|
+
|
14
|
+
should "stub loading a snip by name" do
|
15
|
+
assert_equal "a", @soup["a"].name
|
16
|
+
end
|
17
|
+
|
18
|
+
should "stub loading snips by criteria" do
|
19
|
+
assert_same_elements %w(a c), @soup[:kind => "x"].map { |s| s.name }
|
20
|
+
end
|
21
|
+
end
|
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: 5
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 9
|
10
|
+
version: 1.0.9
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- James Adam
|
@@ -15,13 +15,27 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-07-29 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
|
22
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
hash: 11
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
- 1
|
31
|
+
- 8
|
32
|
+
version: 0.1.8
|
33
|
+
type: :development
|
23
34
|
prerelease: false
|
24
|
-
requirement:
|
35
|
+
requirement: *id001
|
36
|
+
name: kintama
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
25
39
|
none: false
|
26
40
|
requirements:
|
27
41
|
- - ">="
|
@@ -31,7 +45,9 @@ dependencies:
|
|
31
45
|
- 0
|
32
46
|
version: "0"
|
33
47
|
type: :development
|
34
|
-
|
48
|
+
prerelease: false
|
49
|
+
requirement: *id002
|
50
|
+
name: rake
|
35
51
|
description:
|
36
52
|
email: james@lazyatom.com
|
37
53
|
executables: []
|
@@ -49,14 +65,17 @@ files:
|
|
49
65
|
- test/snip_test.rb
|
50
66
|
- test/soup_test.rb
|
51
67
|
- test/test_helper.rb
|
68
|
+
- test/test_helper_test.rb
|
52
69
|
- lib/soup/backends/base.rb
|
53
70
|
- lib/soup/backends/file_backend.rb
|
71
|
+
- lib/soup/backends/memory.rb
|
54
72
|
- lib/soup/backends/multi_soup.rb
|
55
73
|
- lib/soup/backends/read_only.rb
|
56
74
|
- lib/soup/backends/yaml_backend.rb
|
57
75
|
- lib/soup/backends.rb
|
58
76
|
- lib/soup/empty_class.rb
|
59
77
|
- lib/soup/snip.rb
|
78
|
+
- lib/soup/test_helper.rb
|
60
79
|
- lib/soup.rb
|
61
80
|
has_rdoc: true
|
62
81
|
homepage: http://lazyatom.com
|