factbase 0.0.7 → 0.0.8

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
  SHA256:
3
- metadata.gz: 453a090310ef10ace85c3ee099b85bd8744d24428923f1e896626b996d3124ca
4
- data.tar.gz: 0236a9f6bb4b4dacca29bd1d61da395a8dadb084b81e915b7694a763ecf0985b
3
+ metadata.gz: 4ff1dd0d8b331a0a2c90d6160e7e0594a186016338591d7fa3702b3fc7e29731
4
+ data.tar.gz: f95d83697fb8fb2aceab49547850a27548858db76a36a7a90a582257174214f0
5
5
  SHA512:
6
- metadata.gz: 00312f424b58cfda7eee00a7fba6792da9a5b439eab34e29745cdd481913df87afc016944387e95356ece05feddbc444d90ddb52bdf2a20d3bc4ac38e7224a79
7
- data.tar.gz: 224a5b63c85cf5fc604da26f8f4205a35fe6b3ace5f8fb959b6a2a3fd71f08dc79a2804215dab823c1143e02a8ddd06de0df3154912e116de04da97233ff8795
6
+ metadata.gz: 52582171bb9e9fa4be1d2c0670e3faa38de883675eb0db4a0efed94ad8d0d72437c8d1ce54d9e6442ecc4573ec68957cc99138d1a6b4580dfed7822397a863ca
7
+ data.tar.gz: 857be193e43d1340f7c17c9d7230322e0bcd994c228f279a56731168eda36c463d68e8e3177b350f76f6bb70a27a1391e25edf0bccc905333e1502b361423467
data/factbase.gemspec CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
26
26
  s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
27
27
  s.required_ruby_version = '>=2.3'
28
28
  s.name = 'factbase'
29
- s.version = '0.0.7'
29
+ s.version = '0.0.8'
30
30
  s.license = 'MIT'
31
31
  s.summary = 'Factbase'
32
32
  s.description = 'Fact base in memory and on disc'
@@ -39,5 +39,6 @@ Gem::Specification.new do |s|
39
39
  s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
40
40
  s.add_runtime_dependency 'json', '~> 2.7'
41
41
  s.add_runtime_dependency 'nokogiri', '~> 1.10'
42
+ s.add_runtime_dependency 'yaml', '~> 0.3'
42
43
  s.metadata['rubygems_mfa_required'] = 'true'
43
44
  end
data/lib/factbase/fact.rb CHANGED
@@ -20,6 +20,7 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  # SOFTWARE.
22
22
 
23
+ require 'json'
23
24
  require_relative '../factbase'
24
25
 
25
26
  # Fact.
@@ -32,26 +33,35 @@ class Factbase::Fact
32
33
  @map = map
33
34
  end
34
35
 
36
+ def to_s
37
+ @map.to_json
38
+ end
39
+
35
40
  def method_missing(*args)
36
41
  k = args[0].to_s
37
42
  if k.end_with?('=')
38
43
  kk = k[0..-2]
39
44
  raise "Invalid prop name '#{kk}'" unless kk.match?(/^[a-z][a-zA-Z0-9]+$/)
40
45
  @mutex.synchronize do
41
- @map[kk] = [] if @map[kk].nil?
46
+ before = @map[kk]
47
+ return if before == args[1]
48
+ if before.nil?
49
+ @map[kk] = args[1]
50
+ return
51
+ end
52
+ @map[kk] = [@map[kk]] unless @map[kk].is_a?(Array)
42
53
  @map[kk] << args[1]
43
54
  end
44
55
  nil
45
56
  elsif k == '[]'
46
- kk = args[1].to_s
47
- @mutex.synchronize do
48
- @map[kk] = [] if @map[kk].nil?
49
- end
50
- @map[kk]
57
+ @map[args[1].to_s]
51
58
  else
52
59
  v = @map[k]
53
- raise "Can't find '#{k}'" if v.nil?
54
- v[0]
60
+ if v.nil?
61
+ raise "Can't get '#{k}', the fact is empty" if @map.empty?
62
+ raise "Can't find '#{k}' attribute in [#{@map.keys.join(', ')}]"
63
+ end
64
+ v.is_a?(Array) ? v[0] : v
55
65
  end
56
66
  end
57
67
 
data/lib/factbase/term.rb CHANGED
@@ -84,7 +84,7 @@ class Factbase::Term
84
84
  def exists(fact)
