xembly 0.2 → 0.3

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
  SHA1:
3
- metadata.gz: 29df4812f6cfbf4400568346dbf3009e31575c15
4
- data.tar.gz: a0f01f35ff844ccb40761482ced502026c6a06e3
3
+ metadata.gz: aefd3284a7d99ffa9bc9b2d477263a1b47a220a3
4
+ data.tar.gz: 1d795786c9081702f40b6aa43668af5d07964795
5
5
  SHA512:
6
- metadata.gz: e527295ed7feea2209226b8a3a9fb8fc0e744af05b693b3d1cbe46ef1ccfe72ee0ecf1b63792683aaf7bd9e541d682404e0223a9c2a5eb1f21b5669d814ad2fe
7
- data.tar.gz: f4ecbb8c0a7b02bdfb5977ff132b68bdfa5da5f7c1c82f4b80fb828f2ff7cd6eea35508b94569d46b65f59ea65c72f759c54573a7fd2fc114738b6ad83ee7b55
6
+ metadata.gz: f56633f3ed7ebe4f8feea6fe724d7f1a22a14e721a8f12e4665aadfcaf567fd43443f202c0eb91b8ac29dfdb22c7fad44a858d609c0a399b90976b28941aed52
7
+ data.tar.gz: 033130d913d80d85d0f205ec519dfcd474d7626b1f3577f4dede4a54a283a11591cb830669deef211b2f3ea45f9088509be7f67d7d2348bd39f0f681702082e5
data/.rubocop.yml CHANGED
@@ -2,3 +2,5 @@ MethodLength:
2
2
  Max: 30
3
3
  Style/ClassLength:
4
4
  Max: 150
5
+ Style/CyclomaticComplexity:
6
+ Max: 20
data/README.md CHANGED
@@ -36,7 +36,7 @@ in file `doc.xml`:
36
36
  ```xml
37
37
  <books>
38
38
  <book isbn="0735619654">Object Thinking</book>
39
- <book isbn="1519166915">Elegan Objects</book>
39
+ <book isbn="1519166915">Elegant Objects</book>
40
40
  </books>
41
41
  ```
42
42
 
@@ -46,7 +46,7 @@ Now, say, you want to add one more book there:
46
46
  $ xembly --xml doc.xml 'XPATH "/books"; ADD "book"; ATTR "isbn", "0201379430"; SET "Object Design";'
47
47
  <books>
48
48
  <book isbn="0735619654">Object Thinking</book>
49
- <book isbn="1519166915">Elegan Objects</book>
49
+ <book isbn="1519166915">Elegant Objects</book>
50
50
  <book isbn="0201379430">Object Design</book>
51
51
  </books>
