rtm 0.2.1 → 0.3.0

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 (41) hide show
  1. data/README +1 -1
  2. data/lib/rtm.rb +23 -95
  3. data/lib/rtm/connection.rb +51 -0
  4. data/lib/rtm/engine.rb +29 -18
  5. data/lib/rtm/extensions.rb +2 -5
  6. data/lib/rtm/helpers/uri.rb +1 -1
  7. data/lib/rtm/io/tmapix_from.rb +8 -8
  8. data/lib/rtm/io/tmapix_to.rb +6 -6
  9. data/lib/rtm/io/to_rdf.rb +1 -1
  10. data/lib/rtm/io/to_string.rb +22 -14
  11. data/lib/rtm/navigation/topic/supertypes.rb +2 -2
  12. data/lib/rtm/navigation/topic/types.rb +1 -1
  13. data/lib/rtm/psi.rb +3 -1
  14. data/lib/rtm/sugar.rb +8 -3
  15. data/lib/rtm/sugar/topic/best_name.rb +31 -50
  16. data/lib/rtm/sugar/topic/scoped.rb +9 -9
  17. data/lib/rtm/sugar/topic/topic_ref.rb +115 -72
  18. data/lib/rtm/sugar/topic_map/remove.rb +49 -0
  19. data/lib/rtm/sugar/topic_map/{themes.rb → scoped.rb} +9 -10
  20. data/lib/rtm/sugar/topic_map/types.rb +50 -0
  21. data/lib/rtm/sugar/variant/topic.rb +17 -0
  22. data/lib/rtm/topology.rb +134 -0
  23. data/lib/rtm/version.rb +13 -8
  24. data/spec/rtm/engine_spec.rb +45 -0
  25. data/spec/rtm/io/tmapix_from_spec.rb +8 -8
  26. data/spec/rtm/io/tmapix_to_spec.rb +38 -38
  27. data/spec/rtm/io/to_yaml_spec.rb +7 -0
  28. data/spec/rtm/javatmapi_spec.rb +64 -0
  29. data/spec/rtm/navigation/topic/scope_spec.rb +1 -1
  30. data/spec/rtm/sugar/topic/best_name_spec.rb +54 -2
  31. data/spec/rtm/sugar/topic/topic_ref_spec.rb +59 -35
  32. data/spec/rtm/sugar/topic_map/remove_spec.rb +50 -0
  33. data/spec/rtm/sugar/topic_map/{themes_spec.rb → scoped_spec.rb} +1 -1
  34. data/spec/rtm/sugar/topic_map/types_spec.rb +34 -0
  35. data/spec/rtm/sugar/variant/topic_spec.rb +28 -0
  36. data/spec/rtm/tmapi/core/name_spec.rb +1 -7
  37. data/spec/rtm/tmapi/core/topic_map_spec.rb +103 -51
  38. data/spec/rtm/tmapi/core/topic_spec.rb +3 -0
  39. data/spec/rtm_spec.rb +3 -12
  40. data/test/javalibs/tmapi-2.0-tests.jar +0 -0
  41. metadata +26 -9
@@ -0,0 +1,49 @@
1
+ # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
+ # License: Apache License, Version 2.0
3
+
4
+ module RTM::Sugar::TopicMap
5
+ module Remove
6
+
7
+ # Removes all variants, names, occurrences, roles, asssociations and
8
+ # topics (esp. reifier) from this topic map.
9
+ def clear
10
+ set_reifier(nil)
11
+
12
+ variants.to_a.each do |v|
13
+ v.set_reifier(nil)
14
+ v.remove
15
+ end
16
+
17
+ names.to_a.each do |n|
18
+ n.set_reifier(nil)
19
+ n.remove
20
+ end
21
+
22
+ occurrences.to_a.each do |o|
23
+ o.set_reifier(nil)
24
+ o.remove
25
+ end
26
+
27
+ roles.to_a.each do |r|
28
+ r.set_reifier(nil)
29
+ r.remove
30
+ end
31
+
32
+ associations.to_a.each do |a|
33
+ a.set_reifier(nil)
34
+ a.remove
35
+ end
36
+
37
+ types.to_a.each do |type|
38
+ type.instances.to_a.each do |instance|
39
+ instance.remove_type(type)
40
+ end
41
+ end
42
+
43
+ topics.to_a.each do |t|
44
+ t.remove
45
+ end
46
+
47
+ end
48
+ end
49
+ end
@@ -1,10 +1,9 @@
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::Sugar
6
5
  module TopicMap
