xbrlware-ruby19 1.1.2.19

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.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in xbrlware-ruby19.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Jim Lindstrom
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ # Xbrlware-ruby19
2
+
3
+ xbrlware-ruby19 is a re-packaging and ruby19-ification of <http://code.google.com/p/xbrlware/>, which describes itself as "a fast, lightweight framework for automation & analysis of XBRL." This repackaging carries the same Apache2.0 licensing as the original package.
4
+
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,58 @@
1
+ # This patch is to fix a bug in Ruby 1.8.x CGI::unescapeHTML
2
+ # Till we upgrade to Ruby 1.9, we will use this patch. Ruby 1.9 handles it properly.
3
+ # Other alternative is using htmlentities - http://htmlentities.rubyforge.org/
4
+ #
5
+ # Bug explanation,
6
+ # CGI::unescapeHTML("Equity in Earnings&#160;of") returns "Equity in Earnings\240of" instead of "Equity in Earnings of"
7
+ # CGI::unescapeHTML is not handling HTML numbers bigger than &#126;
8
+ #
9
+ # Fix explanation
10
+ # If HTML number is bigger than &#126; treat them as &#32; (32 is for space)
11
+
12
+ # below method copied from ruby-1.8.7-p248, ruby 1.8.7 (2009-12-24 patchlevel 248) for patching.
13
+
14
+
15
+ #class CGI
16
+ # # Unescape a string that has been HTML-escaped
17
+ # # CGI::unescapeHTML("Usage: foo &quot;bar&quot; &lt;baz&gt;")
18
+ # # # => "Usage: foo \"bar\" <baz>"
19
+ # def CGI::unescapeHTML(string)
20
+ # string.gsub(/&(amp|quot|gt|lt|\#[0-9]+|\#x[0-9A-Fa-f]+);/n) do
21
+ # match = $1.dup
22
+ # case match
23
+ # when 'amp' then
24
+ # '&'
25
+ # when 'quot' then
26
+ # '"'
27
+ # when 'gt' then
28
+ # '>'
29
+ # when 'lt' then
30
+ # '<'
31
+ # when /\A#0*(\d+)\z/n then
32
+ # if Integer($1) < 256
33
+ # 32.chr if Integer($1) > 126
34
+ # Integer($1).chr if Integer($1) <= 126
35
+ # else
36
+ # if Integer($1) < 65536 and ($KCODE[0] == ?u or $KCODE[0] == ?U)
37
+ # [Integer($1)].pack("U")
38
+ # else
39
+ # "&##{$1};"
40
+ # end
41
+ # end
42
+ # when /\A#x([0-9a-f]+)\z/ni then
43
+ # if $1.hex < 128
44
+ # $1.hex.chr
45
+ # else
46
+ # if $1.hex < 65536 and ($KCODE[0] == ?u or $KCODE[0] == ?U)
47
+ # [$1.hex].pack("U")
48
+ # else
49
+ # "&#x#{$1};"
50
+ # end
51
+ # end
52
+ # else
53
+ # "&#{match};"
54
+ # end
55
+ # end
56
+ # end
57
+ #
58
+ #end
@@ -0,0 +1,29 @@
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
+ # Linkbase constants
22
+ module LBConstants
23
+ CALCULATION="http://www.xbrl.org/2003/role/calculationLinkbaseRef"
24
+ DEFINITION="http://www.xbrl.org/2003/role/definitionLinkbaseRef"
25
+ PRESENTATION="http://www.xbrl.org/2003/role/presentationLinkbaseRef"
26
+ LABEL="http://www.xbrl.org/2003/role/labelLinkbaseRef"
27
+ REFERENCE="http://www.xbrl.org/2003/role/referenceLinkbaseRef"
28
+ end
29
+ end
@@ -0,0 +1,193 @@
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
+ # This class represents each context in the XBRL instance file.
22
+ # Look at {delaing with instance page on xbrlware wiki}[http://code.google.com/p/xbrlware/wiki/InstanceTaxonomy] for more details.
23
+ class Context
24
+ include NSAware
25
+
26
+ attr_reader :id, :entity, :period, :scenario
27
+ PERIOD_FOREVER = -1
28
+
29
+ class Period
30
+ attr_reader :value
31
+
32
+ def initialize(value)
33
+ @value = value
34
+ end
35
+
36
+ def to_s
37
+ @value.to_s
38
+ end
39
+
40
+ def eql?(o)
41
+ o.is_a?(Period) && @value == o.value
42
+ end
43
+
44
+ def hash
45
+ @value.hash
46
+ end
47
+
48
+ def is_instant?
49
+ @value.is_a?(Date)
50
+ end
51
+
52
+ def is_duration?
53
+ @value.is_a?(Hash)
54
+ end
55
+
56
+ def is_forever?
57
+ @value.is_a?(Fixnum)
58
+ end
59
+ end
60
+
61
+ def initialize(id, entity, period, scenario=nil)
62
+ @id = id
63
+ @entity = entity
64
+ @period = Period.new(period)
65
+ @scenario=scenario
66
+ end
67
+
68
+ def has_scenario?
69
+ (not @scenario.nil?)
70
+ end
71
+
72
+ def to_s
73
+ "Id [" + id + "], Entity { " + @entity.to_s + " }, period ["+period.to_s+"]"+ (", scenario ["+scenario+"]" unless scenario.nil?).to_s
74
+ end
75
+
76
+ def eql?(o)
77
+ o.is_a?(Context) && @id == o.id
78
+ end
79
+
80
+ def hash
81
+ @id.hash
82
+ end
83
+
84
+ def has_explicit_dimensions?(dimensions=[])
85
+ return @entity.has_explicit_dimensions?(dimensions) unless @entity.nil?
86
+ false
87
+ end
88
+
89
+ alias_method :has_dimensions?, :has_explicit_dimensions?
90
+
91
+ def explicit_dimensions
92
+ return @entity.explicit_dimensions
93
+ end
94
+
95
+ alias_method :dimensions, :explicit_dimensions
96
+
97
+ def explicit_domains(dimensions=[])
98
+ return @entity.explicit_domains(dimensions)
99
+ end
100
+
101
+ alias_method :domains, :explicit_domains
102
+
103
+ def explicit_dimensions_domains
104
+ return @entity.explicit_dimensions_domains
105
+ end
106
+
107
+ alias_method :dimensions_domains, :explicit_dimensions_domains
108
+
109
+ end
110
+
111
+ class Entity
112
+ attr_reader :identifier, :segment
113
+
114
+ def initialize(identifier, segment=nil)
115
+ @identifier = identifier
116
+ @segment = segment
117
+ end
118
+
119
+ def has_segment?
120
+ (not @segment.nil?)
121
+ end
122
+
123
+ def to_s
124
+ "Identifier { " + @identifier.to_s + " } " + (", segment [" + segment.to_s + "]" unless segment.nil?).to_s
125
+ end
126
+
127
+ def has_explicit_dimensions?(dimensions=[])
128
+ dimensions_set=Set.new
129
+ dimensions_set.merge(dimensions)
130
+ unless @segment.nil? || @segment["explicitMember"].nil?
131
+
132
+ return true if dimensions.size==0
133
+
134
+ dim = Set.new
135
+ @segment["explicitMember"].each do |member|
136
+ dim << member["dimension"]
137
+ end
138
+ return dim.superset?(dimensions_set)
139
+ end
140
+
141
+ return false
142
+ end
143
+
144
+ def explicit_dimensions
145
+ dim = Set.new
146
+ unless @segment.nil? || @segment["explicitMember"].nil?
147
+ @segment["explicitMember"].each do |member|
148
+ dim << member["dimension"]
149
+ end
150
+ end
151
+ return dim.to_a
152
+ end
153
+
154
+ def explicit_domains(dimensions=[])
155
+ dom = Set.new
156
+ if has_explicit_dimensions?(dimensions)
157
+ @segment["explicitMember"].each do |member|
158
+ dimensions=explicit_dimensions if dimensions.size==0
159
+ dimensions.each do |dim|
160
+ next unless dim==member["dimension"]
161
+ dom << member["content"]
162
+ end
163
+ end
164
+ end
165
+ return dom.to_a
166
+ end
167
+
168
+ def explicit_dimensions_domains
169
+ dim_dom={}
170
+ if has_explicit_dimensions?
171
+ @segment["explicitMember"].each do |member|
172
+ dim_dom[member["dimension"]]=[] if dim_dom[member["dimension"]].nil?
173
+ dim_dom[member["dimension"]] << member["content"]
174
+ end
175
+ end
176
+ return dim_dom
177
+ end
178
+
179
+ end
180
+
181
+ class Identifier
182
+ attr_reader :value, :scheme
183
+
184
+ def initialize(scheme, value)
185
+ @scheme = scheme
186
+ @value = value
187
+ end
188
+
189
+ def to_s
190
+ "schema [" + @scheme.to_s + "], value [" + @value.to_s + "]"
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,45 @@
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 DateUtil # :nodoc:
22
+ def self.stringify_date (date)
23
+ return "" if date.nil?
24
+ begin
25
+ _date=Date.parse(date) if date.is_a?(String)
26
+ _date=date if date.is_a?(Date)
27
+ m=Date::ABBR_MONTHNAMES[_date.month]
28
+ m + " " + _date.day.to_s + ", " + _date.year.to_s
29
+ rescue Exception => e
30
+ ""
31
+ end
32
+ end
33
+
34
+ def self.months_between(date1=Date.today, date2=Date.today)
35
+ begin
36
+ date1=Date.parse(date1) if date1.is_a?(String)
37
+ date2=Date.parse(date2) if date2.is_a?(String)
38
+ (date1 > date2) ? (recent_date, past_date = date1, date2) : (recent_date, past_date = date2, date1)
39
+ (recent_date.year - past_date.year) * 12 + (recent_date.month - past_date.month) + 1
40
+ rescue Exception => e
41
+ 0
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,26 @@
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
+ class Float # :nodoc:
21
+ def round_at(precision)
22
+ (self * (10 ** precision)).round.to_f / 10 ** precision
23
+ end
24
+ end
25
+
26
+
@@ -0,0 +1,175 @@
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 HashUtil # :nodoc:
22
+ def self.to_obj(hash)
23
+ o = Object.new()
24
+ hash.each do |k, v|
25
+ v=self.to_obj(v) if v.is_a?(Hash)
26
+ MetaUtil::introduce_instance_var(o, k, v)
27
+ end
28
+ return o
29
+ end
30
+
31
+ # In Ruby 1.9, the Hash is ordered by default.
32
+ if RUBY_VERSION >= '1.9'
33
+ OHash = ::Hash
34
+ else
35
+ class OHash < Hash #:nodoc:
36
+ def initialize(*args, &block)
37
+ super
38
+ @keys = []
39
+ end
40
+
41
+ def self.[](*args)
42
+ ordered_hash = new
43
+
44
+ if (args.length == 1 && args.first.is_a?(Array))
45
+ args.first.each do |key_value_pair|
46
+ next unless (key_value_pair.is_a?(Array))
47
+ ordered_hash[key_value_pair[0]] = key_value_pair[1]
48
+ end
49
+
50
+ return ordered_hash
51
+ end
52
+
53
+ unless (args.size % 2 == 0)
54
+ raise ArgumentError.new("odd number of arguments for Hash")
55
+ end
56
+
57
+ args.each_with_index do |val, ind|
58
+ next if (ind % 2 != 0)
59
+ ordered_hash[val] = args[ind + 1]
60
+ end
61
+
62
+ ordered_hash
63
+ end
64
+
65
+ def initialize_copy(other)
66
+ super
67
+ # make a deep copy of keys
68
+ @keys = other.keys
69
+ end
70
+
71
+ def []=(key, value)
72
+ @keys << key if !has_key?(key)
73
+ super
74
+ end
75
+
76
+ def keys
77
+ @keys.dup
78
+ end
79
+
80
+ def values
81
+ @keys.collect { |key| self[key] }
82
+ end
83
+
84
+ def delete(key)
85
+ if has_key? key
86
+ index = @keys.index(key)
87
+ @keys.delete_at index
88
+ end
89
+ super
90
+ end
91
+
92
+ def delete_if
93
+ super
94
+ sync_keys!
95
+ self
96
+ end
97
+
98
+ def reject!
99
+ super
100
+ sync_keys!
101
+ self
102
+ end
103
+
104
+ def reject(&block)
105
+ dup.reject!(&block)
106
+ end
107
+
108
+ def to_hash
109
+ self
110
+ end
111
+
112
+ def to_a
113
+ @keys.map { |key| [ key, self[key] ] }
114
+ end
115
+
116
+ def each_key
117
+ @keys.each { |key| yield key }
118
+ end
119
+
120
+ def each_value
121
+ @keys.each { |key| yield self[key]}
122
+ end
123
+
124
+ def each
125
+ @keys.each {|key| yield [key, self[key]]}
126
+ end
127
+
128
+ alias_method :each_pair, :each
129
+
130
+ def clear
131
+ super
132
+ @keys.clear
133
+ self
134
+ end
135
+
136
+ def shift
137
+ k = @keys.first
138
+ v = delete(k)
139
+ [k, v]
140
+ end
141
+
142
+ def merge!(other_hash)
143
+ other_hash.each {|k, v| self[k] = v }
144
+ self
145
+ end
146
+
147
+ def merge(other_hash)
148
+ dup.merge!(other_hash)
149
+ end
150
+
151
+ # replace with keys from other Hash. The other Hash could be ordered or not ordered.
152
+ def replace(other)
153
+ super
154
+ @keys = other.keys
155
+ self
156
+ end
157
+
158
+ def inspect
159
+ "#<OHash #{super}>"
160
+ end
161
+
162
+ # XmlSimple's export to xml from Hash depends on instance_of?(Hash)
163
+ def instance_of?(clazz)
164
+ self.is_a?(clazz)
165
+ end
166
+
167
+ private
168
+
169
+ def sync_keys!
170
+ @keys.delete_if {|k| !has_key?(k)}
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end