85
85
  assert_args(1)
86
86
  k = @operands[0].to_s
87
- !fact[k].empty?
87
+ !fact[k].nil?
88
88
  end
89
89
 
90
90
  def absent(fact)
@@ -97,8 +97,9 @@ class Factbase::Term
97
97
  assert_args(2)
98
98
  k = @operands[0].to_s
99
99
  v = fact[k]
100
- return false if v.empty?
101
- v.include?(@operands[1])
100
+ return true if v == @operands[1]
101
+ return v.include?(@operands[1]) if v.is_a?(Array)
102
+ false
102
103
  end
103
104
 
104
105
  def lt(fact)
data/lib/factbase.rb CHANGED
@@ -22,6 +22,7 @@
22
22
 
23
23
  require 'json'
24
24
  require 'nokogiri'
25
+ require 'yaml'
25
26
 
26
27
  # Factbase.
27
28
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -99,10 +100,14 @@ class Factbase
99
100
  @maps.each do |m|
100
101
  xml.f do
101
102
  m.each do |k, vv|
102
- xml.send(:"#{k}") do
103
- vv.each do |v|
104
- xml.send(:v, v)
103
+ if vv.is_a?(Array)
104
+ xml.send(:"#{k}") do
105
+ vv.each do |v|
106
+ xml.send(:v, v)
107
+ end
105
108
  end
109
+ else
110
+ xml.send(:"#{k}", vv)
106
111
  end
107
112
  end
108
113
  end
@@ -110,4 +115,10 @@ class Factbase
110
115
  end
111
116
  end.to_xml
112
117
  end
118
+
119
+ # Convert the entire factbase into YAML.
120
+ # @return [String] The factbase in YAML format
121
+ def to_yaml
122
+ YAML.dump({ 'facts' => @maps })
123
+ end
113
124
  end
@@ -33,9 +33,30 @@ class TestFact < Minitest::Test
33
33
  map = {}
34
34
  f = Factbase::Fact.new(Mutex.new, map)
35
35
  f.foo = 42
36
- assert_equal(42, f.foo)
36
+ assert_equal(42, f.foo, f.to_s)
37
37
  f.foo = 256
38
- assert_equal(42, f.foo)
39
- assert_equal([42, 256], f['foo'])
38
+ assert_equal(42, f.foo, f.to_s)
39
+ assert_equal([42, 256], f['foo'], f.to_s)
40
+ end
41
+
42
+ def test_fails_when_empty
43
+ f = Factbase::Fact.new(Mutex.new, {})
44
+ assert_raises do
45
+ f.something
46
+ end
47
+ end
48
+
49
+ def test_fails_when_not_found
50
+ f = Factbase::Fact.new(Mutex.new, {})
51
+ f.first = 42
52
+ assert_raises do
53
+ f.second
54
+ end
55
+ end
56
+
57
+ def test_set_by_name
58
+ f = Factbase::Fact.new(Mutex.new, {})
59
+ f.send('foo=', 42)
60
+ assert_equal(42, f.foo, f.to_s)
40
61
  end
41
62
  end
@@ -23,6 +23,7 @@
23
23
  require 'minitest/autorun'
24
24
  require 'json'
25
25
  require 'nokogiri'
26
+ require 'yaml'
26
27
  require_relative '../lib/factbase'
27
28
 
28
29
  # Factbase main module test.
@@ -75,4 +76,17 @@ class TestFactbase < Minitest::Test
75
76
  assert(!xml.xpath('/fb[count(f) = 2]').empty?)
76
77
  assert(!xml.xpath('/fb/f/foo[v="42"]').empty?)
77
78
  end
79
+
80
+ def test_to_yaml
81
+ fb = Factbase.new
82
+ f = fb.insert
83
+ f.foo = 42
84
+ f.foo = 256
85
+ fb.insert
86
+ yaml = YAML.load(fb.to_yaml)
87
+ assert_equal(2, yaml['facts'].size)
88
+ assert_equal(42, yaml['facts'][0]['foo'][0])
89
+ assert_equal(256, yaml['facts'][0]['foo'][1])
90
+ assert_equal(2, yaml['facts'][1]['id'])
91
+ end
78
92
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: factbase
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.10'
41
+ - !ruby/object:Gem::Dependency
42
+ name: yaml
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.3'
41
55
  description: Fact base in memory and on disc
42
56
  email: yegor256@gmail.com
43
57
  executables: []