7
- module Themes
6
+ module Scoped
8
7
 
9
8
  # Returns all topics in the topic map used
10
9
  # in the scope property of Associations.
@@ -12,40 +11,40 @@ module RTM::Sugar
12
11
  # The result may be empty.
13
12
  #
14
13
  # :call-seq:
15
- # association_themes -> Array of Topics
14
+ # association_themes -> Collection of Topics
16
15
  #
17
16
  def association_themes
18
- scoped_index.get_association_themes.to_a
17
+ scoped_index.getAssociationThemes
19
18
  end
20
19
 
21
20
  # Returns all topics in the topic map used
22
21
  # in the scope property of Names.
23
22
  #
24
23
  # :call-seq:
25
- # name_themes -> Array of Topics
24
+ # name_themes -> Collection of Topics
26
25
  #
27
26
  def name_themes
28
- scoped_index.get_name_themes.to_a
27
+ scoped_index.getNameThemes
29
28
  end
30
29
 
31
30
  # Returns all topics in the topic map used
32
31
  # in the scope property of Occurrences.
33
32
  #
34
33
  # :call-seq:
35
- # occurrence_themes -> Array of Topics
34
+ # occurrence_themes -> Collection of Topics
36
35
  #
37
36
  def occurrence_themes
38
- scoped_index.get_occurrence_themes.to_a
37
+ scoped_index.getOccurrenceThemes
39
38
  end
40
39
 
41
40
  # Returns all topics in the topic map used
42
41
  # in the scope property of Variants.
43
42
  #
44
43
  # :call-seq:
45
- # variant_themes -> Array of Topics
44
+ # variant_themes -> Collection of Topics
46
45
  #
47
46
  def variant_themes
48
- scoped_index.get_variant_themes.to_a
47
+ scoped_index.getVariantThemes
49
48
  end
50
49
 
51
50
  end
