rtm 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/README +38 -3
  2. data/lib/rtm.rb +25 -47
  3. data/lib/rtm/axes.rb +7 -4
  4. data/lib/rtm/axes/association.rb +1 -1
  5. data/lib/rtm/axes/associations.rb +1 -1
  6. data/lib/rtm/axes/characteristic.rb +1 -1
  7. data/lib/rtm/axes/characteristics.rb +1 -1
  8. data/lib/rtm/axes/topic.rb +3 -3
  9. data/lib/rtm/axes/topics.rb +3 -3
  10. data/lib/rtm/engine.rb +48 -5
  11. data/lib/rtm/extensions.rb +58 -8
  12. data/lib/rtm/io.rb +2 -1
  13. data/lib/rtm/io/tmapix_from.rb +155 -0
  14. data/lib/rtm/io/tmapix_to.rb +223 -0
  15. data/lib/rtm/io/to_hash.rb +79 -41
  16. data/lib/rtm/io/to_jtm.rb +1 -1
  17. data/lib/rtm/io/to_rdf.rb +20 -5
  18. data/lib/rtm/io/to_string.rb +13 -2
  19. data/lib/rtm/io/to_yaml.rb +39 -11
  20. data/lib/rtm/navigation.rb +1 -15
  21. data/lib/rtm/navigation/association/players.rb +1 -1
  22. data/lib/rtm/navigation/name/characteristics.rb +1 -1
  23. data/lib/rtm/navigation/occurrence/characteristics.rb +1 -1
  24. data/lib/rtm/navigation/topic/characteristics.rb +1 -1
  25. data/lib/rtm/navigation/topic/players.rb +1 -1
  26. data/lib/rtm/navigation/topic/supertypes.rb +21 -17
  27. data/lib/rtm/navigation/topic/traverse.rb +1 -1
  28. data/lib/rtm/navigation/topic/types.rb +6 -4
  29. data/lib/rtm/psi.rb +6 -0
  30. data/lib/rtm/sugar.rb +42 -29
  31. data/lib/rtm/sugar/association/hash_access.rb +3 -3
  32. data/lib/rtm/sugar/occurrence/dynamic_value.rb +39 -56
  33. data/lib/rtm/sugar/occurrence/external.rb +53 -0
  34. data/lib/rtm/sugar/reifiable/reifier.rb +21 -0
  35. data/lib/rtm/sugar/role/counterparts.rb +12 -6
  36. data/lib/rtm/sugar/topic/best_name.rb +74 -0
  37. data/lib/rtm/sugar/topic/characteristics.rb +10 -10
  38. data/lib/rtm/sugar/topic/counterparts.rb +131 -119
  39. data/lib/rtm/sugar/topic/scoped.rb +102 -53
  40. data/lib/rtm/sugar/topic/topic_ref.rb +63 -12
  41. data/lib/rtm/sugar/topic/typed.rb +50 -2
  42. data/lib/rtm/sugar/topic_map/query_cache.rb +66 -0
  43. data/lib/rtm/sugar/topic_map/themes.rb +53 -0
  44. data/lib/rtm/sugar/typed/types.rb +1 -1
  45. data/lib/rtm/validation.rb +2 -2
  46. data/lib/rtm/version.rb +18 -6
  47. data/spec/rtm/axes/string_spec.rb +7 -7
  48. data/spec/rtm/axes/strings_spec.rb +10 -10
  49. data/spec/rtm/io/tmapix_from_spec.rb +76 -0
  50. data/spec/rtm/io/tmapix_to_spec.rb +159 -0
  51. data/spec/rtm/io/to_hash_spec.rb +90 -0
  52. data/spec/rtm/io/to_rdf_spec.rb +37 -0
  53. data/spec/rtm/io/to_string_spec.rb +122 -0
  54. data/spec/rtm/io/to_yaml_spec.rb +89 -0
  55. data/spec/rtm/sugar/occurrence/dynamic_value_spec.rb +156 -1
  56. data/spec/rtm/sugar/occurrence/external_spec.rb +129 -0
  57. data/spec/rtm/sugar/reifiable/reifier_spec.rb +41 -0
  58. data/spec/rtm/sugar/role/counterparts_spec.rb +174 -172
  59. data/spec/rtm/sugar/topic/best_name_spec.rb +25 -0
  60. data/spec/rtm/sugar/topic/characteristics_spec.rb +20 -5
  61. data/spec/rtm/sugar/topic/counterparts_spec.rb +41 -1
  62. data/spec/rtm/sugar/topic/hash_access_spec.rb +1 -1
  63. data/spec/rtm/sugar/topic/scoped_spec.rb +178 -114
  64. data/spec/rtm/sugar/topic/topic_ref_spec.rb +10 -10
  65. data/spec/rtm/sugar/topic/typed_spec.rb +196 -134
  66. data/spec/rtm/sugar/topic_map/themes_spec.rb +67 -0
  67. data/spec/rtm/sugar/typed/types_spec.rb +1 -1
  68. data/spec/rtm/tmapi/core/association_spec.rb +2 -2
  69. data/spec/rtm/tmapi/core/datatype_aware_spec.rb +236 -0
  70. data/spec/rtm/tmapi/core/name_spec.rb +186 -1
  71. data/spec/rtm/tmapi/core/occurrence_spec.rb +24 -67
  72. data/spec/rtm/tmapi/core/reifiable_spec.rb +2 -2
  73. data/spec/rtm/tmapi/core/scoped_spec.rb +40 -2
  74. data/spec/rtm/tmapi/core/topic_map_spec.rb +98 -30
  75. data/spec/rtm/tmapi/core/topic_spec.rb +558 -82
  76. data/spec/rtm/tmapi/core/variant_spec.rb +3 -3
  77. data/spec/rtm_spec.rb +0 -1
  78. data/spec/spec_helper.rb +7 -2
  79. data/test/javalibs/junit-4.5.jar +0 -0
  80. data/test/javalibs/tmapi-2.0-tests.jar +0 -0
  81. data/test/tmapi_tests.rb +25 -0
  82. metadata +66 -11
  83. data/lib/rtm/io/ontopia_io.rb +0 -25
  84. data/lib/rtm/io/tmapix.rb +0 -234
  85. data/lib/rtm/sugar/occurrence/externalize.rb +0 -31
  86. data/spec/rtm/io/tmapix_spec.rb +0 -85
  87. data/test/base_unit_test.rb +0 -161
  88. data/test/base_unit_test_tmapi.rb +0 -165
