duxml 0.8.8 → 0.8.9

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/bin/validate_xml +30 -30
  3. data/lib/duxml.rb +76 -76
  4. data/lib/duxml/doc.rb +108 -91
  5. data/lib/duxml/doc/element.rb +250 -250
  6. data/lib/duxml/doc/lazy_ox.rb +167 -167
  7. data/lib/duxml/doc/node_set.rb +38 -38
  8. data/lib/duxml/meta.rb +72 -72
  9. data/lib/duxml/meta/grammar.rb +133 -133
  10. data/lib/duxml/meta/grammar/pattern.rb +111 -111
  11. data/lib/duxml/meta/grammar/pattern/attr_name_pattern.rb +36 -36
  12. data/lib/duxml/meta/grammar/pattern/attr_val_pattern.rb +36 -36
  13. data/lib/duxml/meta/grammar/pattern/child_pattern.rb +60 -60
  14. data/lib/duxml/meta/grammar/pattern/text_pattern.rb +31 -31
  15. data/lib/duxml/meta/grammar/pattern_maker.rb +68 -68
  16. data/lib/duxml/meta/grammar/relax_ng.rb +39 -39
  17. data/lib/duxml/meta/grammar/relax_ng/attrs_rule.rb +58 -58
  18. data/lib/duxml/meta/grammar/relax_ng/children_rule.rb +82 -82
  19. data/lib/duxml/meta/grammar/relax_ng/value_rule.rb +44 -44
  20. data/lib/duxml/meta/grammar/rule.rb +58 -58
  21. data/lib/duxml/meta/grammar/rule/attrs_rule.rb +77 -77
  22. data/lib/duxml/meta/grammar/rule/children_rule.rb +135 -135
  23. data/lib/duxml/meta/grammar/rule/text_rule.rb +39 -39
  24. data/lib/duxml/meta/grammar/rule/value_rule.rb +110 -110
  25. data/lib/duxml/meta/grammar/spreadsheet.rb +34 -34
  26. data/lib/duxml/meta/history.rb +88 -88
  27. data/lib/duxml/meta/history/add.rb +30 -30
  28. data/lib/duxml/meta/history/change.rb +70 -70
  29. data/lib/duxml/meta/history/change_attr.rb +33 -33
  30. data/lib/duxml/meta/history/change_text.rb +32 -32
  31. data/lib/duxml/meta/history/error.rb +24 -24
  32. data/lib/duxml/meta/history/new_attr.rb +32 -32
  33. data/lib/duxml/meta/history/new_text.rb +36 -36
  34. data/lib/duxml/meta/history/qualify_error.rb +21 -21
  35. data/lib/duxml/meta/history/remove.rb +27 -27
  36. data/lib/duxml/meta/history/undo.rb +23 -23
  37. data/lib/duxml/meta/history/validate_error.rb +20 -20
  38. data/lib/duxml/reportable.rb +28 -28
  39. data/lib/duxml/ruby_ext/fixnum.rb +55 -55
  40. data/lib/duxml/ruby_ext/module.rb +11 -11
  41. data/lib/duxml/ruby_ext/object.rb +13 -13
  42. data/lib/duxml/ruby_ext/regexp.rb +19 -19
  43. data/lib/duxml/ruby_ext/string.rb +37 -37
  44. data/lib/duxml/saxer.rb +75 -75
  45. metadata +12 -12
