mdarray-jcsv 0.6.3-java

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 (44) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +23 -0
  3. data/README.md +2 -0
  4. data/Rakefile +46 -0
  5. data/config.rb +104 -0
  6. data/lib/constraints.rb +205 -0
  7. data/lib/date_filters.rb +252 -0
  8. data/lib/dimensions.rb +276 -0
  9. data/lib/filters.rb +332 -0
  10. data/lib/jcsv.rb +107 -0
  11. data/lib/list_reader.rb +200 -0
  12. data/lib/locale.rb +192 -0
  13. data/lib/map_reader.rb +192 -0
  14. data/lib/mdarray-jcsv.rb +24 -0
  15. data/lib/mdarray_reader.rb +110 -0
  16. data/lib/numeric_filters.rb +225 -0
  17. data/lib/reader.rb +547 -0
  18. data/lib/supercsv_interface.rb +231 -0
  19. data/test/test_complete.rb +37 -0
  20. data/test/test_critbit.rb +442 -0
  21. data/test/test_customer_list.rb +436 -0
  22. data/test/test_customer_map.rb +209 -0
  23. data/test/test_customer_nhlist.rb +161 -0
  24. data/test/test_deep_map.rb +264 -0
  25. data/test/test_del.rb +73 -0
  26. data/test/test_dimensions.rb +231 -0
  27. data/test/test_example.rb +79 -0
  28. data/test/test_filters.rb +374 -0
  29. data/test/test_list_dimensions.rb +110 -0
  30. data/test/test_mdarray.rb +227 -0
  31. data/test/test_missing_data.rb +57 -0
  32. data/vendor/commons-beanutils-1.8.3.jar +0 -0
  33. data/vendor/commons-lang3-3.1.jar +0 -0
  34. data/vendor/dozer-5.4.0.jar +0 -0
  35. data/vendor/jcl-over-slf4j-1.6.6.jar +0 -0
  36. data/vendor/joda-time-2.7.jar +0 -0
  37. data/vendor/slf4j-api-1.7.5.jar +0 -0
  38. data/vendor/snakeyaml-1.14.jar +0 -0
  39. data/vendor/super-csv-2.4.0.jar +0 -0
  40. data/vendor/super-csv-dozer-2.4.0.jar +0 -0
  41. data/vendor/super-csv-java8-2.4.0.jar +0 -0
  42. data/vendor/super-csv-joda-2.4.0.jar +0 -0
  43. data/version.rb +2 -0
  44. metadata +196 -0