data/lib/rtm/io/to_jtm.rb CHANGED
@@ -88,7 +88,7 @@ module RTM::IO
88
88
  alias :to_json :to_jtm
89
89
  end
90
90
 
91
- RTM.register_extension self
91
+ RTM.register_extension self
92
92
 
93
93
  end
94
94
  end
data/lib/rtm/io/to_rdf.rb CHANGED
@@ -1,21 +1,36 @@
1
1
  # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
2
  # License: Apache License, Version 2.0
3
3
 
4
-
5
4
  module RTM::IO
6
5
 
7
6
  # RDF Export.
8
7
  # RTM::TopicMap gets a to_rdf method.
9
- module TORDF
8
+ module ToRDF
10
9
  module TopicMap
11
-
10
+
11
+ # If this topic map is an Ontopia tmapi2 topic map to_rdf_ontopia is
12
+ # called and the RDF reprensentation is returned.
13
+ #
14
+ # Else, a "Not supported" error is raised.
15
+ #
16
+ # :call-seq:
17
+ # to_rdf -> String
18
+ #
12
19
  def to_rdf
13
20
  case self
14
21
  when net.ontopia.topicmaps.impl.tmapi2.TopicMapImpl then to_rdf_ontopia
15
22
  else raise "Not supported for #{self}"
16
23
  end
17
24
  end
18
-
25
+
26
+ # Returns the RDF representation according to RDF2TM
27
+ # of this topic map as String.
28
+ #
29
+ # @see http://www.ontopia.net/topicmaps/materials/rdf2tm.html
30
+ #
31
+ # :call-seq:
32
+ # to_rdf_ontopia -> String
33
+ #
19
34
  def to_rdf_ontopia
20
35
  @out = java.io.StringWriter.new
21
36
  w=Java::NetOntopiaTopicmapsUtilsRdf::RDFTopicMapWriter.new @out
@@ -24,7 +39,7 @@ module RTM::IO
24
39
  end
25
40
  end
26
41
 
27
- RTM.register_extension self
42
+ RTM.register_extension self
28
43
 
