rtm 0.2.0 → 0.2.1

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 (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
@@ -1,65 +1,114 @@
1
1
  # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
2
  # License: Apache License, Version 2.0
3
3
 
4
- module Sugar
5
- module Topic
6
- module Scoped
4
+ module RTM::Sugar::Topic
5
+ module Scoped
7
6
 
8
- # Returns the Associations, Names, Occurrences and Variants
9
- # whose scope contains this Topic. Beware: The scope of a Variant includes
10
- # the themes of the Name this Variant belongs to.
11
- #
12
- # :call-seq:
13
- # scoped -> Array of Associations, Names, Occurrences and Variants
14
- #
15
- def scoped
16
- _index = topic_map.scoped_index
17
- _index.get_associations(self).to_a + _index.get_names(self).to_a + _index.get_occurrences(self).to_a + _index.get_variants(self).to_a
18
- end
7
+ # Returns the Associations, Names, Occurrences and Variants
8
+ # whose scope contains this Topic. Beware: The scope of a Variant includes
9
+ # the themes of the Name this Variant belongs to.
10
+ #
11
+ # :call-seq:
12
+ # scoped -> Array of Associations, Names, Occurrences and Variants
13
+ #
14
+ def scoped
15
+ _index = scoped_index
16
+ _index.get_associations(self).to_a + _index.get_names(self).to_a + _index.get_occurrences(self).to_a + _index.get_variants(self).to_a
17
+ end
18
+
19
+ # Returns the Associations whose scope contains this Topic.
20
+ #
21
+ # The result may be empty.
22
+ #
23
+ # :call-seq:
24
+ # scoped_associations -> Array of Associations
25
+ #
26
+ def scoped_associations
27
+ scoped_index.get_associations(self).to_a
28
+ end
29
+
30
+ # Returns the Names whose scope contains this Topic.
31
+ #
32
+ # The result may be empty.
33
+ #
34
+ # :call-seq:
35
+ # scoped_names -> Array of Names
36
+ #
37
+ def scoped_names
38
+ scoped_index.get_names(self).to_a
39
+ end
40
+
41
+ # Returns the Occurrences whose scope contains this Topic.
42
+ #
43
+ # :call-seq:
44
+ # scoped_occurrences -> Array of Occurrences
45
+ #
46
+ def scoped_occurrences
47
+ scoped_index.get_occurrences(self).to_a
48
+ end
19
49
 
20
- # Returns the Associations whose scope contains this Topic.
21
- #
22
- # The result may be empty.
23
- #
24
- # :call-seq:
25
- # scoped_associations -> Array of Associations
26
- #
27
- def scoped_associations
28
- topic_map.scoped_index.get_associations(self).to_a
29
- end
50
+ # Returns the Variants whose scope (including the scope of the parent Name)
51
+ # contains this Topic.
52
+ #
53
+ # The result may be empty.
54
+ #
55
+ # :call-seq:
56
+ # scoped_variants -> Array of Variants
57
+ #
58
+ def scoped_variants
59
+ scoped_index.get_variants(self).to_a
60
+ end
30
61
 
31
- # Returns the Names whose scope contains this Topic.
32
- #
33
- # The result may be empty.
34
- #
35
- # :call-seq:
36
- # scoped_names -> Array of Names
37
- #
38
- def scoped_names
39
- topic_map.scoped_index.get_names(self).to_a
40
- end
62
+ # States if this topic occurs as theme in the scope of a scoped Construct.
63
+ #
64
+ # :call-seq:
65
+ # used_as_theme? -> true or false
66
+ #
67
+ def used_as_theme?
68
+ used_as_name_theme? || used_as_occurrence_theme? || used_as_association_theme? || used_as_variant_theme?
69
+ end
41
70
 
42
- # Returns the Occurrences whose scope contains this Topic.
43
- #
44
- # :call-seq:
45
- # scoped_occurrences -> Array of Occurrences
46
- #
47
- def scoped_occurrences
48
- topic_map.scoped_index.get_occurrences(self).to_a
49
- end
71
+ # States if this topic occurs as theme in the scope of an Association.
72
+ #
73
+ # :call-seq:
74
+ # used_as_association_theme? -> true or false
75
+ #
76
+ def used_as_association_theme?
77
+ not self.scoped_associations.empty?
78
+ end
79
+
80
+ # States if this topic occurs as theme in the scope of a Name.
81
+ #
82
+ # :call-seq:
83
+ # used_as_name_theme? -> true or false
84
+ #
85
+ def used_as_name_theme?
86
+ not self.scoped_names.empty?
87
+ end
88
+
89
+ # States if this topic occurs as theme in the scope of an Occurrence.
90
+ #
91
+ # :call-seq:
92
+ # used_as_occurrence_theme? -> true or false
93
+ #
94
+ def used_as_occurrence_theme?
95
+ not self.scoped_occurrences.empty?
96
+ end
50
97
 
51
- # Returns the Variants whose scope (including the scope of the parent Name)
52
- # contains this Topic.
53
- #
54
- # The result may be empty.
55
- #
56
- # :call-seq:
57
- # scoped_variants -> Array of Variants
58
- #
59
- def scoped_variants
60
- topic_map.scoped_index.get_variants(self).to_a
61
- end
98
+ # States if this topic occurs as theme in the scope of a Variant.
99
+ #
100
+ # :call-seq:
101
+ # used_as_variant_theme? -> true or false
102
+ #
103
+ def used_as_variant_theme?
104
+ not self.scoped_variants.empty?
105
+ end
62
106
 
107
+ private
108
+ def scoped_index
109
+ @scoped_index ||= topic_map.scoped_index
63
110
  end
111
+
64
112
  end
65
113
  end
114
+
@@ -1,32 +1,83 @@
1
1
  # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
2
  # License: Apache License, Version 2.0
3
3
 
4
- module Sugar
4
+ module RTM::Sugar
5
5
  module Topic
6
6
  module TopicRef
7
7
 
8
8
  # Returns an Array including all identifiers of this Topic.
9
- # Item identifiers start with a "^", subject locators start
10
- # with a "=", subject identifiers contain no prefix.
9
+ #
10
+ # This method takes a Hash as argument.
11
+ #
12
+ # The key :ouputstyle defines if the ctm style (value :ctm, this is
13
+ # the default), the YAML
14
+ # style (value :yaml) or no style (value :blank) is supported.
15
+ #
16
+ # In ctm style an item identifier starts with a "^",
17
+ # a subject locator starts with a "=" and
18
+ # a subject identifiers contains no prefix.
19
+ #
20
+ # In yaml style an item identifiers start with a "ii:",
21
+ # a subject locator starts with a "sl:" and
22
+ # a subject identifier start with a "si:".
11
23
  #
12
24
  # :call-seq:
13
- # topic_references -> Array of Strings
25
+ # references -> Array of Strings
26
+ # references(params = {}) -> Array of Strings
14
27
  #
15
- def topic_references
16
- #def identifiers
17
- subject_identifiers.map{|si| si.reference} +
18
- subject_locators.map{|sl| "=#{sl.reference}"} +
19
- item_identifiers.map{|ii| "^#{ii.reference}"}
28
+ def references(params = {})
29
+ default_hash = {:outputstyle => :ctm, :resolve_qnames => :false}
30
+ params = default_hash.merge(params) if params.is_a? Hash
31
+
32
+ case params[:outputstyle]
33
+ when :yaml
34
+ identifiers = subject_identifiers.map{|si| "si:#{si.reference}"} +
35
+ subject_locators.map{ |sl| "sl:#{sl.reference}"} +
36
+ item_identifiers.map{ |ii| "ii:#{ii.reference}"}
37
+ when :blank
38
+ identifiers = subject_identifiers.map{|si| si.reference} +
39
+ subject_locators.map{ |sl| sl.reference} +
40
+ item_identifiers.map{ |ii| ii.reference}
41
+ else #:ctm default
42
+ identifiers = subject_identifiers.map{|si| si.reference} +
43
+ subject_locators.map{ |sl| "=#{sl.reference}"} +
44
+ item_identifiers.map{ |ii| "^#{ii.reference}"}
45
+ end
46
+ return identifiers
20
47
  end
21
48
 
49
+ # Returns one identifier of this topic. If several exist, the shortest one
50
+ # is returned.
51
+ #
52
+ # This method takes a Hash as argument.
53
+ #
54
+ # The key :ouputstyle defines if the ctm style (value :ctm, this is
55
+ # the default), the YAML
56
+ # style (value :yaml) or no style (value :blank) is supported.
57
+ #
58
+ # In ctm style an item identifier starts with a "^",
59
+ # a subject locator starts with a "=" and
60
+ # a subject identifiers contains no prefix.
61
+ #
62
+ # In yaml style an item identifiers start with a "ii:",
63
+ # a subject locator starts with a "sl:" and
64
+ # a subject identifier start with a "si:".
65
+ #
66
+ #
67
+ # :call-seq:
68
+ # reference -> String
69
+ # reference(params = {}) -> String
70
+ #
71
+ def reference(params = {})
72
+ return references(params).sort_by{|identifier| identifier.size}.reverse.first
73
+ end
22
74
 
23
75
  # Returns all identifiers of this Topic as Array of Locators.
24
76
  #
25
77
  # :call-seq:
26
- # topic_references_as_locators -> Array of Locators
78
+ # references_as_locators -> Array of Locators
27
79
  #
28
- def topic_references_as_locators
29
- # TODO Spec
80
+ def references_as_locators
30
81
  subject_identifiers.to_a + subject_locators.to_a + item_identifiers.to_a
31
82
  end
32
83
 
@@ -1,7 +1,7 @@
1
1
  # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
2
  # License: Apache License, Version 2.0
3
3
 
4
- module Sugar
4
+ module RTM::Sugar
5
5
  module Topic
6
6
  module Typed
7
7
 
@@ -152,8 +152,56 @@ module Sugar
152
152
  # topic_is_a?(type)
153
153
  #
154
154
  def topic_is_a?(type)
155
- self.transitive_types.include?(topic_map.get(type))
155
+ topic_map.cached self, :is_a?, type do
156
+ self.transitive_types.include?(topic_map.get(type))
157
+ end
158
+ end
159
+
160
+ # States if this topic is used as type of a typed Construct.
161
+ #
162
+ # :call-seq:
163
+ # used_as_type? -> true or false
164
+ #
165
+ def used_as_type?
166
+ used_as_name_type? || used_as_occurrence_type? || used_as_association_type? || used_as_role_type?
167
+ end
168
+
169
+ # States if this topic is used as type of an Association.
170
+ #
171
+ # :call-seq:
172
+ # used_as_association_type? -> true or false
173
+ #
174
+ def used_as_association_type?
175
+ not self.typed_associations.empty?
156
176
  end
177
+
178
+ # States if this topic is used as type of a Name.
179
+ #
180
+ # :call-seq:
181
+ # used_as_name_type? -> true or false
182
+ #
183
+ def used_as_name_type?
184
+ not self.typed_names.empty?
185
+ end
186
+
187
+ # States if this topic is used as type of an Occurrence.
188
+ #
189
+ # :call-seq:
190
+ # used_as_occurrence_type -> true or false
191
+ #
192
+ def used_as_occurrence_type?
193
+ not self.typed_occurrences.empty?
194
+ end
195
+
196
+ # States if this topic is used as type of a Role.
197
+ #
198
+ # :call-seq:
199
+ # used_as_role_type? -> true or false
200
+ #
201
+ def used_as_role_type?
202
+ not self.typed_roles.empty?
203
+ end
204
+
157
205
  end
158
206
  end
159
207
  end
@@ -0,0 +1,66 @@
1
+ # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
+ # License: Apache License, Version 2.0
3
+
4
+ module RTM::Sugar
5
+ module TopicMap
6
+ module QueryCache
7
+
8
+ # The query cache is disabled by default. Enables the query cache.
9
+ # Does not erase the cache if it was already enabled.
10
+ #
11
+ # :call-seq:
12
+ # enable_query_cache -> nil
13
+ #
14
+ def enable_query_cache
15
+ @query_cache ||= {}
16
+ return
17
+ end
18
+
19
+ # The query cache is disabled by default. Disables the query cache.
20
+ #
21
+ # :call-seq:
22
+ # disable_query_cache -> nil
23
+ #
24
+ def disable_query_cache
25
+ @query_cache = nil # FIXME: This method is unsafe in multithreaded environments: Setting "@query_cache = nil" while @query_cache is being accessed in method "cached" may cause exceptions to be raised.
26
+ return
27
+ end
28
+
29
+ # Erases the query cache. This needs to be invoked every time there
30
+ # is a write access to the topic map.
31
+ #
32
+ # :call-seq:
33
+ # reset_query_cache -> nil
34
+ #
35
+ def reset_query_cache
36
+ @query_cache = @query_cache? {} : nil
37
+ return
38
+ end
39
+
40
+ # If query caching is enabled, looks up the result of
41
+ # module_name.method_name(parameters) in the cache and if present,
42
+ # returns it. If
43
+ # the result has not yet been stored, executes module_name.method_name(parameters),
44
+ # stores the result and returns it.
45
+ #
46
+ # If query caching is disabled, executes module_name.method_name(parameters)
47
+ # and returns the result.
48
+ #
49
+ # :call-seq:
50
+ # cached(module_name, method_name, parameters) {method_body} -> result
51
+ #
52
+ def cached(*args)
53
+ if @query_cache # Maybe we can optimize this simple if statement away by making enable_query_cache extend the particular TopicMap instance's metaclass. But maybe then the cached version is slower.
54
+ result = @query_cache.fetch(args,:not_found) # :not_found if not cached, if result is nil, we want to cache nil as well.
55
+ if result==:not_found
56
+ result = yield
57
+ @query_cache[args] = result
58
+ end
59
+ return result
60
+ else
61
+ yield #execute without caching
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,53 @@
1
+ # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
+ # License: Apache License, Version 2.0
3
+
4
+
5
+ module RTM::Sugar
6
+ module TopicMap
7
+ module Themes
8
+
9
+ # Returns all topics in the topic map used
10
+ # in the scope property of Associations.
11
+ #
12
+ # The result may be empty.
13
+ #
14
+ # :call-seq:
15
+ # association_themes -> Array of Topics
16
+ #
17
+ def association_themes
18
+ scoped_index.get_association_themes.to_a
19
+ end
20
+
21
+ # Returns all topics in the topic map used
22
+ # in the scope property of Names.
23
+ #
24
+ # :call-seq:
25
+ # name_themes -> Array of Topics
26
+ #
27
+ def name_themes
28
+ scoped_index.get_name_themes.to_a
29
+ end
30
+
31
+ # Returns all topics in the topic map used
32
+ # in the scope property of Occurrences.
33
+ #
34
+ # :call-seq:
35
+ # occurrence_themes -> Array of Topics
36
+ #
37
+ def occurrence_themes
38
+ scoped_index.get_occurrence_themes.to_a
39
+ end
40
+
41
+ # Returns all topics in the topic map used
42
+ # in the scope property of Variants.
43
+ #
44
+ # :call-seq:
45
+ # variant_themes -> Array of Topics
46
+ #
47
+ def variant_themes
48
+ scoped_index.get_variant_themes.to_a
49
+ end
50
+
51
+ end
52
+ end
53
+ end