reference_book 0.0.1
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 +7 -0
- data/.gitignore +27 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +82 -0
- data/Rakefile +8 -0
- data/examples/config.rb +59 -0
- data/examples/interface_and_use.rb +129 -0
- data/examples/rails_controllers_and_views.rb +65 -0
- data/examples/rails_models.rb +103 -0
- data/lib/reference_book/book.rb +2 -0
- data/lib/reference_book/errors.rb +13 -0
- data/lib/reference_book/inflector.rb +34 -0
- data/lib/reference_book/library.rb +64 -0
- data/lib/reference_book/setup/collector.rb +28 -0
- data/lib/reference_book/setup/locked_book_spec.rb +51 -0
- data/lib/reference_book/setup/writer.rb +70 -0
- data/lib/reference_book/setup.rb +2 -0
- data/lib/reference_book/version.rb +3 -0
- data/lib/reference_book.rb +52 -0
- data/reference_book.gemspec +26 -0
- data/test/book_test.rb +118 -0
- data/test/inflector_test.rb +81 -0
- data/test/library_test.rb +166 -0
- data/test/reference_book_test.rb +197 -0
- data/test/setup/collector_test.rb +96 -0
- data/test/setup/locked_book_spec_test.rb +117 -0
- data/test/setup/writer_test.rb +202 -0
- data/test/test_helper.rb +4 -0
- metadata +121 -0
@@ -0,0 +1,70 @@
|
|
1
|
+
class ReferenceBook::Setup::Writer
|
2
|
+
|
3
|
+
|
4
|
+
def initialize(book_spec = nil)
|
5
|
+
@book_spec = book_spec
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
def create_book_with(raw_title, raw_library_key, collector)
|
11
|
+
values = collector.to_h
|
12
|
+
verify_values!(values)
|
13
|
+
|
14
|
+
book_title, library_key = sanitize_title_and_key(raw_title, raw_library_key)
|
15
|
+
|
16
|
+
verify_library_key!(library_key)
|
17
|
+
|
18
|
+
values[:title] = book_title
|
19
|
+
values[:library_key] = library_key
|
20
|
+
|
21
|
+
write_book_with(book_title, values)
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
|
28
|
+
def write_book_with(title, hash)
|
29
|
+
template = define_book_struct_with(title, hash.keys)
|
30
|
+
book = template.new
|
31
|
+
hash.each_pair { |k, v| book[k] = v }
|
32
|
+
book.freeze
|
33
|
+
book
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
def define_book_struct_with(title, keys)
|
40
|
+
ReferenceBook::Book.new(title, *keys)
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
def verify_values!(values)
|
46
|
+
@book_spec.verify_keys!(values.keys) if @book_spec
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
def verify_library_key!(key)
|
51
|
+
ReferenceBook::Library.verify_library_key!(key)
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
def sanitize_title_and_key(raw_title, raw_library_key)
|
56
|
+
raw_title ||= "Default"
|
57
|
+
book_title = ReferenceBook::Inflector.constantize(raw_title)
|
58
|
+
|
59
|
+
# If we have an explicit key, we just ensure it's a symbol,
|
60
|
+
# if we don't have an explicit key, we adapt the title
|
61
|
+
if raw_library_key
|
62
|
+
library_key = raw_library_key.to_sym
|
63
|
+
else
|
64
|
+
library_key = ReferenceBook::Inflector.make_key(raw_title)
|
65
|
+
end
|
66
|
+
|
67
|
+
[book_title, library_key]
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module ReferenceBook; end
|
2
|
+
|
3
|
+
require 'reference_book/book'
|
4
|
+
require 'reference_book/errors'
|
5
|
+
require 'reference_book/inflector'
|
6
|
+
require 'reference_book/library'
|
7
|
+
require 'reference_book/setup'
|
8
|
+
require 'reference_book/setup/collector'
|
9
|
+
require 'reference_book/setup/locked_book_spec'
|
10
|
+
require 'reference_book/setup/writer'
|
11
|
+
require 'reference_book/version'
|
12
|
+
|
13
|
+
|
14
|
+
module ReferenceBook
|
15
|
+
class << self
|
16
|
+
|
17
|
+
attr_reader :locked_book_spec
|
18
|
+
|
19
|
+
|
20
|
+
# to lock the structure of Books, optional
|
21
|
+
#
|
22
|
+
# ReferenceBook.define_book_structure :attr_1, :attr_2, 'attr_3', ...
|
23
|
+
#
|
24
|
+
def define_book_structure(*book_keys)
|
25
|
+
@locked_book_spec = Setup::LockedBookSpec.new(book_keys)
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
# with block with 1 argument
|
31
|
+
#
|
32
|
+
# ReferenceBook.write_book(title: :sym_or_str) do |book|
|
33
|
+
# book.some_prop = "foobar"
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
def write_book(opts = {}, &block)
|
37
|
+
collector = Setup::Collector.new
|
38
|
+
yield collector
|
39
|
+
|
40
|
+
writer = Setup::Writer.new(locked_book_spec)
|
41
|
+
book = writer.create_book_with(opts[:title], opts[:library_key], collector)
|
42
|
+
|
43
|
+
library.store(book)
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def library
|
48
|
+
ReferenceBook::Library
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'reference_book/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "reference_book"
|
8
|
+
spec.version = ReferenceBook::VERSION
|
9
|
+
spec.author = "Tommaso Pavese"
|
10
|
+
spec.summary = "A multi-context configuration library and DSL."
|
11
|
+
spec.description = "A multi-context configuration library and DSL. ReferenceBook provides an easy interface to define, validate and query multi-context configuration data."
|
12
|
+
spec.homepage = "https://github.com/tompave/reference_book"
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.required_ruby_version = '>= 2.0.0'
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0")
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
23
|
+
spec.add_development_dependency "rake", '~> 10.0'
|
24
|
+
|
25
|
+
spec.add_development_dependency 'minitest', '~> 5.3'
|
26
|
+
end
|
data/test/book_test.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BookTest < Minitest::Test
|
4
|
+
|
5
|
+
BOOK_STRUCT = ReferenceBook::Book.new("Example", :foo, :bar)
|
6
|
+
|
7
|
+
def setup
|
8
|
+
super
|
9
|
+
@book = BOOK_STRUCT.new
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def test_name
|
14
|
+
assert_equal "ReferenceBook::Book::Example", @book.class.name
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def test_setters
|
19
|
+
assert_respond_to @book, :foo=
|
20
|
+
assert_respond_to @book, :bar=
|
21
|
+
refute_respond_to @book, :baz=
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def test_getters
|
26
|
+
assert_respond_to @book, :foo
|
27
|
+
assert_respond_to @book, :bar
|
28
|
+
refute_respond_to @book, :baz
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
def test_set_with_method
|
34
|
+
@book.foo = 1234
|
35
|
+
assert_equal 1234, @book.foo
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
def test_set_with_hash_access
|
40
|
+
@book[:foo] = 1234
|
41
|
+
assert_equal 1234, @book.foo
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
def test_get_with_method
|
47
|
+
@book.foo = 9876
|
48
|
+
assert_equal 9876, @book.foo
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def test_get_with_hash_access
|
53
|
+
@book.foo = 9876
|
54
|
+
assert_equal 9876, @book[:foo]
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
def test_creation
|
59
|
+
template = ReferenceBook::Book.new("Foobar", :foo, :bar)
|
60
|
+
assert_equal Class, template.class
|
61
|
+
assert_equal "ReferenceBook::Book::Foobar", template.name
|
62
|
+
|
63
|
+
book = template.new
|
64
|
+
assert book.is_a?(ReferenceBook::Book)
|
65
|
+
assert_equal "ReferenceBook::Book::Foobar", book.class.name
|
66
|
+
|
67
|
+
refute_equal book, @book
|
68
|
+
assert_equal book, template.new
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
def test_to_h
|
74
|
+
assert_equal Hash, @book.to_h.class
|
75
|
+
assert_equal 2, @book.to_h.size
|
76
|
+
assert_includes @book.to_h.keys, :foo
|
77
|
+
assert_includes @book.to_h.keys, :bar
|
78
|
+
assert_nil @book.to_h[:foo]
|
79
|
+
assert_nil @book.to_h[:bar]
|
80
|
+
|
81
|
+
@book.foo = 11
|
82
|
+
@book.bar = 22
|
83
|
+
assert_equal 11, @book.to_h[:foo]
|
84
|
+
assert_equal 22, @book.to_h[:bar]
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
def test_freeze_methods
|
90
|
+
assert_respond_to @book, :freeze
|
91
|
+
assert_respond_to @book, :frozen?
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
def test_freeze_effects
|
96
|
+
refute @book.frozen?
|
97
|
+
@book.freeze
|
98
|
+
assert @book.frozen?
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
def test_fronzen_book_attributes
|
103
|
+
assert_nil @book.foo
|
104
|
+
@book.foo = 1
|
105
|
+
assert_equal 1, @book.foo
|
106
|
+
@book.freeze
|
107
|
+
assert_equal 1, @book.foo
|
108
|
+
|
109
|
+
assert_raises RuntimeError do
|
110
|
+
@book.foo = 2
|
111
|
+
end
|
112
|
+
|
113
|
+
assert_raises RuntimeError do
|
114
|
+
@book.bar = 3
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class InflectorTest < Minitest::Test
|
4
|
+
|
5
|
+
def test_constantize_simple_symbol
|
6
|
+
result = ReferenceBook::Inflector.constantize :hello
|
7
|
+
assert_equal "Hello", result
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
def test_constantize_two_words
|
12
|
+
result = ReferenceBook::Inflector.constantize 'hello world'
|
13
|
+
assert_equal "Helloworld", result
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
def test_constantize_already_ok
|
18
|
+
result = ReferenceBook::Inflector.constantize 'HelloWorld'
|
19
|
+
assert_equal "HelloWorld", result
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def test_constantize_other_chars
|
24
|
+
result = ReferenceBook::Inflector.constantize "hello-world!11"
|
25
|
+
assert_equal "Helloworld", result
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def test_constantize_nil
|
30
|
+
result = ReferenceBook::Inflector.constantize nil
|
31
|
+
assert_equal nil, result
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
def test_constantize_empty
|
36
|
+
result = ReferenceBook::Inflector.constantize ''
|
37
|
+
assert_equal nil, result
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
def test_make_key_simple
|
42
|
+
result = ReferenceBook::Inflector.make_key "hello"
|
43
|
+
assert_equal :hello, result
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def test_make_key_two_words
|
48
|
+
result = ReferenceBook::Inflector.make_key "hello world"
|
49
|
+
assert_equal :hello_world, result
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def test_make_key_camel
|
54
|
+
result = ReferenceBook::Inflector.make_key "HelloWorldDear"
|
55
|
+
assert_equal :hello_world_dear, result
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
def test_make_key_symbol
|
60
|
+
result = ReferenceBook::Inflector.make_key :hello
|
61
|
+
assert_equal :hello, result
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
def test_make_key_upcase
|
66
|
+
result = ReferenceBook::Inflector.make_key "heLLO"
|
67
|
+
assert_equal :he_llo, result
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
def test_make_key_with_numbers
|
72
|
+
result = ReferenceBook::Inflector.make_key "hello123_world"
|
73
|
+
assert_equal :hello123_world, result
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
def test_make_key_nil
|
78
|
+
result = ReferenceBook::Inflector.make_key nil
|
79
|
+
assert_equal nil, result
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class LibraryTest < Minitest::Test
|
4
|
+
|
5
|
+
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
ReferenceBook::Library.empty!
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
super
|
14
|
+
ReferenceBook::Library.empty!
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
def test_shelf_class
|
20
|
+
assert_equal Hash, ReferenceBook::Library.shelf.class
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def test_index_class
|
25
|
+
assert_equal Array, ReferenceBook::Library.index.class
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
def test_with_no_book_stored
|
31
|
+
assert_empty ReferenceBook::Library.index
|
32
|
+
assert_empty ReferenceBook::Library.shelf
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
def test_store
|
37
|
+
refute_respond_to ReferenceBook::Library, :one
|
38
|
+
|
39
|
+
book = make_book(:one)
|
40
|
+
result = ReferenceBook::Library.store(book)
|
41
|
+
|
42
|
+
assert_equal book, result
|
43
|
+
|
44
|
+
refute_empty ReferenceBook::Library.index
|
45
|
+
assert_includes ReferenceBook::Library.index, :one
|
46
|
+
assert_equal 1, ReferenceBook::Library.index.size
|
47
|
+
|
48
|
+
refute_empty ReferenceBook::Library.shelf
|
49
|
+
assert_equal book, ReferenceBook::Library.shelf[:one]
|
50
|
+
assert_equal 1, ReferenceBook::Library.shelf.size
|
51
|
+
|
52
|
+
assert_respond_to ReferenceBook::Library, :one
|
53
|
+
assert_equal book, ReferenceBook::Library.one
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
def test_store_incremental
|
59
|
+
assert_empty ReferenceBook::Library.index
|
60
|
+
assert_empty ReferenceBook::Library.shelf
|
61
|
+
|
62
|
+
book_1 = make_book(:one)
|
63
|
+
book_2 = make_book(:two)
|
64
|
+
|
65
|
+
ReferenceBook::Library.store book_1
|
66
|
+
|
67
|
+
assert_equal 1, ReferenceBook::Library.index.size
|
68
|
+
assert_includes ReferenceBook::Library.index, :one
|
69
|
+
|
70
|
+
assert_equal 1, ReferenceBook::Library.shelf.size
|
71
|
+
assert_equal book_1, ReferenceBook::Library.shelf[:one]
|
72
|
+
|
73
|
+
assert_respond_to ReferenceBook::Library, :one
|
74
|
+
assert_equal book_1, ReferenceBook::Library.one
|
75
|
+
|
76
|
+
|
77
|
+
ReferenceBook::Library.store book_2
|
78
|
+
|
79
|
+
assert_equal 2, ReferenceBook::Library.index.size
|
80
|
+
assert_includes ReferenceBook::Library.index, :one
|
81
|
+
assert_includes ReferenceBook::Library.index, :two
|
82
|
+
|
83
|
+
assert_equal 2, ReferenceBook::Library.shelf.size
|
84
|
+
assert_equal book_1, ReferenceBook::Library.shelf[:one]
|
85
|
+
assert_equal book_2, ReferenceBook::Library.shelf[:two]
|
86
|
+
|
87
|
+
assert_respond_to ReferenceBook::Library, :one
|
88
|
+
assert_equal book_1, ReferenceBook::Library.one
|
89
|
+
assert_respond_to ReferenceBook::Library, :two
|
90
|
+
assert_equal book_2, ReferenceBook::Library.two
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
def test_empty
|
96
|
+
book = make_book(:one)
|
97
|
+
ReferenceBook::Library.store(book)
|
98
|
+
|
99
|
+
assert_includes ReferenceBook::Library.index, :one
|
100
|
+
assert_equal book, ReferenceBook::Library.shelf[:one]
|
101
|
+
assert_respond_to ReferenceBook::Library, :one
|
102
|
+
|
103
|
+
ReferenceBook::Library.empty!
|
104
|
+
|
105
|
+
assert_empty ReferenceBook::Library.index
|
106
|
+
assert_empty ReferenceBook::Library.shelf
|
107
|
+
refute_respond_to ReferenceBook::Library, :one
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
def test_hash_access
|
114
|
+
assert_nil ReferenceBook::Library[:one]
|
115
|
+
assert_nil ReferenceBook::Library[:two]
|
116
|
+
|
117
|
+
book = make_book(:one)
|
118
|
+
result = ReferenceBook::Library.store(book)
|
119
|
+
|
120
|
+
assert_equal book, ReferenceBook::Library[:one]
|
121
|
+
assert_nil ReferenceBook::Library[:two]
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
|
126
|
+
def test_accessor_methods
|
127
|
+
refute_respond_to ReferenceBook::Library, :one
|
128
|
+
refute_respond_to ReferenceBook::Library, :two
|
129
|
+
|
130
|
+
book = make_book(:one)
|
131
|
+
result = ReferenceBook::Library.store(book)
|
132
|
+
|
133
|
+
assert_respond_to ReferenceBook::Library, :one
|
134
|
+
assert_equal book, ReferenceBook::Library.one
|
135
|
+
refute_respond_to ReferenceBook::Library, :two
|
136
|
+
end
|
137
|
+
|
138
|
+
|
139
|
+
|
140
|
+
def test_verify_library_key
|
141
|
+
assert_nil ReferenceBook::Library.verify_library_key! :one
|
142
|
+
assert_nil ReferenceBook::Library.verify_library_key! :two
|
143
|
+
|
144
|
+
ReferenceBook::Library.store(make_book(:one))
|
145
|
+
|
146
|
+
assert_raises ReferenceBook::BookDefinitionError do
|
147
|
+
ReferenceBook::Library.verify_library_key! :one
|
148
|
+
end
|
149
|
+
assert_nil ReferenceBook::Library.verify_library_key! :two
|
150
|
+
end
|
151
|
+
|
152
|
+
|
153
|
+
|
154
|
+
private
|
155
|
+
|
156
|
+
BOOK_STRUCT = ReferenceBook::Book.new("ExampleLib", :title, :library_key)
|
157
|
+
|
158
|
+
def make_book(key)
|
159
|
+
book = BOOK_STRUCT.new
|
160
|
+
book.title = "#{key}_title"
|
161
|
+
book.library_key = key
|
162
|
+
book
|
163
|
+
end
|
164
|
+
|
165
|
+
|
166
|
+
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ReferenceBookTest < Minitest::Test
|
4
|
+
|
5
|
+
|
6
|
+
def teardown
|
7
|
+
super
|
8
|
+
ReferenceBook::Library.empty!
|
9
|
+
ReferenceBook.instance_eval { @locked_book_spec = nil }
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
def test_define_book_structure
|
15
|
+
assert_nil ReferenceBook.locked_book_spec
|
16
|
+
spec = ReferenceBook.define_book_structure :one, :two
|
17
|
+
|
18
|
+
assert spec.is_a?(ReferenceBook::Setup::LockedBookSpec)
|
19
|
+
assert_equal spec, ReferenceBook.locked_book_spec
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def test_define_book_structure_fail
|
24
|
+
assert_nil ReferenceBook.locked_book_spec
|
25
|
+
|
26
|
+
assert_raises ReferenceBook::LockedBookSpecError do
|
27
|
+
ReferenceBook.define_book_structure
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
def test_write_book_normal
|
36
|
+
assert_empty ReferenceBook::Library.index
|
37
|
+
assert_empty ReferenceBook::Library.shelf
|
38
|
+
refute_respond_to ReferenceBook::Library, :ref_book
|
39
|
+
|
40
|
+
book = ReferenceBook.write_book(title: "RefBook") do |b|
|
41
|
+
b.foo = 111
|
42
|
+
b.bar = 222
|
43
|
+
end
|
44
|
+
|
45
|
+
assert book.is_a?(ReferenceBook::Book)
|
46
|
+
assert_equal "ReferenceBook::Book::RefBook", book.class.name
|
47
|
+
assert book.frozen?
|
48
|
+
assert_equal "RefBook", book.title
|
49
|
+
assert_equal :ref_book, book.library_key
|
50
|
+
|
51
|
+
assert_equal 111, book.foo
|
52
|
+
assert_equal 222, book.bar
|
53
|
+
|
54
|
+
assert_equal 1, ReferenceBook::Library.index.size
|
55
|
+
assert_equal 1, ReferenceBook::Library.shelf.size
|
56
|
+
|
57
|
+
assert_includes ReferenceBook::Library.index, :ref_book
|
58
|
+
assert_respond_to ReferenceBook::Library, :ref_book
|
59
|
+
assert_equal book, ReferenceBook::Library.ref_book
|
60
|
+
|
61
|
+
assert_equal book, ReferenceBook::Library.shelf[:ref_book]
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
def test_write_more_than_one_book
|
68
|
+
assert_empty ReferenceBook::Library.index
|
69
|
+
assert_empty ReferenceBook::Library.shelf
|
70
|
+
|
71
|
+
ReferenceBook.write_book(title: "RefBookA") do |b|
|
72
|
+
b.foo = 111
|
73
|
+
b.bar = 222
|
74
|
+
end
|
75
|
+
|
76
|
+
assert_equal 1, ReferenceBook::Library.index.size
|
77
|
+
assert_equal 1, ReferenceBook::Library.shelf.size
|
78
|
+
|
79
|
+
ReferenceBook.write_book(title: "RefBookB") do |b|
|
80
|
+
b.foo = 111
|
81
|
+
b.bar = 222
|
82
|
+
end
|
83
|
+
|
84
|
+
assert_equal 2, ReferenceBook::Library.index.size
|
85
|
+
assert_equal 2, ReferenceBook::Library.shelf.size
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
def test_attributes_of_created_book
|
93
|
+
book = ReferenceBook.write_book(title: "RefBookC") do |b|
|
94
|
+
b.foo = 111
|
95
|
+
b.bar = 222
|
96
|
+
b.baz = 333
|
97
|
+
end
|
98
|
+
|
99
|
+
assert_equal 111, book.foo
|
100
|
+
assert_equal 222, book.bar
|
101
|
+
assert_equal 333, book.baz
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
def test_write_book_duplicated_key
|
108
|
+
book = ReferenceBook.write_book(title: "Hello", library_key: :existing) do |b|
|
109
|
+
b.foo = 'hello'
|
110
|
+
end
|
111
|
+
|
112
|
+
assert book.is_a?(ReferenceBook::Book)
|
113
|
+
assert_equal 1, ReferenceBook::Library.index.size
|
114
|
+
|
115
|
+
assert_raises ReferenceBook::BookDefinitionError do
|
116
|
+
ReferenceBook.write_book(title: "HelloA", library_key: :existing) do |b|
|
117
|
+
b.foo = 'hello'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
book = ReferenceBook.write_book(title: "HelloB", library_key: :another) do |b|
|
123
|
+
b.foo = 'hello'
|
124
|
+
end
|
125
|
+
|
126
|
+
assert book.is_a?(ReferenceBook::Book)
|
127
|
+
assert_equal 2, ReferenceBook::Library.index.size
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
|
132
|
+
def test_create_book_with_spec_pass
|
133
|
+
ReferenceBook.define_book_structure :one, :two, :three
|
134
|
+
|
135
|
+
book = ReferenceBook.write_book(title: "aaaa") do |b|
|
136
|
+
b.one = 1
|
137
|
+
b.two = 2
|
138
|
+
b.three = 3
|
139
|
+
end
|
140
|
+
|
141
|
+
assert book.is_a?(ReferenceBook::Book)
|
142
|
+
assert_equal 1, ReferenceBook::Library.index.size
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
def test_create_book_with_spec_fail_missing
|
148
|
+
ReferenceBook.define_book_structure :one, :two, :three
|
149
|
+
|
150
|
+
assert_raises ReferenceBook::BookDefinitionError do
|
151
|
+
ReferenceBook.write_book(title: "bbbb") do |b|
|
152
|
+
b.one = 1
|
153
|
+
b.two = 2
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
def test_create_book_with_spec_fail_unexpected
|
160
|
+
ReferenceBook.define_book_structure :one, :two, :three
|
161
|
+
|
162
|
+
assert_raises ReferenceBook::BookDefinitionError do
|
163
|
+
ReferenceBook.write_book(title: "cccc") do |b|
|
164
|
+
b.one = 1
|
165
|
+
b.two = 2
|
166
|
+
b.three = 3
|
167
|
+
b.four = 4
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
|
173
|
+
def test_create_book_with_spec_fail_missing_and_unexpected
|
174
|
+
ReferenceBook.define_book_structure :one, :two, :three
|
175
|
+
|
176
|
+
assert_raises ReferenceBook::BookDefinitionError do
|
177
|
+
ReferenceBook.write_book(title: "dddd") do |b|
|
178
|
+
b.one = 1
|
179
|
+
b.four = 4
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
def test_library
|
188
|
+
assert_equal ReferenceBook::Library, ReferenceBook.library
|
189
|
+
end
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
def test_locked_book_spec
|
194
|
+
assert_respond_to ReferenceBook, :locked_book_spec
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|