29
44
  end
30
45
  end
@@ -3,7 +3,7 @@
3
3
 
4
4
  module RTM::IO
5
5
  # Each Topic Maps Construct gets a custom to_s method which supports optional :short or :long output.
6
- module TOSTRING
6
+ module ToString
7
7
 
8
8
  module TopicMap
9
9
  # Returns different String representations. Try :short (default), :long, :super (original)
@@ -123,7 +123,18 @@ module RTM::IO
123
123
  end
124
124
  end
125
125
  end
126
-
126
+
127
+ module Locator
128
+ def to_s(style=:short)
129
+ case style
130
+ when :short
131
+ value
132
+ when :long
133
+ value
134
+ end
135
+ end
136
+ end
137
+
127
138
  RTM.register_extension( self )
128
139
  end
129
140
  end
@@ -2,56 +2,84 @@
2
2
  # License: Apache License, Version 2.0
3
3
 
4
4
  module RTM::IO
5
- # YAML Export.
5
+ # Yaml Export.
6
6
  # Each Topic Maps Construct gets a to_yaml method.
7
- module TOYAML
7
+ module ToYAML
8
8
 
9
9
  module TopicMap
10
- # Returns the YAML representation of this RTM::TopicMap
10
+ # Returns the YAML representation of this topic map as String.
11
+ #
12
+ # :call-seq:
13
+ # to_yaml -> String
14
+ #
11
15
  def to_yaml
12
16
  to_hash.to_yaml
13
17
  end
14
18
  end
15
19
 
16
20
  module Topic
17
- # Returns the YAML representation of this RTM::Topic
21
+ # Returns the YAML representation of this topic as String.
22
+ #
23
+ # :call-seq:
24
+ # to_yaml -> String
25
+ #
18
26
  def to_yaml
19
27
  to_hash.to_yaml
20
28
  end
21
29
  end
22
30
 
23
31
  module Association
24
- # Returns the YAML representation of this RTM::Association
32
+ # Returns the YAML representation of this association as String.
33
+ #
34
+ # :call-seq:
35
+ # to_yaml -> String
36
+ #
25
37
  def to_yaml
26
38
  to_hash.to_yaml
27
39
  end
28
40
  end
29
41
 
30
42
  module Name
31
- # Returns the YAML representation of this RTM::Name
43
+ # Returns the YAML representation of this name as String.
44
+ #
45
+ # :call-seq:
46
+ # to_yaml -> String
47
+ #
32
48
  def to_yaml
33
49
  to_hash.to_yaml
34
50
  end
35
51
  end
36
52
 
37
53
  module Occurrence
38
- # Returns the YAML representation of this RTM::Occurrence
54
+ # Returns the YAML representation of this occurrence as String.
55
+ #
56
+ # :call-seq:
57
+ # to_yaml -> String
58
+ #
39
59
  def to_yaml
40
60
  to_hash.to_yaml
41
61
  end
42
62
  end
43
63
 
44
64
  module Role
45
- # Returns the YAML representation of this RTM::Role
65
+ # Returns the YAML representation of this role as String.
66
+ #
67
+ # :call-seq:
68
+ # to_yaml -> String
69
+ #
46
70
  def to_yaml
47
- to_yaml_hash.to_yaml
71
+ to_hash.to_yaml
48
72
  end
49
73
  end
50
74
 
51
75
  module Variant
52
- # Returns the YAML representation of this RTM::Variant
76
+ # Returns the YAML representation of this variant as String.
77
+ #
78
+ # :call-seq:
79
+ # to_yaml -> String
80
+ #
53
81
  def to_yaml
54
- to_yaml_hash.to_yaml
82
+ to_hash.to_yaml
55
83
  end
56
84
  end
57
85
 
@@ -20,18 +20,4 @@ require "rtm/navigation/topic/supertypes"
20
20
  require "rtm/navigation/topic/traverse"
21
21
  require "rtm/navigation/topic/types"
22
22
 
23
- module RTM::Topic
24
- include RTM::Navigation::Topic
25
- end
26
-
27
- module RTM::Name
28
- include RTM::Navigation::Name
29
- end
30
-
31
- module RTM::Occurrence
32
- include RTM::Navigation::Occurrence
33
- end
34
-
35
- module RTM::Association
36
- include RTM::Navigation::Association
37
- end
23
+ RTM.register_extension(RTM::Navigation)
@@ -8,7 +8,7 @@ module RTM
8
8
  # Returns all players of roles in this association.