@@ -0,0 +1,50 @@
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 Types
7
+
8
+ # Returns all topics in this topic map that are used
9
+ # as types of associations.
10
+ #
11
+ # :call-seq:
12
+ # association_types -> Collection of Topics
13
+ #
14
+ def association_types
15
+ type_instance_index.getAssociationTypes
16
+ end
17
+
18
+ # Returns the all Topics in this TopicMap that are used
19
+ # as types of Roles.
20
+ #
21
+ # :call-seq:
22
+ # role_types -> Collection of Topics
23
+ #
24
+ def role_types
25
+ type_instance_index.getRoleTypes
26
+ end
27
+
28
+ # Returns all Topics in this TopicMap that are used
29
+ # as types of Names.
30
+ #
31
+ # :call-seq:
32
+ # name_types -> Collection of Topics
33
+ #
34
+ def name_types
35
+ type_instance_index.getNameTypes
36
+ end
37
+
38
+ # Returns all Topics in this TopicMap that are used
39
+ # as types of Occurrences.
40
+ #
41
+ # :call-seq:
42
+ # occurrence_types -> Collection of Topics
43
+ #
44
+ def occurrence_types
45
+ type_instance_index.getOccurrenceTypes
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,17 @@
1
+ # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
+ # License: Apache License, Version 2.0
3
+
4
+ module RTM::Sugar::Variant
5
+ module Topic
6
+
7
+ # Return the topic this variant belongs to.
8
+ #
9
+ # :call-seq:
10
+ # topic -> Topic
11
+ #
12
+ def topic
13
+ return self.parent.parent
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,134 @@
1
+ module RTM
2
+
3
+ # Topology information about a Topic Map.
4
+ # This class provides some statistical and structural information about a topic map.
5
+ # All methods take an optional modifier OR block which specifies how a Topic Maps construct shall be transformed before it is returned.
6
+ # Some modifiers are defined in the sub module Modifier.
7
+ class Topology
8
+ # @return [RTM::TopicMap] The topic map this topology provides information about.
9
+ attr_reader :topic_map
10
+
11
+ def initialize(topic_map)
12
+ @topic_map = topic_map
13
+ end
14
+
15
+ # A list of constructs defined in TMDM which have a (single) type
16
+ SINGLE_TYPED_CONSTRUCTS = %w[name occurrence association role]
17
+
18
+ # A list of constructs defined in TMDM which may have multiple types
19
+ TYPED_CONSTRUCTS = ["topic"] + SINGLE_TYPED_CONSTRUCTS
20
+
21
+ # A list of constructs defined in TMDM which are scopeable
22
+ SCOPEABLE_CONSTRUCTS = %w[name variant occurrence association]
23
+
24
+ SINGLE_TYPED_CONSTRUCTS.each do |item|
25
+ # define_method "#{item}_types" do |modifier=nil, &block|
26
+ eval(<<-EOS)
27
+ def #{item}_types(modifier=nil, &block)
28
+ modifier ||= block || Modifier.default
29
+ @#{item}_types ||= Hash[@topic_map.#{item}_types.map{|i| [modifier.call(i), i.typed_#{item}s.size]}]
30
+ end
31
+ def #{item}_types_count(modifier=nil, &block)
32
+ @#{item}_types_count ||= @topic_map.#{item}_types.size
33
+ end
34
+ EOS
35
+ end
36
+
37
+ SCOPEABLE_CONSTRUCTS.each do |item|
38
+ eval(<<-EOS)
39
+ def #{item}_themes(modifier=nil, &block)
40
+ modifier ||= block || Modifier.default
41
+ @#{item}_themes ||= Hash[@topic_map.#{item}_themes.map{|i| [modifier.call(i), i.scoped_#{item}s.size]}]
42
+ end
43
+ def #{item}_themes_count(modifier=nil, &block)
44
+ @#{item}_themes_count ||= @topic_map.#{item}_themes.size
45
+ end
46
+ EOS
47
+ end
48
+
49
+
50
+ # The number of topics in this topic map
51
+ # @return [Number]
52
+ def topics_count(modifier=nil, &block)
53
+ @topic_map.topics.size
54
+ end
55
+
56
+ # The number of associations in this topic map
57
+ # @return [Number]
58
+ def associations_count(modifier=nil, &block)
59
+ @topic_map.associations.size
60
+ end
61
+
62
+ # The following are not available in RTM yet
63
+ # def names_count
64
+ # @topic_map.names.size
65
+ # end
66
+ # def occurrences_count
67
+ # @topic_map.occurrences.size
68
+ # end
69
+ # def variants_count
70
+ # @topic_map.variants.size
71
+ # end
72
+
73
+ # All topology information in one step
74
+ # @return [Hash] with all topology information. Keys correspond to method names, values to their returned results.
75
+ def all(modifier=nil, &block)
76
+ modifier ||= block || Modifier.default
77
+ puts "modifier: #{modifier.inspect}"
78
+ ms = self.methods - Object.new.methods - %w[topic_map all]
79
+ Hash[ms.map {|m| [m, self.send(m, modifier)]}]
80
+ end
81
+
82
+ # String representation of all topology information
83
+ # @return [String] with all topology information
84
+ def to_s(modifier=nil, &block)
85
+ modifier ||= block || Modifier.best_name
86
+ all(modifier).sort_by{|k,v| k}.map {|k,v| "#{k}: #{v.inspect}"}.join("\n")
87
+ end
88
+
89
+
90
+ # Manages Modifiers which may be applied to Constructs (or only to Topics?!)
91
+ module Modifier
92
+ # The nop Modifier just returns the construct given as is: <code>{|x| x}</code>
93
+ #
94
+ # @return [#call] The nop Modifier which is a callable object which takes one argument and returns this argument.
95
+ def nop
96
+ Proc.new {|x| x}
97
+ end
98
+
99
+ # The best_name Modifier returns the best name for a Construct: <code>{|x| x.best_name}</code>
100
+ #
101
+ # @return [#call] The best_name Modifier returns a name suitable for human consumption
102
+ def best_name
103
+ Proc.new {|x| x.best_name}
104
+ end
105
+
106
+ # The reference Modifier returns a reference for a Construct: <code>{|x| x.reference}</code>
107
+ #
108
+ # @return [#call] The reference Modifier returns a name suitable for human consumption
109
+ def reference
110
+ Proc.new {|x| x.reference}
111
+ end
112
+
113
+ # Make all instance methods available as class methods, too.
114
+ extend self
115
+
116
+ # The default modifier is {#nop}
117
+ # @return [#call] the default modifier
118
+ attr_reader :default
119
+
120
+ # Set the default modifier
121
+ @default = nop
122
+ end
123
+
124
+ # The TopologyExtension for RTM::TopicMap adds an #topology method to a topic map which provides an overview over a topic map.
125
+ module TopologyExtension
126
+ # Topology information about this TopicMap.
127
+ # @return [Topology] an object which provides some topology information
128
+ def topology
129
+ RTM::Topology.new(self)
130
+ end
131
+ RTM::TopicMap.register_extension(self)
132
+ end
133
+ end
134
+ end
@@ -6,22 +6,27 @@ module RTM # :nodoc:
6
6
  # Try to determine version from Gem, if we're loaded from there