@@ -1,37 +1,37 @@
1
- # Copyright (c) 2016 Freescale Semiconductor Inc.
2
-
3
- require File.expand_path(File.dirname(__FILE__) + '/change')
4
-
5
- module Duxml
6
- module NewText; end
7
-
8
- # created when object had no children or text and text has been added
9
- class NewTextClass < ChangeClass
10
- include NewText
11
-
12
- # @param _subject [Duxml::Element] doc that has gained new text
13
- # @param _index [Fixnum] index of new text node
14
- def initialize(_subject, _str, _index)
15
- super _subject
16
- @index, @str = _index, _str
17
- end
18
-
19
- attr_reader :index, :str
20
- end
21
-
22
- module NewText
23
- def text
24
- subject.nodes[index]
25
- end
26
- alias_method :object, :text
27
-
28
- # @return [String] self description
29
- def description
30
- "#{super} #{subject.description} given new text '#{text}'."
31
- end
32
-
33
- def line_expr
34
- subject.line < 0 ? '' : " on line #{subject.line}"
35
- end
36
- end # class NewContent
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/change')
4
+
5
+ module Duxml
6
+ module NewText; end
7
+
8
+ # created when object had no children or text and text has been added
9
+ class NewTextClass < ChangeClass
10
+ include NewText
11
+
12
+ # @param _subject [Duxml::Element] doc that has gained new text
13
+ # @param _index [Fixnum] index of new text node
14
+ def initialize(_subject, _str, _index)
15
+ super _subject
16
+ @index, @str = _index, _str
17
+ end
18
+
19
+ attr_reader :index, :str
20
+ end
21
+
22
+ module NewText
23
+ def text
24
+ subject.nodes[index]
25
+ end
26
+ alias_method :object, :text
27
+
28
+ # @return [String] self description
29
+ def description
30
+ "#{super} #{subject.description} given new text '#{text}'."
31
+ end
32
+
33
+ def line_expr
34
+ subject.line < 0 ? '' : " on line #{subject.line}"
35
+ end
36
+ end # class NewContent
37
37
  end # module Duxml
@@ -1,22 +1,22 @@
1
- # Copyright (c) 2016 Freescale Semiconductor Inc.
2
-
3
- require File.expand_path(File.dirname(__FILE__) + '/error')
4
-
5
- module Duxml
6
- module QualifyError; end
7
-
8
- # created when grammar detects error from user input
9
- class QualifyErrorClass < ErrorClass
10
- include QualifyError
11
-
12
- alias_method :bad_change, :object
13
- end
14
-
15
- module QualifyError
16
-
17
- def description
18
- rule_str = rule.respond_to?(:validate) ? 'not allowed by this Grammar' : "violates #{rule.description}"
19
- "Qualify Error #{super} #{bad_change.description} #{rule_str}."
20
- end
21
- end # module QualifyError
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/error')
4
+
5
+ module Duxml
6
+ module QualifyError; end
7
+
8
+ # created when grammar detects error from user input
9
+ class QualifyErrorClass < ErrorClass
10
+ include QualifyError
11
+
12
+ alias_method :bad_change, :object
13
+ end
14
+
15
+ module QualifyError
16
+
17
+ def description
18
+ rule_str = rule.respond_to?(:validate) ? 'not allowed by this Grammar' : "violates #{rule.description}"
19
+ "Qualify Error #{super} #{bad_change.description} #{rule_str}."
20
+ end
21
+ end # module QualifyError
22
22
  end # module Duxml