52
52
  ```
data/bin/xembly CHANGED
@@ -24,11 +24,11 @@
24
24
  STDOUT.sync = true
25
25
 
26
26
  require 'xembly'
27
- require 'slop'
28
27
  require 'xembly/version'
28
+ require 'slop'
29
29
 
30
30
  opts = Slop.parse(ARGV, strict: true, help: true) do |o|
31
- o.banner = "Usage (#{Xembly::VERSION}): xembly [options]"
31
+ o.banner = "Usage (#{Xembly::VERSION}): xembly [options] [directives]"
32
32
  o.on '-h', '--help', 'Print help' do
33
33
  puts o
34
34
  exit
data/features/cli.feature CHANGED
@@ -17,17 +17,31 @@ Feature: Command Line Processing
17
17
  <books>
18
18
  <book id="1"/>
19
19
  <book id="2"/>
20
+ <garbage/>
20
21
  </books>
21
22
  """
22
23
  And I have a "dirs.txt" file with content:
23
24
  """
24
25
  XPATH "/books";
25
26
  ADD "book";
27
+ ATTR "isbn", "1519166915";
28
+ SET "Elegant Objects";
29
+ UP;
30
+ ADD "author";
31
+ ADDIF "name";
32
+ SET "yegor";
33
+ UP; UP;
34
+ XPATH "garbage";
35
+ STRICT "1";
36
+ REMOVE;
26
37
  """
27
38
  When I run bin/xembly with "-v -d dirs.txt -f out.xml -x text.xml"
28
39
  Then Exit code is zero
29
40
  And Stdout contains "reading text.xml"
30
41
  And XML file "out.xml" matches "/books[count(book) = 3]"
42
+ And XML file "out.xml" matches "/books/book[@isbn='1519166915' and .='Elegant Objects']"
43
+ And XML file "out.xml" matches "/books[author='yegor']"
44
+ And XML file "out.xml" matches "/books[not(garbage)]"
31
45
 
32
46
  Scenario: Rejects unknown options
33
47
  When I run bin/xembly with "--some-unknown-option"
data/lib/xembly/add.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 'xembly'
23
24
  require 'nokogiri'
24
25
 
25
26
  module Xembly
@@ -37,6 +38,7 @@ module Xembly
37
38
  child = Nokogiri::XML::Node.new(@name, dom)
38
39
  node.add_child(child)
39
40
  after.push(child)
41
+ Xembly.log.info "node \"#{@name}\" added to \"#{node.name}\""
40
42
  end
41
43
  after
42
44
  end
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright (c) 2016 Yegor Bugayenko
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'xembly'
24
+ require 'nokogiri'
25
+
26
+ module Xembly
27
+ # ADDIF directive
28
+ class AddIf
29
+ # Ctor.
30
+ # +name+:: Node name to add
31
+ def initialize(name)
32
+ @name = name
33
+ end
34
+
35
+ def exec(dom, cursor)
36
+ after = []
37
+ cursor.each do |node|
38
+ if !node.element_children.any? { |e| e.name == @name }
39
+ child = Nokogiri::XML::Node.new(@name, dom)
40
+ node.add_child(child)
41
+ after.push(child)
42
+ Xembly.log.info "node \"#{@name}\" added to \"#{node.name}\""
43
+ else
44
+ after.push(node)
45
+ end
46
+ end
47
+ after
48
+ end
49
+ end
50
+ end
data/lib/xembly/attr.rb CHANGED
@@ -20,6 +20,8 @@
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 'xembly'
24
+
23
25
  module Xembly
24
26
  # ATTR directive
25
27
  class Attr
@@ -34,6 +36,7 @@ module Xembly
34
36
  def exec(_, cursor)
35
37
  cursor.each do |node|
36
38
  node[@name] = @value
39
+ Xembly.log.info "attribute \"#{@name}\" set for node \"#{node.name}\""
37
40
  end
38
41
  cursor
39
42
  end
@@ -21,7 +21,12 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  require 'xembly/add'
24
+ require 'xembly/addif'
24
25
  require 'xembly/attr'
26
+ require 'xembly/remove'
27
+ require 'xembly/set'
28
+ require 'xembly/strict'
29
+ require 'xembly/up'
25
30
  require 'xembly/xpath'
26
31
 
27
32
  module Xembly
@@ -47,15 +52,25 @@ module Xembly
47
52
 
48
53
  def self.map(text)
49
54
  cmd, tail = text.strip.split(/\s+/, 2)
50
- args = tail.strip
55
+ args = (tail.nil? ? '' : tail).strip
51
56
  .scan(/"([^"]+)"/)
52
57
  .flatten
53
58
  .map { |a| a.tr('"', '') }
54
59
  case cmd.upcase
55
60
  when 'ADD'
56
61
  Add.new(args[0])
62
+ when 'ADDIF'
63
+ AddIf.new(args[0])
57
64
  when 'ATTR'
58
65
  Attr.new(args[0], args[1])
66
+ when 'REMOVE'
67
+ Remove.new
68
+ when 'SET'
69
+ Set.new(args[0])
70
+ when 'STRICT'
71
+ Strict.new(args[0])
72
+ when 'UP'
73
+ Up.new
59
74
  when 'XPATH'
60
75
  Xpath.new(args[0])
61
76
  else
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright (c) 2016 Yegor Bugayenko
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'xembly'
24
+
25
+ module Xembly
26
+ # REMOVE directive
27
+ class Remove
28
+ def exec(_, cursor)
29
+ after = []
30
+ cursor.each do |node|
31
+ Xembly.log.info "node \"#{node.name}\" removed"
32
+ node.remove
33
+ after.push(node.parent)
34
+ end
35
+ after
36
+ end
37
+ end
38
+ end
data/lib/xembly/set.rb ADDED
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright (c) 2016 Yegor Bugayenko
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'xembly'
24
+
25
+ module Xembly
26
+ # SET directive
27
+ class Set
28
+ # Ctor.
29
+ # +value+:: Text value to set
30
+ def initialize(value)
31
+ @value = value
32
+ end
33
+
34
+ def exec(_, cursor)
35
+ cursor.each do |node|
36
+ node.content = @value
37
+ Xembly.log.info "node \"#{node.name}\" text content set"
38
+ end
39
+ cursor
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright (c) 2016 Yegor Bugayenko
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'nokogiri'
24
+
25
+ module Xembly
26
+ # STRICT directive
27
+ class Strict
28
+ # Ctor.
29
+ # +count+:: How many nodes to expect
30
+ def initialize(count)
31
+ @count = count.to_i
32
+ end
33
+
34
+ def exec(_, cursor)
35
+ fail "there are #{cursor.length} nodes, while #{@count} expected" unless \
36
+ cursor.length == @count
37
+ cursor
38
+ end
39
+ end
40
+ end
data/lib/xembly/up.rb ADDED
@@ -0,0 +1,36 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright (c) 2016 Yegor Bugayenko
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'nokogiri'
24
+
25
+ module Xembly
26
+ # UP directive
27
+ class Up
28
+ def exec(_, cursor)
29
+ after = []
30
+ cursor.each do |node|
31
+ after.push(node.parent)
32
+ end
33
+ after
34
+ end
35
+ end
36
+ end
@@ -25,5 +25,5 @@
25
25
  # Copyright:: Copyright (c) 2016 Yegor Bugayenko
26
26
  # License:: MIT
27
27
  module Xembly
28
- VERSION = '0.2'
28
+ VERSION = '0.3'
29
29
  end
data/lib/xembly/xpath.rb CHANGED
@@ -31,8 +31,12 @@ module Xembly
31
31
  @path = path
32
32
  end
33
33
 
34
- def exec(dom, _)
35
- dom.xpath(@path)
34
+ def exec(_, cursor)
35
+ after = []
36
+ cursor.each do |node|
37
+ node.xpath(@path).each { |n| after.push(n) }
38
+ end
39
+ after
36
40
  end
37
41
  end
38
42
  end
@@ -0,0 +1,55 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright (c) 2016 Yegor Bugayenko
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'xembly/addif'
24
+ require 'test__helper'
25
+
26
+ # Xembly::AddIf tests.
27
+ # Author:: Yegor Bugayenko (yegor@teamed.io)
28
+ # Copyright:: Copyright (c) 2016 Yegor Bugayenko
29
+ # License:: MIT
30
+ class TestAddIf < XeTest
31
+ def test_skips_nodes
32
+ dom = Nokogiri::XML('<books><book/></books>')
33
+ Xembly::AddIf.new('book').exec(dom, [dom.xpath('/*').first])
34
+ matches(
35
+ dom.to_xml,
36
+ [
37
+ '/books',
38
+ '/books[count(book)=1]'
39
+ ]
40
+ )
41
+ end
42
+
43
+ def test_adds_nodes
44
+ dom = Nokogiri::XML('<books><book/></books>')
45
+ Xembly::AddIf.new('book-2').exec(dom, [dom.xpath('/*').first])
46
+ matches(
47
+ dom.to_xml,
48
+ [
49
+ '/books',
50
+ '/books[count(book)=1]',
51
+ '/books[count(book-2)=1]'
52
+ ]
53
+ )
54
+ end
55
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright (c) 2016 Yegor Bugayenko
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'xembly/remove'
24
+ require 'test__helper'
25
+
26
+ # Xembly::Remove tests.
27
+ # Author:: Yegor Bugayenko (yegor@teamed.io)
28
+ # Copyright:: Copyright (c) 2016 Yegor Bugayenko
29
+ # License:: MIT
30
+ class TestRemove < XeTest
31
+ def test_adds_nodes
32
+ dom = Nokogiri::XML('<books><book id="1"/><book id="2"/></books>')
33
+ Xembly::Remove.new.exec(dom, [dom.xpath('/books/book[@id=1]').first])
34
+ matches(
35
+ dom.to_xml,
36
+ [
37
+ '/books',
38
+ '/books[count(book)=1]'
39
+ ]
40
+ )
41
+ end
42
+ end
data/test/test_set.rb ADDED
@@ -0,0 +1,43 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright (c) 2016 Yegor Bugayenko
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'xembly/set'
24
+ require 'test__helper'
25
+
26
+ # Xembly::Set tests.
27
+ # Author:: Yegor Bugayenko (yegor@teamed.io)
28
+ # Copyright:: Copyright (c) 2016 Yegor Bugayenko
29
+ # License:: MIT
30
+ class TestSet < XeTest
31
+ def test_sets_values
32
+ dom = Nokogiri::XML('<books><book/></books>')
33
+ Xembly::Set.new('hello').exec(dom, [dom.xpath('/books/book').first])
34
+ matches(
35
+ dom.to_xml,
36
+ [
37
+ '/books',
38
+ '/books[count(book)=1]',
39
+ '/books/book[.="hello"]'
40
+ ]
41
+ )
42
+ end
43
+ end
data/test/test_xembler.rb CHANGED
@@ -33,13 +33,16 @@ require 'test__helper'
33
33
  class TestXembler < XeTest
34
34
  def test_modifies_xml
35
35
  xembler = Xembly::Xembler.new(
36
- Xembly::Directives.new('XPATH "/books"; ADD "book"; ADD "test";')
36
+ Xembly::Directives.new(
37
+ 'XPATH "/books"; ADD "book"; ADD "test"; UP; ADD "title"; SET "hi";'
38
+ )
37
39
  )
38
40
  matches(
39
41
  xembler.apply('<books/>').to_xml,
40
42
  [
41
43
  '/*',
42
- '/books[count(book)=1]'
44
+ '/books[count(book)=1]',
45
+ '/books/book[test and title]'
43
46
  ]
44
47
  )
45
48
  end
data/test/test_xembly.rb CHANGED
@@ -48,14 +48,18 @@ class TestXembly < XeTest
48
48
  xml = File.join(dir, 'input.xml')
49
49
  File.write(xml, '<books/>')
50
50
  dirs = File.join(dir, 'dirs.txt')
51
- File.write(dirs, 'XPATH "/books"; ADD "book"; ATTR "id", "123";')
51
+ File.write(
52
+ dirs,
53
+ 'XPATH "/books"; ADD "book"; ATTR "id", "123"; SET "Elegant Objects";'
54
+ )
52
55
  opts = opts(['--xml', xml, '--dirs', dirs])
53
56
  matches(
54
57
  Xembly::Base.new(opts).xml,
55
58
  [
56
59
  '/books',
57
60
  '/books[count(book)=1]',
58
- '/books/book[@id=123]'
61
+ '/books/book[@id=123]',
62
+ '/books/book[@id=123 and .="Elegant Objects"]'
59
63
  ]
60
64
  )
61
65
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xembly
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: '0.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
@@ -179,15 +179,23 @@ files:
179
179
  - features/support/env.rb
180
180
  - lib/xembly.rb
181
181
  - lib/xembly/add.rb
182
+ - lib/xembly/addif.rb
182
183
  - lib/xembly/attr.rb
183
184
  - lib/xembly/directives.rb
185
+ - lib/xembly/remove.rb
186
+ - lib/xembly/set.rb
187
+ - lib/xembly/strict.rb
188
+ - lib/xembly/up.rb
184
189
  - lib/xembly/version.rb
185
190
  - lib/xembly/xembler.rb
186
191
  - lib/xembly/xpath.rb
187
192
  - test/test__helper.rb
188
193
  - test/test_add.rb
194
+ - test/test_addif.rb
189
195
  - test/test_attr.rb
190
196
  - test/test_directives.rb
197
+ - test/test_remove.rb
198
+ - test/test_set.rb
191
199
  - test/test_xembler.rb
192
200
  - test/test_xembly.rb
193
201
  - xembly.gemspec
@@ -223,7 +231,10 @@ test_files:
223
231
  - features/support/env.rb
224
232
  - test/test__helper.rb
225
233
  - test/test_add.rb
234
+ - test/test_addif.rb
226
235
  - test/test_attr.rb
227
236
  - test/test_directives.rb
237
+ - test/test_remove.rb
238
+ - test/test_set.rb
228
239
  - test/test_xembler.rb
229
240
  - test/test_xembly.rb