9
9
  #
10
10
  # The optional identifier specifies the type of the roles to be considered.
11
- # The identifier may be a topic or topic reference.
11
+ # The identifier may be a topic reference.
12
12
  #
13
13
  # Multiple instances of the same topics are possible.
14
14
  #
@@ -10,7 +10,7 @@ module RTM
10
10
  # Characteristic for its type. If the type
11
11
  # does not match, nil is returned.
12
12
  #
13
- # The identifier may be a Topic or Topic-Reference.
13
+ # The identifier may be a topic reference.
14
14
  #
15
15
  # :call-seq:
16
16
  # reverse_characteristics -> Topic
@@ -10,7 +10,7 @@ module RTM
10
10
  # Characteristic for its type. If the type
11
11
  # does not match, nil is returned.
12
12
  #
13
- # The identifier may be a Topic or Topic-Reference.
13
+ # The identifier may be a topic reference.
14
14
  #
15
15
  # :call-seq:
16
16
  # reverse_characteristics -> Topic
@@ -9,7 +9,7 @@ module RTM
9
9
  # If an identifier is given, only those Names and Occurrences are returned,
10
10
  # whose type or supertypes include the identifier.
11
11
  #
12
- # Identifier may be a Topic or Topic-Reference.
12
+ # Identifier may be a topic reference.
13
13
  #
14
14
  # The result may be empty.
15
15
  #
@@ -9,7 +9,7 @@ module RTM
9
9
  #
10
10
  # The optional
11
11
  # identifier specifies the type of the Roles to be considered.
12
- # The identifier may be a Topic or Topic-Reference.
12
+ # The identifier may be a topic reference.
13
13
  #
14
14
  # Multiple instances of the same Association are possible.
15
15
  # The result may be empty.
@@ -23,7 +23,7 @@ module RTM
23
23
  # the player of the supertype-Role. The current Topic will play the
24
24
  # subtype-Role. Returns the created Association.
25
25
  #
26
- # Identifier may be a Topic or Topic-Reference.
26
+ # Identifier may be a topic reference.
27
27
  #
28
28
  # :call-seq:
29
29
  # add_supertype(identifier) -> Association
@@ -40,7 +40,7 @@ module RTM
40
40
  # the player of a supertype-Role. The current topic will play the
41
41
  # subtype-Role in each association. Returns the associations.
42
42
  #
43
- # The identifier may be topic references.
43
+ # The identifiers may be topic references.
44
44
  #
45
45
  # :call-seq:
46
46
  # add_supertypes(identifier1, identifier2, ...) -> Array of Associtions
@@ -60,13 +60,15 @@ module RTM
60
60
  # transitive_supertypes -> Array of Topics
61
61
  #
62
62
  def transitive_supertypes
63
- result_types = new_s_t = direct_supertypes
64
- until new_s_t.empty?
65
- new_s_t = new_s_t.map{|s| s.direct_supertypes}.flatten.uniq
66
- new_s_t = new_s_t.reject{|s| result_types.include?(s)}
67
- result_types = result_types + new_s_t
68
- end
69
- return result_types
63
+ # topic_map.cached self, :transitive_supertypes do
64
+ result_types = new_s_t = direct_supertypes
65
+ until new_s_t.empty?
66
+ new_s_t = new_s_t.map{|s| s.direct_supertypes}.flatten.uniq
67
+ new_s_t = new_s_t.reject{|s| result_types.include?(s)}
68
+ result_types = result_types + new_s_t
69
+ end
70
+ result_types
71
+ # end
70
72
  end
71
73
 
72
74
  # Returns all supertypes of this Topic. The result includes the direct_supertypes
@@ -97,7 +99,7 @@ module RTM
97
99
  # the player of the subtype-Role. The current Topic will play the
98
100
  # supertype-Role. Returns the created Association.
99
101
  #
100
- # Identifier may be Topic or Topic Reference.
102
+ # Identifier may be topic reference.
101
103
  #
102
104
  # :call-seq:
103
105
  # add_subtype(identifier) -> Association