@@ -1,28 +1,28 @@
1
- # Copyright (c) 2016 Freescale Semiconductor Inc.
2
-
3
- require File.expand_path(File.dirname(__FILE__) + '/change')
4
-
5
- module Duxml
6
- module Remove; end
7
-
8
- # created when doc loses a child
9
- class RemoveClass < ChangeClass
10
- include Remove
11
- # @param _subject [Dux::Element] parent doc that lost child
12
- # @param _child [Dux::Element] removed child; it gets added as child of this Remove object so it never actually goes away
13
- def initialize(_subject, _child)
14
- super(_subject)
15
- @removed = _child
16
- end
17
-
18
- attr_reader :removed
19
- alias_method :object, :removed
20
- end
21
-
22
- module Remove
23
- # @return [String] describes removal event
24
- def description
25
- %(#{super} #{removed.description} removed from #{subject.description}.)
26
- end
27
- end # module Remove
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/change')
4
+
5
+ module Duxml
6
+ module Remove; end
7
+
8
+ # created when doc loses a child
9
+ class RemoveClass < ChangeClass
10
+ include Remove
11
+ # @param _subject [Dux::Element] parent doc that lost child
12
+ # @param _child [Dux::Element] removed child; it gets added as child of this Remove object so it never actually goes away
13
+ def initialize(_subject, _child)
14
+ super(_subject)
15
+ @removed = _child
16
+ end
17
+
18
+ attr_reader :removed
19
+ alias_method :object, :removed
20
+ end
21
+
22
+ module Remove
23
+ # @return [String] describes removal event
24
+ def description
25
+ %(#{super} #{removed.description} removed from #{subject.description}.)
26
+ end
27
+ end # module Remove
28
28
  end # module Duxml
@@ -1,24 +1,24 @@
1
- # Copyright (c) 2016 Freescale Semiconductor Inc.
2
-
3
- require File.expand_path(File.dirname(__FILE__) + '/../grammar/pattern')
4
-
5
- module Duxml
6
- # TODO NOT IMPLEMENTED YET!!!
7
- module Undo; end
8
-
9
- # created when a previous change is undone
10
- class UndoClass < ChangeClass
11
- include Undo
12
- end
13
-
14
- module Undo
15
- def description
16
- "#{super} change '#{subject.id}' undone."
17
- end
18
-
19
- # returns previous change instance that was undone
20
- def undone_change
21
- self[:change]
22
- end
23
- end
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/../grammar/pattern')
4
+
5
+ module Duxml
6
+ # TODO NOT IMPLEMENTED YET!!!
7
+ module Undo; end
8
+
9
+ # created when a previous change is undone
10
+ class UndoClass < ChangeClass
11
+ include Undo
12
+ end
13
+
14
+ module Undo
15
+ def description
16
+ "#{super} change '#{subject.id}' undone."
17
+ end
18
+
19
+ # returns previous change instance that was undone
20
+ def undone_change
21
+ self[:change]
22
+ end
23
+ end
24
24
  end # module Duxml
@@ -1,21 +1,21 @@
1
- # Copyright (c) 2016 Freescale Semiconductor Inc.
2
-
3
- require File.expand_path(File.dirname(__FILE__) + '/error')
4
-
5
- module Duxml
6
- module ValidateError; end
7
-
8
- # created when grammar detects error from file
9
- class ValidateErrorClass < ErrorClass
10
- include ValidateError
11
-
12
- alias_method :bad_pattern, :object
13
- end
14
-
15
- module ValidateError
16
- def description
17
- rule_str = rule.respond_to?(:validate) ? 'not allowed by this Grammar' : "violates #{rule.description}"
18
- "Validate Error #{super} #{bad_pattern.description} #{rule_str}."
19
- end
20
- end # module ValidateError
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/error')
4
+
5
+ module Duxml
6
+ module ValidateError; end
7
+
8
+ # created when grammar detects error from file
9
+ class ValidateErrorClass < ErrorClass
10
+ include ValidateError
11
+
12
+ alias_method :bad_pattern, :object
13
+ end
14
+
15
+ module ValidateError
16
+ def description
17
+ rule_str = rule.respond_to?(:validate) ? 'not allowed by this Grammar' : "violates #{rule.description}"
18
+ "Validate Error #{super} #{bad_pattern.description} #{rule_str}."
19
+ end
20
+ end # module ValidateError
21
21
  end # module Duxml
@@ -1,29 +1,29 @@
1
- # Copyright (c) 2016 Freescale Semiconductor Inc.
2
-
3
- require 'observer'
4
-
5
- module Reportable
6
- include Observable
7
-
8
- # @param obs [Object] observer to add to this Element as well as its NodeSet
9
- def add_observer(obs, sym=nil)
10
- super(obs, sym || :update)
11
- nodes.add_observer(obs, sym || :update) if self.respond_to?(:nodes) and nodes.respond_to?(:add_observer)
12
- end
13
-
14
- attr_reader :observer_peers
15
-
16
- private
17
-
18
- # all public methods that alter XML must call #report in the full scope of that public method
19
- # in order to correctly acquire name of method that called #report
20
- #
21
- # @param *args [*several_variants]
22
- def report(*args)
23
- return nil if @observer_peers.nil?
24
- changed
25
- new_args = [args.first, self]
26
- args[1..-1].each do |a| new_args << a end if args.size > 1
27
- notify_observers(*new_args)
28
- end
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+
3
+ require 'observer'
4
+
5
+ module Reportable
6
+ include Observable
7
+
8
+ # @param obs [Object] observer to add to this Element as well as its NodeSet
9
+ def add_observer(obs, sym=nil)
10
+ super(obs, sym || :update)
11
+ nodes.add_observer(obs, sym || :update) if self.respond_to?(:nodes) and nodes.respond_to?(:add_observer)
12
+ end
13
+
14
+ attr_reader :observer_peers
15
+
16
+ private
17
+
18
+ # all public methods that alter XML must call #report in the full scope of that public method
19
+ # in order to correctly acquire name of method that called #report
20
+ #
21
+ # @param *args [*several_variants]
22
+ def report(*args)
23
+ return nil if @observer_peers.nil?
24
+ changed
25
+ new_args = [args.first, self]
26
+ args[1..-1].each do |a| new_args << a end if args.size > 1
27
+ notify_observers(*new_args)
28
+ end
29
29
  end
@@ -1,56 +1,56 @@
1
- # Copyright (c) 2016 Freescale Semiconductor Inc.
2
-
3
- class Fixnum
4
- NUM_NAMES = %w(zero one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty thirty forty fifty sixty seventy eighty ninety)
5
- ORDINAL_SUFFIXES = %w(th st nd rd th)
6
- ORDINAL_NAMES = %w(zeroth first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth)
7
-
8
- # @return [String] short string ordinal e.g. 3.ordinal =? 'third'
9
- def ordinal
10
- self.to_s + suffix
11
- end
12
-
13
- def suffix
14
- if self%100 < 4 or self%100 > 20
15
- ORDINAL_SUFFIXES[self%10]
16
- else
17
- ORDINAL_SUFFIXES.first
18
- end
19
- end
20
-
21
- # @return [String] full name of number e.g. 200058.to_word => 'two-hundred thousand and fifty-eight' for any Fixnum less than a billion
22
- def to_word
23
- case
24
- when self < 21 then NUM_NAMES[self]
25
- when self < 100
26
- ones = self%10
27
- ones_str = ones.zero? ? '' : "-#{ones.to_word}"
28
- NUM_NAMES[self/10+18]+ones_str
29
- when self < 1000
30
- tens = self%100
31
- "#{NUM_NAMES[self/100]} hundred #{'and '+(tens).to_word unless tens.zero?}"
32
- when self < 1000000
33
- remainder = self%1000 < 100 ? "and #{(self%1000).to_word}" : (self%1000).to_word
34
- "#{(self/1000).to_word} thousand #{remainder}"
35
- when self < 1000000000
36
- "#{(self/1000000).to_word} million #{(self%1000000).to_word}"
37
- else raise Exception, 'method only supports names for numbers less than 1000000000 i.e. <= 999,999,999'
38
- end.strip.gsub(' and zero', '')
39
- end
40
-
41
- # @return [String] full name of ordinal number e.g. 4281.ordinal_name => 'four thousand and two-hundred eighty-first'
42
- def ordinal_name
43
- ones = self%10
44
- tens = self%100
45
- case
46
- when tens.zero? then self.to_word+ORDINAL_SUFFIXES.first
47
- when ones.zero? && tens > 10 then self.to_word[-3..-1] + 'tieth'
48
- when ones.zero? && tens == 10 then self.to_word+ORDINAL_SUFFIXES.first
49
- when tens < 13 then "#{(self-tens).to_word} and #{ORDINAL_NAMES[tens]}"
50
- when tens < 20 && tens > 12
51
- "#{(self-tens).to_word} and #{NUM_NAMES[tens]}#{ORDINAL_SUFFIXES.first}"
52
- when tens-ones != 0 then "#{(self-ones).to_word}-#{ORDINAL_NAMES[ones]}"
53
- else "#{(self-ones).to_word} and #{ORDINAL_NAMES[ones]}"
54
- end.strip.gsub('zero and ', '').gsub('zero', '')
55
- end
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+
3
+ class Fixnum
4
+ NUM_NAMES = %w(zero one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty thirty forty fifty sixty seventy eighty ninety)
5
+ ORDINAL_SUFFIXES = %w(th st nd rd th)
6
+ ORDINAL_NAMES = %w(zeroth first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth)
7
+
8
+ # @return [String] short string ordinal e.g. 3.ordinal =? 'third'
9
+ def ordinal
10
+ self.to_s + suffix
11
+ end
12
+
13
+ def suffix
14
+ if self%100 < 4 or self%100 > 20
15
+ ORDINAL_SUFFIXES[self%10]
16
+ else
17
+ ORDINAL_SUFFIXES.first
18
+ end
19
+ end
20
+
21
+ # @return [String] full name of number e.g. 200058.to_word => 'two-hundred thousand and fifty-eight' for any Fixnum less than a billion
22
+ def to_word
23
+ case
24
+ when self < 21 then NUM_NAMES[self]
25
+ when self < 100
26
+ ones = self%10
27
+ ones_str = ones.zero? ? '' : "-#{ones.to_word}"
28
+ NUM_NAMES[self/10+18]+ones_str
29
+ when self < 1000
30
+ tens = self%100
31
+ "#{NUM_NAMES[self/100]} hundred #{'and '+(tens).to_word unless tens.zero?}"
32
+ when self < 1000000
33
+ remainder = self%1000 < 100 ? "and #{(self%1000).to_word}" : (self%1000).to_word
34
+ "#{(self/1000).to_word} thousand #{remainder}"
35
+ when self < 1000000000
36
+ "#{(self/1000000).to_word} million #{(self%1000000).to_word}"
37
+ else raise Exception, 'method only supports names for numbers less than 1000000000 i.e. <= 999,999,999'
38
+ end.strip.gsub(' and zero', '')
39
+ end
40
+
41
+ # @return [String] full name of ordinal number e.g. 4281.ordinal_name => 'four thousand and two-hundred eighty-first'
42
+ def ordinal_name
43
+ ones = self%10
44
+ tens = self%100
45
+ case
46
+ when tens.zero? then self.to_word+ORDINAL_SUFFIXES.first
47
+ when ones.zero? && tens > 10 then self.to_word[-3..-1] + 'tieth'
48
+ when ones.zero? && tens == 10 then self.to_word+ORDINAL_SUFFIXES.first
49
+ when tens < 13 then "#{(self-tens).to_word} and #{ORDINAL_NAMES[tens]}"
50
+ when tens < 20 && tens > 12
51
+ "#{(self-tens).to_word} and #{NUM_NAMES[tens]}#{ORDINAL_SUFFIXES.first}"
52
+ when tens-ones != 0 then "#{(self-ones).to_word}-#{ORDINAL_NAMES[ones]}"
53
+ else "#{(self-ones).to_word} and #{ORDINAL_NAMES[ones]}"
54
+ end.strip.gsub('zero and ', '').gsub('zero', '')
55
+ end
56
56
  end
@@ -1,12 +1,12 @@
1
- # Copyright (c) 2016 Freescale Semiconductor Inc.
2
-
3
- class Module
4
- def simple_name
5
- self.to_s.split('::').last
6
- end
7
-
8
- def simple_module
9
- a = self.to_s.split('::')
10
- a.size > 1 ? a[-2] : 'Module'
11
- end
1
+ # Copyright (c) 2016 Freescale Semiconductor Inc.
2
+
3
+ class Module
4
+ def simple_name
5
+ self.to_s.split('::').last
6
+ end
7
+
8
+ def simple_module
9
+ a = self.to_s.split('::')
10
+ a.size > 1 ? a[-2] : 'Module'
11
+ end
12
12
  end