7
7
  today = rtmgem.date
8
8
  elsif File.exist?(File.join(File.dirname(__FILE__), "../../../.hg"))
9
- # Try to get the latest Mercurial commit date
10
- hg_date_string = `hg --cwd "#{File.dirname(__FILE__)}" parent --template "{date|isodate}"`
11
- today = Date.parse(hg_date_string)
12
- else
13
- # Fall back to current day
14
- today = Date.today
9
+ begin
10
+ # Try to get the latest Mercurial commit date
11
+ hg_date_string = `hg --cwd "#{File.dirname(__FILE__)}" parent --template "{date|isodate}"`
12
+ today = Date.parse(hg_date_string)
13
+ rescue Exception => e
14
+ warn("We're running from Mercurial, but Mercurial binary 'hg' is not in system path (or something else with parsing version from hg went wront)")
15
+ end
15
16
  end
17
+ # Fall back to current day if not set before
18
+ today ||= Date.today
19
+
16
20
  DATE = [today.year, today.month, today.day]
17
21
  ISODATE = "%04d-%02d-%02d" % DATE # => "2010-01-26"
18
22
  COMPACTDATE = "%04d%02d%02d" % DATE # => "20100126"
19
23
 
20
24
  MAJOR = 0
21
- MINOR = 2
22
- TINY = 1
25
+ MINOR = 3
26
+ TINY = 0
23
27
  BUILD = ENV['BUILD_NUMBER'] || COMPACTDATE
24
28
 
29
+ #STRING = [MAJOR, MINOR, TINY, BUILD].compact.join('.')
25
30
  STRING = [MAJOR, MINOR, TINY].compact.join('.')
26
31
 
27
32
  SUMMARY = "rtm #{STRING}"