@@ -114,7 +116,7 @@ module RTM
114
116
  # the player of a subtype-Role. The current topic will play the
115
117
  # supertype-Role in each association. Returns the associations.
116
118
  #
117
- # The identifier may be topic references.
119
+ # The identifiers may be topic references.
118
120
  #
119
121
  # :call-seq:
120
122
  # add_subtypes(identifier1, identifier2, ...) -> Array of Associtions
@@ -133,13 +135,15 @@ module RTM
133
135
  # transitive_subtypes -> Array of Topics
134
136
  #
135
137
  def transitive_subtypes
136
- result_types = new_s_t = direct_subtypes
137
- until new_s_t.empty?
138
- new_s_t = new_s_t.map{|s| s.direct_subtypes}.flatten.uniq
139
- new_s_t = new_s_t.reject{|s| result_types.include?(s)}
140
- result_types = result_types + new_s_t
138
+ topic_map.cached self, :transitive_subtypes do
139
+ result_types = new_s_t = direct_subtypes
140
+ until new_s_t.empty?
141
+ new_s_t = new_s_t.map{|s| s.direct_subtypes}.flatten.uniq
142
+ new_s_t = new_s_t.reject{|s| result_types.include?(s)}
143
+ result_types = result_types + new_s_t
144
+ end
145
+ result_types
141
146
  end
142
- return result_types
143
147
  end
144
148
 
145
149
  # Returns all subtypes of this Topic. The result includes the direct_subtypes
@@ -12,7 +12,7 @@ module RTM
12
12
  # The current Topic is not included in the result.
13
13
  # The result may be empty.
14
14
  #
15
- # The identifier may be a Topic or Topic-Reference.
15
+ # The identifier may be a topic reference.
16
16
  #
17
17
  # :call-seq:
18
18
  # traverse(identifier) -> Array of Topics
@@ -27,8 +27,9 @@ module RTM
27
27
  # type -> Topic or nil
28
28
  #
29
29
  def type
30
- raise "Topic must have exactly one type to call the type-method. Use the types-method instead." unless types.size < 2
31
- types.size == 1 ? types.to_a.first : nil
30
+ _types = types
31
+ raise "Topic must have exactly one type to call the type-method. Use the types-method instead." unless _types.size < 2
32
+ _types.size == 1 ? _types.to_a.first : nil
32
33
  end
33
34
 
34
35
  # Returns the topics which are instances of this topic.
@@ -52,8 +53,9 @@ module RTM
52
53
  # instance -> Topic
53
54
  #
54
55
  def instance
55
- raise "Topic must have exactly one instance to call the instance-method. Use the instances-method instead." unless instances.size < 2
56
- instances.size == 1 ? instances.to_a.first : nil
56
+ _instances = instances
57
+ raise "Topic must have exactly one instance to call the instance-method. Use the instances-method instead." unless _instances.size < 2
58
+ _instances.size == 1 ? _instances.to_a.first : nil
57
59
  end
58
60
 
59
61
  alias :reverse_types :instances
data/lib/rtm/psi.rb CHANGED
@@ -29,6 +29,9 @@ module RTM
29
29
  PSI[:Integer] = "http://www.w3.org/2001/XMLSchema#integer"
30
30
  PSI[:Int] = "http://www.w3.org/2001/XMLSchema#int"
31
31
  PSI[:Decimal] = "http://www.w3.org/2001/XMLSchema#decimal"
32
+ PSI[:Date] = "http://www.w3.org/2001/XMLSchema#date"
33
+ PSI[:DateTime] = "http://www.w3.org/2001/XMLSchema#dateTime"
34
+ PSI[:Time] = "http://www.w3.org/2001/XMLSchema#time"
32
35
 
33
36
  PSI[:XTM] = "http://psi.topicmaps.org/iso13250/glossary/XTM"
34
37
  PSI[:association] = "http://psi.topicmaps.org/iso13250/glossary/association"
@@ -62,6 +65,9 @@ module RTM
62
65
  PSI[:variant] = "http://psi.topicmaps.org/iso13250/glossary/variant-name"
63
66
  PSI[:variant_name] = "http://psi.topicmaps.org/iso13250/glossary/variant-name"
64
67
 
68
+ PSI[:subject_representation] = "http://psi.topicmapslab.de/subject-representation"
69
+ PSI[:represented_subject] = "http://psi.topicmapslab.de/represented-subject"
70
+
65
71
  # languages