@@ -0,0 +1,107 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ##########################################################################################
4
+ # @author Rodrigo Botafogo
5
+ #
6
+ # Copyright © 2015 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
7
+ # and distribute this software and its documentation, without fee and without a signed
8
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
9
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
10
+ # distributions.
11
+ #
12
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
13
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
14
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
15
+ # POSSIBILITY OF SUCH DAMAGE.
16
+ #
17
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
19
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
20
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
21
+ # OR MODIFICATIONS.
22
+ ##########################################################################################
23
+
24
+ require_relative '../config'
25
+ require_relative 'filters'
26
+ require_relative 'reader'
27
+
28
+ # Ignoring surrounding spaces if they're not within quotes
29
+ # In accordance with RFC 4180, the default behaviour of Super CSV is to treat all spaces
30
+ # as important, including spaces surrounding the text in a cell.
31
+ #
32
+ # This means for reading, a cell with contents surrounded by spaces is read with
33
+ # surrounding spaces preserved. And for writing, the same String is written with surrounding
34
+ # spaces and no surrounding quotes (they're not required, as spaces are considered important).
35
+ #
36
+ # There are some scenarios where this restriction must be relaxed, in particular when the CSV
37
+ # file you're working with assumes that surrounding spaces must be surrounded by quotes,
38
+ # otherwise will be ignored. For this reason, Super CSV allows you to enable the
39
+ # surrounding_spaces_need_quotes preference.
40
+ #
41
+ # With surrounding_spaces_need_quotes enabled, it means that for reading, a cell with contents
42
+ # ' surrounded by spaces ' would be read as 'surrounded by spaces' (surrounding spaces
43
+ # are trimmed), unless the String has surrounding quotes, e.g. " surrounded by spaces ",
44
+ # in which case the spaces are preserved. And for writing, any String containing surrounding
45
+ # spaces will automatically be given surrounding quotes when written in order to preserve
46
+ # the spaces.
47
+ #
48
+ # You can enable this behaviour by calling surrounding_spaces_need_quotes(true) on the Builder.
49
+ # You can do this with your own custom preference, or customize an existing preference
50
+
51
+ # Skipping comments
52
+ # Although comments aren't part of RFC4180, some CSV files use them so it's useful to be able
53
+ # to skip these lines (or even skip lines because they contain invalid data). You can use one
54
+ # of the predefined comment matchers:
55
+ #
56
+ # CommentStartsWith - matches lines that start with a specified String
57
+ # CommentMatches - matches lines that match a specified regular expression
58
+ # Or if you like you can write your own by implementing the CommentMatcher interface.
59
+
60
+ class Jcsv
61
+ include_package "org.supercsv.cellprocessor.ift"
62
+
63
+ attr_reader :reader
64
+
65
+ #---------------------------------------------------------------------------------------
66
+ # @param end_of_line_symbols The end of line symbols to use when writing (Windows, Mac
67
+ # and Linux style line breaks are all supported when reading, so this preference won't be
68
+ # used at all for reading).
69
+ # @param encoder Use your own encoder when writing CSV. See the section on custom
70
+ # encoders below.
71
+ # quoteMode
72
+ # Allows you to enable surrounding quotes for writing (if a column wouldn't normally be
73
+ # quoted because it doesn't contain special characters).
74
+ #---------------------------------------------------------------------------------------
75
+
76
+ def self.write
77
+
78
+ end
79
+
80
+ #---------------------------------------------------------------------------------------
81
+ #
82
+ #---------------------------------------------------------------------------------------
83
+
84
+ def self.reader(*params)
85
+
86
+ format = params[1]? params[1][:format] : :list
87
+
88
+ case format
89
+ when :map, :critbit
90
+ @reader = Jcsv::MapReader.new(*params)
91
+ when :mdarray
92
+ @reader = Jcsv::MDArrayReader.new(*params)
93
+ else
94
+ @reader = Jcsv::ListReader.new(*params)
95
+ end
96
+
97
+ end
98
+
99
+ #---------------------------------------------------------------------------------------
100
+ #
101
+ #---------------------------------------------------------------------------------------
102
+
103
+ def filters=(filters)
104
+ @reader.filters=(filters)
105
+ end
106
+
107
+ end
@@ -0,0 +1,200 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ##########################################################################################
4
+ # @author Rodrigo Botafogo
5
+ #
6
+ # Copyright © 2015 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
7
+ # and distribute this software and its documentation, without fee and without a signed
8
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
9
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
10
+ # distributions.
11
+ #
12
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
13
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
14
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
15
+ # POSSIBILITY OF SUCH DAMAGE.
16
+ #
17
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
19
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
20
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
21
+ # OR MODIFICATIONS.
22
+ ##########################################################################################
23
+
24
+ require_relative "supercsv_interface"
25
+
26
+ class Jcsv
27
+
28
+ #========================================================================================
29
+ #
30
+ #========================================================================================
31
+
32
+ class ListReader < Reader
33
+ include_package "java.io"
34
+
35
+ #---------------------------------------------------------------------------------------
36
+ # read the file.
37
+ #---------------------------------------------------------------------------------------
38
+
39
+ def read(&block)
40
+
41
+ # When no block given, chunks read are stored in an array and returned to the user.
42
+ if (!block_given?)
43
+ rows = []
44
+ parse_with_block do |line_no, row_no, chunk|
45
+ rows << chunk
46
+ end
47
+ rows
48
+ else
49
+ parse_with_block(&block)
50
+ end
51
+
52
+ end
53
+
54
+ #---------------------------------------------------------------------------------------
55
+ #
56
+ #---------------------------------------------------------------------------------------
57
+
58
+ private
59
+
60
+ #========================================================================================
61
+ # This module should be included if the ListReader has headers; otherwise, the
62
+ # HeaderLess module should be included.
63
+ #========================================================================================
64
+
65
+ module Header
66
+
67
+ #---------------------------------------------------------------------------------------
68
+ # When file has headers, mapping should be done through the use of a hash like data
69
+ # structure that responds to [] with a key. A mapping allows reordering of columns and
70
+ # also columns removal. A column will be removed if this columns mapping is false.
71
+ # When reading with dimensions, a mapping is automatically created and dimensions are
72
+ # mapped to true.
73
+ #---------------------------------------------------------------------------------------
74
+
75
+ def mapping=(column_mapping)
76
+
77
+ # should allow mapping even with dimensions, but we need to be careful since
78
+ # dimensions set a mapping and this needs to be preserved.
79
+ @column_mapping.mapping ||= Array.new
80
+
81
+ j = 0
82
+ @headers.each_with_index do |h, i|
83
+ if column_mapping[h].nil?
84
+ @column_mapping.mapping[i] ||= j
85
+ j += 1
86
+ else
87
+ raise "'true' is not allowed as a mapping: #{column_mapping}" if
88
+ column_mapping[h] == true
89
+ @column_mapping.mapping[i] ||= column_mapping[h]
90
+ end
91
+ end
92
+
93
+ end
94
+
95
+ end
96
+
97
+ #========================================================================================
98
+ # Headerless ListReader
99
+ #========================================================================================
100
+
101
+ module HeaderLess
102
+
103
+ #---------------------------------------------------------------------------------------
104
+ # TODO: Needs to be reviewed. Headerless ListReader needs further testing and
105
+ # eventually a new set of features.
106
+ #---------------------------------------------------------------------------------------
107
+
108
+ def mapping=(map)
109
+
110
+ raise "Mapping with array is not allowed when 'dimensions' are defined" if @dim_set
111
+
112
+ raise "Filters parameters should either be a hash or an array of filters" if
113
+ !map.is_a? Array
114
+
115
+ @column_mapping.mapping ||= map
116
+ @dim_set = true if @dimensions
117
+
118
+ end
119
+
120
+ end
121
+
122
+ #========================================================================================
123
+ #
124
+ #========================================================================================
125
+
126
+ #---------------------------------------------------------------------------------------
127
+ # Should be called when the data has headers
128
+ #---------------------------------------------------------------------------------------
129
+
130
+ def prepare_headers
131
+ extend Header
132
+ super
133
+ end
134
+
135
+ #---------------------------------------------------------------------------------------
136
+ # Should be called for headerless data
137
+ #---------------------------------------------------------------------------------------
138
+
139
+ def headerless
140
+ extend HeaderLess
141
+ super
142
+ end
143
+
144
+ #---------------------------------------------------------------------------------------
145
+ #
146
+ #---------------------------------------------------------------------------------------
147
+
148
+ private
149
+
150
+ #---------------------------------------------------------------------------------------
151
+ # Creates a new CLR reader with the given set of preferences
152
+ #---------------------------------------------------------------------------------------
153
+
154
+ def new_reader(preferences)
155
+
156
+ begin
157
+ @reader = CLR.new(FileReader.new(@filename), preferences, @dimensions,
158
+ @suppress_warnings)
159
+ rescue java.io.IOException => e
160
+ puts e
161
+ end
162
+
163
+ end
164
+
165
+ #---------------------------------------------------------------------------------------
166
+ #
167
+ #---------------------------------------------------------------------------------------
168
+
169
+ def format(chunk)
170
+ chunk.to_a
171
+ end
172
+
173
+ #---------------------------------------------------------------------------------------
174
+ #
175
+ #---------------------------------------------------------------------------------------
176
+
177
+ def assign_mapping(column_mapping)
178
+
179
+ # should allow mapping even with dimensions, but we need to be careful since
180
+ # dimensions set a mapping and this needs to be preserved.
181
+ @column_mapping.mapping ||= Array.new
182
+
183
+ j = 0
184
+ @headers.each_with_index do |h, i|
185
+ if column_mapping[h].nil?
186
+ @column_mapping.mapping[i] ||= j
187
+ j += 1
188
+ else
189
+ @column_mapping.mapping[i] ||= column_mapping[h]
190
+ end
191
+ end
192
+
193
+ # p @column_mapping.mapping
194
+
195
+ end
196
+
197
+ end
198
+
199
+ end
200
+
@@ -0,0 +1,192 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ##########################################################################################
4
+ # @author Rodrigo Botafogo
5
+ #
6
+ # Copyright © 2015 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
7
+ # and distribute this software and its documentation, without fee and without a signed
8
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
9
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
10
+ # distributions.
11
+ #
12
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
13
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
14
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
15
+ # POSSIBILITY OF SUCH DAMAGE.
16
+ #
17
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
19
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
20
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
21
+ # OR MODIFICATIONS.
22
+ ##########################################################################################
23
+
24
+ class Jcsv
25
+
26
+ class Locale
27
+
28
+ attr_accessor :locale
29
+
30
+ class << self
31
+ attr_accessor :available_locs
32
+ end
33
+
34
+ Locale.available_locs = []
35
+
36
+ #---------------------------------------------------------------------------------------
37
+ #
38
+ #---------------------------------------------------------------------------------------
39
+
40
+ def self.available_locales
41
+
42
+ if (@available_locs.size == 0)
43
+ java.util.Locale.available_locales.each do |loc|
44
+ @available_locs << Locale.new(loc)
45
+ end
46
+ end
47
+
48
+ @available_locs
49
+
50
+ end
51
+
52
+ #---------------------------------------------------------------------------------------
53
+ #
54
+ #---------------------------------------------------------------------------------------
55
+
56
+ def self.default
57
+ Locale.new(locale: java.util.Locale.default)
58
+ end
59
+
60
+ #---------------------------------------------------------------------------------------
61
+ #
62
+ #---------------------------------------------------------------------------------------
63
+
64
+ def self.default=(locale)
65
+ java.util.Locale.set_default(locale.locale)
66
+ end
67
+
68
+ #---------------------------------------------------------------------------------------
69
+ #
70
+ #---------------------------------------------------------------------------------------
71
+
72
+ def self.method_missing(symbol, *args)
73
+ java.util.Locale.send(symbol, *args)
74
+ end
75
+
76
+ #---------------------------------------------------------------------------------------
77
+ #
78
+ #---------------------------------------------------------------------------------------
79
+
80
+ def initialize(locale: nil, language: nil, country: nil, variant: nil)
81
+
82
+ args = [language, country, variant]
83
+
84
+ if (locale)
85
+ @locale = locale
86
+ else
87
+ @locale = java.util.Locale.new(*(args.compact))
88
+ end
89
+
90
+ end
91
+
92
+ #---------------------------------------------------------------------------------------
93
+ #
94
+ #---------------------------------------------------------------------------------------
95
+
96
+ def method_missing(symbol, *args)
97
+ @locale.send(symbol, *args)
98
+ end
99
+
100
+ end
101
+
102
+ #=========================================================================================
103
+ #
104
+ #=========================================================================================
105
+
106
+ class Locale
107
+
108
+ CANADA = Locale.new(locale: java.util.Locale::CANADA)
109
+ CANADA_FRENCH = Locale.new(locale: java.util.Locale::CANADA_FRENCH)
110
+ CHINA = Locale.new(locale: java.util.Locale::CHINA)
111
+ CHINESE = Locale.new(locale: java.util.Locale::CHINESE)
112
+ ENGLISH = Locale.new(locale: java.util.Locale::ENGLISH)
113
+ FRANCE = Locale.new(locale: java.util.Locale::FRANCE)
114
+ FRENCH = Locale.new(locale: java.util.Locale::FRENCH)
115
+ GERMAN = Locale.new(locale: java.util.Locale::GERMAN)
116
+ GERMANY = Locale.new(locale: java.util.Locale::GERMANY)
117
+ ITALIAN = Locale.new(locale: java.util.Locale::ITALIAN)
118
+ ITALY = Locale.new(locale: java.util.Locale::ITALY)
119
+ JAPAN = Locale.new(locale: java.util.Locale::JAPAN)
120
+ JAPANESE = Locale.new(locale: java.util.Locale::JAPANESE)
121
+ KOREA = Locale.new(locale: java.util.Locale::KOREA)
122
+ KOREAN = Locale.new(locale: java.util.Locale::KOREAN)
123
+ PRC = Locale.new(locale: java.util.Locale::PRC)
124
+ ROOT = Locale.new(locale: java.util.Locale::ROOT)
125
+ SIMPLIFIED_CHINESE = Locale.new(locale: java.util.Locale::SIMPLIFIED_CHINESE)
126
+ TAIWAN = Locale.new(locale: java.util.Locale::TAIWAN)
127
+ TRADITIONAL_CHINESE = Locale.new(locale: java.util.Locale::TRADITIONAL_CHINESE)
128
+ UK = Locale.new(locale: java.util.Locale::UK)
129
+ US = Locale.new(locale: java.util.Locale::US)
130
+ BRAZIL = Locale.new(language: "pt", country: "BR")
131
+
132
+ end
133
+
134
+ ##########################################################################################
135
+ #
136
+ ##########################################################################################
137
+
138
+ class DFSymbols
139
+
140
+ attr_accessor :decimal_format_symbols
141
+
142
+ class << self
143
+ attr_accessor :available_locs
144
+ end
145
+
146
+ DFSymbols.available_locs = []
147
+
148
+ #---------------------------------------------------------------------------------------
149
+ #
150
+ #---------------------------------------------------------------------------------------
151
+
152
+ def self.available_locales
153
+
154
+ if (@available_locs.size == 0)
155
+ java.text.DecimalFormatSymbols.available_locales.each do |loc|
156
+ @available_locs << Locale.new(loc)
157
+ end
158
+ end
159
+
160
+ @available_locs
161
+
162
+ end
163
+
164
+ #---------------------------------------------------------------------------------------
165
+ #
166
+ #---------------------------------------------------------------------------------------
167
+
168
+ def self.method_missing(symbol, *args)
169
+ java.text.DecimalFormatSymbols.send(symbol, *args)
170
+ end
171
+
172
+ #---------------------------------------------------------------------------------------
173
+ #
174
+ #---------------------------------------------------------------------------------------
175
+
176
+ def initialize(locale = nil)
177
+ @decimal_format_symbols = (locale.nil?)? java.text.DecimalFormatSymbols.new() :
178
+ java.text.DecimalFormatSymbols.new(locale.locale)
179
+ end
180
+
181
+ #---------------------------------------------------------------------------------------
182
+ #
183
+ #---------------------------------------------------------------------------------------
184
+
185
+ def method_missing(symbol, *args)
186
+ @decimal_format_symbols.send(symbol, *args)
187
+ end
188
+
189
+ end
190
+
191
+ end
192
+