xbrlware-ce 1.0.2

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 (194) hide show
  1. data/Copying.txt +13 -0
  2. data/License.txt +13 -0
  3. data/Rakefile.rb +124 -0
  4. data/Readme.txt +15 -0
  5. data/doc/classes/Edgar.html +144 -0
  6. data/doc/classes/Edgar/HTMLFeedDownloader.html +199 -0
  7. data/doc/classes/Edgar/RSSFeedDownloader.html +225 -0
  8. data/doc/classes/Xbrlware.html +350 -0
  9. data/doc/classes/Xbrlware/Context.html +429 -0
  10. data/doc/classes/Xbrlware/Entity.html +323 -0
  11. data/doc/classes/Xbrlware/Identifier.html +191 -0
  12. data/doc/classes/Xbrlware/Instance.html +742 -0
  13. data/doc/classes/Xbrlware/Item.html +278 -0
  14. data/doc/classes/Xbrlware/LBConstants.html +144 -0
  15. data/doc/classes/Xbrlware/Linkbase.html +131 -0
  16. data/doc/classes/Xbrlware/Linkbase/CalculationLinkbase.html +212 -0
  17. data/doc/classes/Xbrlware/Linkbase/CalculationLinkbase/Calculation.html +172 -0
  18. data/doc/classes/Xbrlware/Linkbase/CalculationLinkbase/Calculation/CalculationArc.html +166 -0
  19. data/doc/classes/Xbrlware/Linkbase/DefinitionLinkbase.html +210 -0
  20. data/doc/classes/Xbrlware/Linkbase/DefinitionLinkbase/Definition.html +204 -0
  21. data/doc/classes/Xbrlware/Linkbase/DefinitionLinkbase/Definition/DefinitionArc.html +160 -0
  22. data/doc/classes/Xbrlware/Linkbase/LabelLinkbase.html +239 -0
  23. data/doc/classes/Xbrlware/Linkbase/LabelLinkbase/Label.html +189 -0
  24. data/doc/classes/Xbrlware/Linkbase/Linkbase.html +172 -0
  25. data/doc/classes/Xbrlware/Linkbase/Linkbase/Link.html +217 -0
  26. data/doc/classes/Xbrlware/Linkbase/Linkbase/Link/Arc.html +284 -0
  27. data/doc/classes/Xbrlware/Linkbase/PresentationLinkbase.html +224 -0
  28. data/doc/classes/Xbrlware/Linkbase/PresentationLinkbase/Presentation.html +222 -0
  29. data/doc/classes/Xbrlware/Linkbase/PresentationLinkbase/Presentation/PresentationArc.html +160 -0
  30. data/doc/classes/Xbrlware/Taxonomy.html +369 -0
  31. data/doc/classes/Xbrlware/TaxonomyDefintion.html +177 -0
  32. data/doc/classes/Xbrlware/Unit.html +179 -0
  33. data/doc/classes/Xbrlware/Unit/Divide.html +165 -0
  34. data/doc/created.rid +1 -0
  35. data/doc/files/Readme_txt.html +124 -0
  36. data/doc/files/lib/edgar/edgar_data_downloader_rb.html +129 -0
  37. data/doc/files/lib/edgar/util_rb.html +129 -0
  38. data/doc/files/lib/edgar_rb.html +141 -0
  39. data/doc/files/lib/xbrlware/constants_rb.html +129 -0
  40. data/doc/files/lib/xbrlware/context_rb.html +129 -0
  41. data/doc/files/lib/xbrlware/date_util_rb.html +129 -0
  42. data/doc/files/lib/xbrlware/float_patch_rb.html +129 -0
  43. data/doc/files/lib/xbrlware/hash_util_rb.html +129 -0
  44. data/doc/files/lib/xbrlware/instance_rb.html +129 -0
  45. data/doc/files/lib/xbrlware/item_rb.html +129 -0
  46. data/doc/files/lib/xbrlware/linkbase/calculation_linkbase_rb.html +129 -0
  47. data/doc/files/lib/xbrlware/linkbase/definition_linkbase_rb.html +129 -0
  48. data/doc/files/lib/xbrlware/linkbase/label_linkbase_rb.html +129 -0
  49. data/doc/files/lib/xbrlware/linkbase/linkbase_rb.html +129 -0
  50. data/doc/files/lib/xbrlware/linkbase/presentation_linkbase_rb.html +129 -0
  51. data/doc/files/lib/xbrlware/meta_util_rb.html +129 -0
  52. data/doc/files/lib/xbrlware/taxonomy_rb.html +129 -0
  53. data/doc/files/lib/xbrlware/unit_rb.html +129 -0
  54. data/doc/files/lib/xbrlware/util_rb.html +129 -0
  55. data/doc/files/lib/xbrlware/xml_parser_rb.html +129 -0
  56. data/doc/files/lib/xbrlware_rb.html +163 -0
  57. data/doc/fr_class_index.html +55 -0
  58. data/doc/fr_file_index.html +48 -0
  59. data/doc/fr_method_index.html +104 -0
  60. data/doc/index.html +24 -0
  61. data/doc/rdoc-style.css +208 -0
  62. data/example/benchmark/instance_parser_benchmark.rb +25 -0
  63. data/example/case_study/buy_strategy.rb +34 -0
  64. data/example/case_study/c-20091230.xml +29 -0
  65. data/example/case_study/c_sell_strategy.rb +29 -0
  66. data/example/lang_integration/thrift/rating-client.py +21 -0
  67. data/example/lang_integration/thrift/rating-impl.rb +13 -0
  68. data/example/lang_integration/thrift/rating-server.rb +25 -0
  69. data/example/lang_integration/thrift/rating.thrift +52 -0
  70. data/example/quick_start/foo.rb +10 -0
  71. data/example/quick_start/foo.xml +29 -0
  72. data/example/quick_start/print_item.rb +27 -0
  73. data/lib/edgar.rb +30 -0
  74. data/lib/edgar/edgar_data_downloader.rb +126 -0
  75. data/lib/edgar/util.rb +30 -0
  76. data/lib/xbrlware.rb +65 -0
  77. data/lib/xbrlware/constants.rb +29 -0
  78. data/lib/xbrlware/context.rb +148 -0
  79. data/lib/xbrlware/date_util.rb +35 -0
  80. data/lib/xbrlware/float_patch.rb +26 -0
  81. data/lib/xbrlware/hash_util.rb +175 -0
  82. data/lib/xbrlware/instance.rb +406 -0
  83. data/lib/xbrlware/item.rb +115 -0
  84. data/lib/xbrlware/linkbase/calculation_linkbase.rb +137 -0
  85. data/lib/xbrlware/linkbase/definition_linkbase.rb +186 -0
  86. data/lib/xbrlware/linkbase/label_linkbase.rb +128 -0
  87. data/lib/xbrlware/linkbase/linkbase.rb +170 -0
  88. data/lib/xbrlware/linkbase/presentation_linkbase.rb +160 -0
  89. data/lib/xbrlware/meta_util.rb +45 -0
  90. data/lib/xbrlware/taxonomies/us_gaap_taxonomy_20090131.rb +40365 -0
  91. data/lib/xbrlware/taxonomy.rb +133 -0
  92. data/lib/xbrlware/unit.rb +42 -0
  93. data/lib/xbrlware/util.rb +83 -0
  94. data/lib/xbrlware/xml_parser.rb +122 -0
  95. data/setup.rb +1585 -0
  96. data/test/lib/edgar/edgar_data_downloader_test.rb +35 -0
  97. data/test/lib/edgar/resources/0000930413-09-005485-index.htm +331 -0
  98. data/test/lib/edgar/resources/usgaap.rss.xml +2861 -0
  99. data/test/lib/xbrlware/411_footnotes_test.rb +65 -0
  100. data/test/lib/xbrlware/42_schemaref_test.rb +20 -0
  101. data/test/lib/xbrlware/46_item_test.rb +253 -0
  102. data/test/lib/xbrlware/47_context_test.rb +129 -0
  103. data/test/lib/xbrlware/48_unit_test.rb +45 -0
  104. data/test/lib/xbrlware/49_tuple_test.rb +12 -0
  105. data/test/lib/xbrlware/date_util_test.rb +24 -0
  106. data/test/lib/xbrlware/dimension/context_explicit_dimension_test.rb +40 -0
  107. data/test/lib/xbrlware/dimension/resources/context_explicit_dimension.xml +84 -0
  108. data/test/lib/xbrlware/float_patch_test.rb +10 -0
  109. data/test/lib/xbrlware/hash_util_test.rb +29 -0
  110. data/test/lib/xbrlware/instance_test.rb +250 -0
  111. data/test/lib/xbrlware/linkbase/calculation_linkbase_test.rb +39 -0
  112. data/test/lib/xbrlware/linkbase/definition_linkbase_test.rb +35 -0
  113. data/test/lib/xbrlware/linkbase/label_linkbase_test.rb +22 -0
  114. data/test/lib/xbrlware/linkbase/linkbase_test.rb +36 -0
  115. data/test/lib/xbrlware/linkbase/linkbase_test_util.rb +98 -0
  116. data/test/lib/xbrlware/linkbase/presentation_linkbase_test.rb +33 -0
  117. data/test/lib/xbrlware/linkbase/report.html +62 -0
  118. data/test/lib/xbrlware/linkbase/resources/cal.xml +219 -0
  119. data/test/lib/xbrlware/linkbase/resources/def.xml +186 -0
  120. data/test/lib/xbrlware/linkbase/resources/def_with_multiple_dimension.xml +41 -0
  121. data/test/lib/xbrlware/linkbase/resources/instance.xml +5822 -0
  122. data/test/lib/xbrlware/linkbase/resources/lab.xml +782 -0
  123. data/test/lib/xbrlware/linkbase/resources/pre.xml +485 -0
  124. data/test/lib/xbrlware/linkbase/resources/report_10_q.htm +12327 -0
  125. data/test/lib/xbrlware/linkbase/resources/taxonomy.xsd +178 -0
  126. data/test/lib/xbrlware/linkbase/sample_html_report.html +40 -0
  127. data/test/lib/xbrlware/meta_util_test.rb +23 -0
  128. data/test/lib/xbrlware/resources/411/411_footnotes.xml +66 -0
  129. data/test/lib/xbrlware/resources/42/42_schema_ref_with_base.xml +7 -0
  130. data/test/lib/xbrlware/resources/42/42_schema_ref_without_base.xml +7 -0
  131. data/test/lib/xbrlware/resources/46/46_item_value.xml +61 -0
  132. data/test/lib/xbrlware/resources/47/472_period_forever.xml +29 -0
  133. data/test/lib/xbrlware/resources/47/472_period_instant.xml +24 -0
  134. data/test/lib/xbrlware/resources/47/472_period_start_dt_and_end_dt.xml +30 -0
  135. data/test/lib/xbrlware/resources/47/4731_entity_identifier.xml +29 -0
  136. data/test/lib/xbrlware/resources/47/4732_entity_segment_not_present.xml +24 -0
  137. data/test/lib/xbrlware/resources/47/4732_entity_segment_present.xml +30 -0
  138. data/test/lib/xbrlware/resources/47/474_scenario_not_present.xml +26 -0
  139. data/test/lib/xbrlware/resources/47/474_scenario_present.xml +30 -0
  140. data/test/lib/xbrlware/resources/47/47_multiple_contexts.xml +36 -0
  141. data/test/lib/xbrlware/resources/48/482_unit_measure.xml +32 -0
  142. data/test/lib/xbrlware/resources/48/483_unit_divide.xml +39 -0
  143. data/test/lib/xbrlware/resources/48/48_multiple_units.xml +43 -0
  144. data/test/lib/xbrlware/resources/49/49_tuple.xml +61 -0
  145. data/test/lib/xbrlware/resources/49_tuple.xsd +44 -0
  146. data/test/lib/xbrlware/resources/instance.xml +128 -0
  147. data/test/lib/xbrlware/resources/report_test_xbrl_files/cal.xml +219 -0
  148. data/test/lib/xbrlware/resources/report_test_xbrl_files/def.xml +186 -0
  149. data/test/lib/xbrlware/resources/report_test_xbrl_files/instance.xml +5822 -0
  150. data/test/lib/xbrlware/resources/report_test_xbrl_files/lab.xml +782 -0
  151. data/test/lib/xbrlware/resources/report_test_xbrl_files/pre.xml +485 -0
  152. data/test/lib/xbrlware/resources/report_test_xbrl_files/report/report_index.html +62 -0
  153. data/test/lib/xbrlware/resources/report_test_xbrl_files/taxonomy.xsd +178 -0
  154. data/test/lib/xbrlware/resources/taxonomy_test_files/1/cal.xml +223 -0
  155. data/test/lib/xbrlware/resources/taxonomy_test_files/1/def.xml +190 -0
  156. data/test/lib/xbrlware/resources/taxonomy_test_files/1/lab.xml +786 -0
  157. data/test/lib/xbrlware/resources/taxonomy_test_files/1/pre.xml +489 -0
  158. data/test/lib/xbrlware/resources/taxonomy_test_files/1/taxonomy.xsd +177 -0
  159. data/test/lib/xbrlware/resources/taxonomy_test_files/2/linkbases/cal.xml +223 -0
  160. data/test/lib/xbrlware/resources/taxonomy_test_files/2/linkbases/def.xml +190 -0
  161. data/test/lib/xbrlware/resources/taxonomy_test_files/2/linkbases/lab.xml +786 -0
  162. data/test/lib/xbrlware/resources/taxonomy_test_files/2/linkbases/pre.xml +489 -0
  163. data/test/lib/xbrlware/resources/taxonomy_test_files/2/taxonomy.xsd +175 -0
  164. data/test/lib/xbrlware/resources/taxonomy_test_files/3/taxonomy.xsd +175 -0
  165. data/test/lib/xbrlware/resources/us_gaap_schema.xsd +8 -0
  166. data/test/lib/xbrlware/resources/us_gaap_schema_local.xsd +10 -0
  167. data/test/lib/xbrlware/resources/util_test_xbrl_files/cal.xml +219 -0
  168. data/test/lib/xbrlware/resources/util_test_xbrl_files/def.xml +186 -0
  169. data/test/lib/xbrlware/resources/util_test_xbrl_files/instance.xml +5822 -0
  170. data/test/lib/xbrlware/resources/util_test_xbrl_files/lab.xml +782 -0
  171. data/test/lib/xbrlware/resources/util_test_xbrl_files/pre.xml +485 -0
  172. data/test/lib/xbrlware/resources/util_test_xbrl_files/taxonomy.xsd +178 -0
  173. data/test/lib/xbrlware/resources/xbrl_xsd/dei-2009-01-31.xsd +162 -0
  174. data/test/lib/xbrlware/resources/xbrl_xsd/dei-std-2009-01-31.xsd +23 -0
  175. data/test/lib/xbrlware/resources/xbrl_xsd/negated-2008-03-31.xsd +23 -0
  176. data/test/lib/xbrlware/resources/xbrl_xsd/ref-2006-02-27.xsd +121 -0
  177. data/test/lib/xbrlware/resources/xbrl_xsd/us-gaap-2009-01-31.xsd +13474 -0
  178. data/test/lib/xbrlware/resources/xbrl_xsd/us-roles-2009-01-31.xsd +2283 -0
  179. data/test/lib/xbrlware/resources/xbrl_xsd/us-types-2009-01-31.xsd +368 -0
  180. data/test/lib/xbrlware/resources/xbrl_xsd/xbrl-instance-2003-12-31.xsd +772 -0
  181. data/test/lib/xbrlware/resources/xbrl_xsd/xbrl-linkbase-2003-12-31.xsd +477 -0
  182. data/test/lib/xbrlware/resources/xbrl_xsd/xbrldi-2006.xsd +41 -0
  183. data/test/lib/xbrlware/resources/xbrl_xsd/xbrldt-2005.xsd +53 -0
  184. data/test/lib/xbrlware/resources/xbrl_xsd/xl-2003-12-31.xsd +246 -0
  185. data/test/lib/xbrlware/resources/xbrl_xsd/xlink-2003-12-31.xsd +117 -0
  186. data/test/lib/xbrlware/taxonomy_test.rb +124 -0
  187. data/test/lib/xbrlware/util_test.rb +18 -0
  188. data/test/lib/xbrlware/xml_parser_test.rb +142 -0
  189. data/test/schema_validator_jruby.rb +40 -0
  190. data/test/schema_validator_ruby.rb +7 -0
  191. data/test/scratchpad/block.rb +36 -0
  192. data/test/test_helper.rb +21 -0
  193. data/xbrlware.iml +30 -0
  194. metadata +261 -0
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/ruby
2
+ #
3
+ # Author:: xbrlware@bitstat.com
4
+ #
5
+ # Copyright:: 2009, 2010 bitstat (http://www.bitstat.com). All Rights Reserved.
6
+ #
7
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
16
+ # implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+ module Xbrlware
21
+ module Linkbase
22
+ class CalculationLinkbase < Linkbase
23
+ # Creates a CalculationLinkbase.
24
+ #
25
+ # linkbase_path::
26
+ # XBRL Calculation Linkbase source. Tries to load and parse calculationlinkbase from path.
27
+ #
28
+ # instance::
29
+ # Instance object
30
+ #
31
+ # label_linkbase::
32
+ # optional parameter, LabelLinkbase object
33
+ def initialize(linkbase_path, instance, label_linkbase=nil)
34
+ super linkbase_path
35
+ @instance=instance
36
+ @label_linkbase=label_linkbase
37
+ end
38
+
39
+ def calculation(role=nil)
40
+ calculations=[]
41
+ calc_content=@linkbase_content["calculationLink"]
42
+ calc_content.each do |cal|
43
+
44
+ next unless cal["xlink:role"]==role unless role.nil?
45
+
46
+ if cal["calculationArc"].nil?
47
+ calculations << Calculation.new(@instance.entity_details, cal["xlink:title"], cal["xlink:role"], @role_map[cal["xlink:role"]])
48
+ else
49
+ contexts_and_arcs=arcs(cal)
50
+ calculations << Calculation.new(@instance.entity_details, cal["xlink:title"], cal["xlink:role"], @role_map[cal["xlink:role"]], contexts_and_arcs["arcs"], contexts_and_arcs["contexts"])
51
+ end
52
+ end
53
+ return calculations[0] unless role.nil?
54
+ calculations
55
+ end
56
+
57
+ private
58
+ def arcs(calc)
59
+ locators={}
60
+ calc["loc"].each do |loc|
61
+ href = loc["xlink:href"]
62
+ unless href.index("#").nil?
63
+ locators[loc["xlink:label"]]= href[href.index("#")+1, href.length]
64
+ else
65
+ locators[loc["xlink:label"]]=href
66
+ end
67
+ end
68
+
69
+ arc_map={}
70
+ contexts = Set.new()
71
+
72
+ calc["calculationArc"].each do |arc|
73
+ to_label = nil
74
+ unless @label_linkbase.nil?
75
+ to_label_obj=@label_linkbase.label(locators[arc["xlink:to"]], arc["preferredLabel"]) unless arc["preferredLabel"].nil?
76
+ to_label_obj=@label_linkbase.label(locators[arc["xlink:to"]], "http://www.xbrl.org/2003/role/label") if arc["preferredLabel"].nil?
77
+ to_label = to_label_obj.value unless to_label_obj.nil?
78
+ end
79
+
80
+ to = Calculation::CalculationArc.new(arc["xlink:to"], locators[arc["xlink:to"]], arc["xlink:arcrole"], arc["order"], arc["weight"], arc["priority"], arc["use"], to_label)
81
+ from = Calculation::CalculationArc.new(arc["xlink:from"], locators[arc["xlink:from"]])
82
+
83
+ to_item_name = locators[arc["xlink:to"]].gsub(/.*_/, "")
84
+ from_item_name = locators[arc["xlink:from"]].gsub(/.*_/, "")
85
+
86
+ to_item_map=item_map(@instance.item(to_item_name))
87
+ to.items=to_item_map.values
88
+ contexts.merge(to_item_map.keys)
89
+
90
+ from_item_map=item_map(@instance.item(from_item_name))
91
+ from.items=from_item_map.values
92
+ contexts.merge(from_item_map.keys)
93
+
94
+ if arc_map.has_key?(from)
95
+ arc_map[from] << to
96
+ else
97
+ arc_map[from]=[to]
98
+ end
99
+ end
100
+
101
+ return {"contexts" => contexts, "arcs" => Linkbase.build_relationship(arc_map)}
102
+ end
103
+
104
+ private
105
+ def item_map(items)
106
+ item_map={}
107
+ items.each do |item|
108
+ item_map[item.context]=item
109
+ end unless items.nil?
110
+ item_map
111
+ end
112
+
113
+ public
114
+ class Calculation < Linkbase::Link
115
+
116
+ attr_reader :contexts, :entity_details
117
+
118
+ def initialize(entity_details, title, role, href=nil, arcs=nil, contexts=nil)
119
+ super(title, role, href, arcs)
120
+ @contexts=contexts
121
+ @entity_details=entity_details
122
+ end
123
+
124
+ class CalculationArc < Linkbase::Link::Arc
125
+ attr_reader :weight, :use
126
+
127
+ def initialize(item_id, href, role=nil, order=nil, weight=nil, priority=nil, use=nil, label=nil)
128
+ super item_id, href, role, order, priority, label
129
+ @weight=weight.to_i
130
+ @use=use
131
+ end
132
+ end
133
+ end
134
+
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,186 @@
1
+ #!/usr/bin/ruby
2
+ #
3
+ # Author:: xbrlware@bitstat.com
4
+ #
5
+ # Copyright:: 2009, 2010 bitstat (http://www.bitstat.com). All Rights Reserved.
6
+ #
7
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
16
+ # implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+ module Xbrlware
21
+ module Linkbase
22
+ class DefinitionLinkbase < Linkbase
23
+
24
+ @@constants = {"primaryItem-hypercube" => "http://xbrl.org/int/dim/arcrole/all",
25
+ "hypercube-dimension" => "http://xbrl.org/int/dim/arcrole/hypercube-dimension",
26
+ "dimension-domain" => "http://xbrl.org/int/dim/arcrole/dimension-domain",
27
+ "domain-member" => "http://xbrl.org/int/dim/arcrole/domain-member"}
28
+
29
+ # Creates a DefinitionLinkbase.
30
+ #
31
+ # linkbase_path::
32
+ # XBRL Definition Linkbase source. Tries to load and parse definition linkbase from path.
33
+ #
34
+ # label_linkbase::
35
+ # optional parameter, takes LabelLinkbase object
36
+ def initialize(linkbase_path, label_linkbase=nil)
37
+ super linkbase_path
38
+ @label_linkbase=label_linkbase
39
+ end
40
+
41
+ def definition(role=nil)
42
+
43
+ definitions=[]
44
+ def_content=@linkbase_content["definitionLink"]
45
+ def_content.each do |def_|
46
+
47
+ next unless def_["xlink:role"]==role unless role.nil?
48
+
49
+ if def_["definitionArc"].nil?
50
+ definitions << Definition.new(def_["xlink:title"], def_["xlink:role"], @role_map[def_["xlink:role"]])
51
+ else
52
+ arcs=arcs(def_)
53
+ definitions << Definition.new(def_["xlink:title"], def_["xlink:role"], @role_map[def_["xlink:role"]], primary_items(arcs))
54
+ end
55
+ end
56
+ return definitions[0] unless role.nil?
57
+ definitions
58
+ end
59
+
60
+ private
61
+ def primary_items(arcs)
62
+ items=Set.new
63
+ arcs.each do |arc|
64
+ arc.children.each do |child|
65
+ if child.role==@@constants["primaryItem-hypercube"]
66
+ items << arc
67
+ break
68
+ end
69
+ end if arc.has_children?
70
+ end
71
+
72
+ items.each do |primary_item|
73
+
74
+ hypercubes=[]
75
+ primary_item.children.each do |p_child|
76
+ hypercubes << p_child if p_child.role==@@constants["primaryItem-hypercube"]
77
+ end if primary_item.has_children?
78
+ primary_item.children = hypercubes
79
+ MetaUtil::introduce_instance_alias(primary_item, "hypercubes", "children")
80
+
81
+ primary_item.hypercubes.each do |hypercube|
82
+ dimensions=[]
83
+ hypercube.children.each do |h_child|
84
+ dimensions << h_child if h_child.role==@@constants["hypercube-dimension"]
85
+ end if hypercube.has_children?
86
+ hypercube.children=dimensions
87
+ MetaUtil::introduce_instance_alias(hypercube, "dimensions", "children")
88
+
89
+ hypercube.dimensions.each do |dimension|
90
+ domains=[]
91
+ dimension.children.each do |di_child|
92
+ domains << di_child if di_child.role==@@constants["dimension-domain"]
93
+ end if dimension.has_children?
94
+ dimension.children=domains
95
+ MetaUtil::introduce_instance_alias(dimension, "domains", "children")
96
+
97
+ dimension.domains.each do |domain|
98
+ members=[]
99
+ domain.children.each do |do_child|
100
+ members << do_child if do_child.role==@@constants["domain-member"]
101
+ end if domain.has_children?
102
+ MetaUtil::introduce_instance_alias(domain, "members", "children")
103
+ MetaUtil::introduce_instance_writer(domain, "members", "children")
104
+ end
105
+ end
106
+ end
107
+ end
108
+ items
109
+ end
110
+
111
+ private
112
+ def arcs(def_)
113
+
114
+ locators={}
115
+ def_["loc"].each do |loc|
116
+ href = loc["xlink:href"]
117
+ unless href.index("#").nil?
118
+ locators[loc["xlink:label"]]= href[href.index("#")+1, href.length]
119
+ else
120
+ locators[loc["xlink:label"]]=href
121
+ end
122
+ end
123
+
124
+ arc_map={}
125
+
126
+ def_["definitionArc"].each do |arc|
127
+
128
+ to_label = nil
129
+ unless @label_linkbase.nil?
130
+ to_label_obj=@label_linkbase.label(locators[arc["xlink:to"]], arc["preferredLabel"]) unless arc["preferredLabel"].nil?
131
+ to_label_obj=@label_linkbase.label(locators[arc["xlink:to"]], "http://www.xbrl.org/2003/role/label") if arc["preferredLabel"].nil?
132
+ to_label = to_label_obj.value unless to_label_obj.nil?
133
+ end
134
+
135
+ to = Definition::DefinitionArc.new(arc["xlink:to"], locators[arc["xlink:to"]], arc["xlink:arcrole"], arc["order"], arc["priority"], to_label, arc["xbrldt:contextElement"])
136
+ from = Definition::DefinitionArc.new(arc["xlink:from"], locators[arc["xlink:from"]])
137
+
138
+ if arc_map.has_key?(from)
139
+ arc_map[from] << to
140
+ else
141
+ arc_map[from]=[to]
142
+ end
143
+ end
144
+
145
+ return Linkbase.build_relationship(arc_map)
146
+ end
147
+
148
+ public
149
+ class Definition < Linkbase::Link
150
+
151
+ attr_reader :primary_items
152
+
153
+ def initialize(title, role, href=nil, primary_items=nil)
154
+ super(title, role, href, primary_items)
155
+ @primary_items=primary_items
156
+ end
157
+
158
+ def dimension_domain_map
159
+ dim_dom_map={}
160
+ @primary_items.each do |primary_item|
161
+ primary_item.hypercubes.each do |hypercube|
162
+ hypercube.dimensions.each do |dimension|
163
+ domains=[]
164
+ dimension.domains.each do |domain|
165
+ domains << domain.href.sub("_", ":")
166
+ end
167
+ dim_dom_map[dimension.href.sub("_", ":")]=domains
168
+ end
169
+ end
170
+ end unless @primary_items.nil?
171
+ dim_dom_map
172
+ end
173
+
174
+ class DefinitionArc < Linkbase::Link::Arc
175
+ attr_reader :ctx_element
176
+
177
+ def initialize(item_id, href, role=nil, order=nil, priority=nil, label=nil, ctx_element=nil)
178
+ super item_id, href, role, order, priority, label
179
+ @ctx_element=ctx_element
180
+ end
181
+ end
182
+ end
183
+
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/ruby
2
+ #
3
+ # Author:: xbrlware@bitstat.com
4
+ #
5
+ # Copyright:: 2009, 2010 bitstat (http://www.bitstat.com). All Rights Reserved.
6
+ #
7
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
16
+ # implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+ module Xbrlware
21
+ module Linkbase
22
+ class LabelLinkbase < Linkbase
23
+ # Creates a LabelLinkbase.
24
+ #
25
+ # linkbase_path::
26
+ # XBRL Label Linkbase source. Tries to load and parse label linkbase from path.
27
+ def initialize(linkbase_path)
28
+ super linkbase_path
29
+ @label_map={}
30
+ parse_content
31
+ end
32
+
33
+ def label(item_name, label_role=nil, language=["en-US", "en"])
34
+ return @label_map[item_name] if label_role.nil?
35
+ return @label_map[item_name][label_role] unless @label_map[item_name].nil? if language.nil?
36
+ return @label_map[item_name][label_role][language] unless @label_map[item_name].nil? || @label_map[item_name][label_role].nil? if language.is_a?(String)
37
+ language.each do |lang|
38
+ lab = @label_map[item_name][label_role][lang] unless @label_map[item_name].nil? || @label_map[item_name][label_role].nil?
39
+ return lab unless lab.nil?
40
+ end if language.is_a?(Array)
41
+ return nil
42
+ end
43
+
44
+
45
+ def inspect(verbose_flag="q")
46
+ str = StringIO.new
47
+ @label_map.each do |key, value|
48
+ str << key
49
+ if verbose_flag=="v"
50
+ value.each do |k, v|
51
+ str << "\n" << "\t"
52
+ str << " role [" << k << "]"
53
+ str << "\n" << "\t\t"
54
+ v.each do |lang, label|
55
+ str << " lang [" << lang << "] label [" << label.value << "]"
56
+ end
57
+ end
58
+ end
59
+ str << "\n"
60
+ end
61
+ puts str.string
62
+ return self.to_s
63
+ end
64
+
65
+ private
66
+ def parse_content()
67
+
68
+ label_links=@linkbase_content["labelLink"]
69
+ label_links.each do |label_content|
70
+ loc_map=locator_map(label_content["loc"])
71
+ arc_map=linkarc_map(label_content["labelArc"])
72
+
73
+ labels=label_content["label"]
74
+ labels.each do |label|
75
+ l=Label.new(label["xlink:type"], label["xlink:role"], label["xlink:label"], label["xml:lang"], label["content"], @role_map[label["xlink:role"]])
76
+ item_name=loc_map[arc_map[label["xlink:label"]]]
77
+ if @label_map[item_name].nil?
78
+ @label_map[item_name]={l.role => {l.lang => l}}
79
+ else
80
+ if @label_map[item_name][l.role].nil?
81
+ @label_map[item_name][l.role] = {l.lang => l}
82
+ else
83
+ @label_map[item_name][l.role][l.lang] = l
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ def linkarc_map(arcs)
91
+ arc_map={}
92
+ arcs.each do |arc|
93
+ arc_map[arc["xlink:to"]]=arc["xlink:from"]
94
+ end
95
+ arc_map
96
+ end
97
+
98
+ def locator_map(locators)
99
+ locator_map={}
100
+ locators.each do |loc|
101
+ href = loc["xlink:href"]
102
+ unless href.index("#").nil?
103
+ locator_map[loc["xlink:label"]]=href[href.index("#")+1, href.length]
104
+ else
105
+ locator_map[loc["xlink:label"]]=href
106
+ end
107
+ end
108
+ locator_map
109
+ end
110
+
111
+ public
112
+ class Label
113
+
114
+ attr_reader :type, :role, :href, :label, :lang, :value
115
+
116
+ def initialize(type, role, label, lang, value, href=nil)
117
+ @type=type
118
+ @role=role
119
+ @label=label
120
+ @lang=lang
121
+ @value=value
122
+ @href=href
123
+ end
124
+ end
125
+
126
+ end
127
+ end
128
+ end