66
72
  # PSI[:] = "http://psi.oasis-open.org/iso/639/#"
67
73
  PSI[:language] = "http://psi.oasis-open.org/iso/639/#language"
data/lib/rtm/sugar.rb CHANGED
@@ -1,34 +1,47 @@
1
1
  # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
2
  # License: Apache License, Version 2.0
3
3
 
4
- module RTM::Topic
5
- require 'rtm/sugar/topic/topic_ref'
6
- include Sugar::Topic::TopicRef
7
- require 'rtm/sugar/topic/hash_access'
8
- include RTM::Sugar::Topic::HashAccess
9
- require 'rtm/sugar/topic/characteristics'
10
- include Sugar::Topic::Characteristics
11
- require 'rtm/sugar/topic/counterparts'
12
- include Sugar::Topic::Counterparts
13
- require 'rtm/sugar/topic/scoped'
14
- include Sugar::Topic::Scoped
15
- require 'rtm/sugar/topic/typed'
16
- include Sugar::Topic::Typed
17
- end
18
- module RTM::Association
19
- require "rtm/sugar/association/hash_access"
20
- include Sugar::Association::HashAccess
21
- end
22
- module RTM::Role
23
- require "rtm/sugar/role/counterparts"
24
- include Sugar::Role::Counterparts
25
- end
26
- module RTM::Occurrence
27
- require "rtm/sugar/occurrence/dynamic_value"
28
- include Sugar::Occurrence::DynamicValue
29
- end
30
- module RTM::Typed
31
- require "rtm/sugar/typed/types"
32
- include Sugar::Typed::Types
4
+ module RTM::Sugar;end
5
+
6
+ require 'rtm/sugar/topic/topic_ref'
7
+ require 'rtm/sugar/topic/hash_access'
8
+ require 'rtm/sugar/topic/characteristics'
9
+ require 'rtm/sugar/topic/counterparts'
10
+ require 'rtm/sugar/topic/scoped'
11
+ require 'rtm/sugar/topic/typed'
12
+ require 'rtm/sugar/topic/best_name'
13
+ RTM::Topic.register_extension(RTM::Sugar::Topic::TopicRef)
14
+ RTM::Topic.register_extension(RTM::Sugar::Topic::HashAccess)
15
+ RTM::Topic.register_extension(RTM::Sugar::Topic::Characteristics)
16
+ RTM::Topic.register_extension(RTM::Sugar::Topic::Counterparts)
17
+ RTM::Topic.register_extension(RTM::Sugar::Topic::Scoped)
18
+ RTM::Topic.register_extension(RTM::Sugar::Topic::Typed)
19
+ RTM::Topic.register_extension(RTM::Sugar::Topic::BestName)
20
+
21
+ require "rtm/sugar/association/hash_access"
22
+ RTM::Association.register_extension(RTM::Sugar::Association::HashAccess)
23
+
24
+ require "rtm/sugar/role/counterparts"
25
+ RTM::Role.register_extension(RTM::Sugar::Role::Counterparts)
26
+
27
+ require "time"
28
+ require "rtm/sugar/occurrence/dynamic_value"
29
+ require "rtm/sugar/occurrence/external"
30
+ RTM::Occurrence.register_extension(RTM::Sugar::Occurrence::DynamicValue)
31
+ RTM::Occurrence.register_extension(RTM::Sugar::Occurrence::External)
32
+
33
+ require "rtm/sugar/typed/types"
34
+ RTM::Typed.register_extension(RTM::Sugar::Typed::Types)
35
+
36
+ require 'rtm/sugar/reifiable/reifier'
37
+ RTM::Reifiable.register_extension(RTM::Sugar::Reifiable::CreateReifier)
38
+
39
+ require 'rtm/sugar/topic_map/query_cache'
40
+ require 'rtm/sugar/topic_map/themes'
41
+ module RTM::TopicMap
42
+ include RTM::Reifiable
43
+ @query_cache = nil #disables query caching
33
44
  end
45
+ RTM::TopicMap.register_extension(RTM::Sugar::TopicMap::QueryCache)
46
+ RTM::TopicMap.register_extension(RTM::Sugar::TopicMap::Themes)
34
47