duxml 0.8.8 → 0.8.9

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