@@ -0,0 +1,45 @@
1
+ # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
+ # License: Apache License, Version 2.0
3
+
4
+ require File.dirname(__FILE__) + '/../spec_helper'
5
+
6
+ module RTM
7
+ class Engine
8
+
9
+ describe self do
10
+
11
+ describe "#identifier" do
12
+ before(:all) do
13
+ @connection = RTM.connect(:implementation => implementation_for_spec)
14
+ @tested = false
15
+ end
16
+ it "should return :ontopia if ontopia is used" do
17
+ if implementation_for_spec == :ontopia
18
+ @connection.identifier.should == :ontopia
19
+ @tested = true
20
+ elsif implementation_for_spec == :tinytim
21
+ @connection.identifier.should == :tinytim
22
+ @tested = true
23
+ elsif implementation_for_spec == :activerecord
24
+ @connection.identifier.should == :activerecord
25
+ @tested = true
26
+ elsif implementation_for_spec == :tm2jdbc
27
+ @connection.identifier.should == :tm2jdbc
28
+ @tested = true
29
+ elsif implementation_for_spec == :hatana
30
+ @connection.identifier.should == :hatana
31
+ @tested = true
32
+ elsif implementation_for_spec == :sesametm
33
+ @connection.identifier.should == :sesametm
34
+ @tested = true
35
+ else
36
+ # engine not found
37
+ end
38
+ @tested.should be_true
39
+ end
40
+ end
41
+
42
+ end # of describe self
43
+
44
+ end
45
+ end
@@ -14,31 +14,31 @@ module RTM::IO::TmapiXFrom::TopicMap
14
14
  end
15
15
 
16
16
  describe "#from_ltm" do
17
- it "import into an empty topic map" do
17
+ it "should import into an empty topic map" do
18
18
  @tm.from_ltm(File.dirname(__FILE__) + "/../../resources/toyTM.ltm")
19
19
  end
20
20
  end
21
21
 
22
22
  describe "#from_ctm" do
23
- it "import into an empty topic map" do
23
+ it "should import into an empty topic map" do
24
24
  @tm.from_ctm(File.dirname(__FILE__) + "/../../resources/toyTM.ctm")
25
25
  end
26
26
  end
27
27
 
28
28
  describe "#from_jtm" do
29
- it "import into an empty topic map" do
29
+ it "should import into an empty topic map" do
30
30
  #@tm.from_jtm(File.dirname(__FILE__) + "/../../resources/toyTM.jtm")
31
31
  end
32
32
  end
33
33
 
34
34
  describe "#from_tmxml" do
35
- it "import into an empty topic map" do
35
+ it "should import into an empty topic map" do
36
36
  #@tm.from_tmxml(File.dirname(__FILE__) + "/../../resources/toyTM.tmxml")
37
37
  end
38
38
  end
39
39
 
40
40
  describe "#from_xtm10" do
41
- it "import into an empty topic map" do
41
+ it "should import into an empty topic map" do
42
42
  #@tm.from_xtm10(File.dirname(__FILE__) + "/../../resources/toyTM_xtm10.xtm")
43
43
  end
44
44
  it "should provide an alias for from_xtm1" do
@@ -47,7 +47,7 @@ module RTM::IO::TmapiXFrom::TopicMap
47
47
  end
48
48
 
49
49
  describe "#from_xtm20" do
50
- it "import into an empty topic map" do
50
+ it "should import into an empty topic map" do
51
51
  @tm.from_xtm20(File.dirname(__FILE__) + "/../../resources/toyTM.xtm")
52
52
  end
53
53
  it "should provide an alias for from_xtm2" do
@@ -56,10 +56,10 @@ module RTM::IO::TmapiXFrom::TopicMap
56
56
  end
57
57
 
58
58
  describe "#from_xtm" do
59
- it "import into an empty topic map from xtm v2.0" do
59
+ it "should import into an empty topic map from xtm v2.0" do
60
60
  @tm.from_xtm20(File.dirname(__FILE__) + "/../../resources/toyTM.xtm")
61
61
  end
62
- it "import into an empty topic map from xtm v1.0" do
62
+ it "should import into an empty topic map from xtm v1.0" do
63
63
  #@tm.from_xtm10(File.dirname(__FILE__) + "/../../resources/toyTM_xtm10.xtm")
64
64
  end
65
65
  end