factbase 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
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: []