mcc2 1.5.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 (120) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/.autotest +23 -0
  4. data/.gitignore +15 -0
  5. data/.rubocop.yml +3 -0
  6. data/Gemfile +13 -0
  7. data/History.txt +6 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +51 -0
  10. data/Rakefile +12 -0
  11. data/config/i18n-tasks.yml +193 -0
  12. data/exe/mcc2 +18 -0
  13. data/exe/mcc2-generate-preview +17 -0
  14. data/exe/mcc2print +6 -0
  15. data/lib/libguib16.rb +1620 -0
  16. data/lib/mcc2/advanced_data_edit_dlg.rb +139 -0
  17. data/lib/mcc2/cc_dialogbox.rb +52 -0
  18. data/lib/mcc2/constants.rb +154 -0
  19. data/lib/mcc2/dataman/base.rb +61 -0
  20. data/lib/mcc2/dataman/csv.rb +49 -0
  21. data/lib/mcc2/dataman/database.rb +8 -0
  22. data/lib/mcc2/dataman/dbf.rb +45 -0
  23. data/lib/mcc2/dataman/none.rb +25 -0
  24. data/lib/mcc2/dataview.rb +348 -0
  25. data/lib/mcc2/dataview_dlg.rb +232 -0
  26. data/lib/mcc2/debug_tools.rb +20 -0
  27. data/lib/mcc2/fx_colored_item.rb +101 -0
  28. data/lib/mcc2/generate_preview.rb +68 -0
  29. data/lib/mcc2/gui/advanced_data_edit_dlg.rbin +0 -0
  30. data/lib/mcc2/gui/dataview_dlg.pp +522 -0
  31. data/lib/mcc2/gui/layoutview_dlg.pp +5115 -0
  32. data/lib/mcc2/gui/mcc2_mainwin.pp +838 -0
  33. data/lib/mcc2/gui/picture_data_edit_dlg.rbin +0 -0
  34. data/lib/mcc2/gui/printerview_dlg.pp +3311 -0
  35. data/lib/mcc2/images/Image-Arrow-Left.gif +0 -0
  36. data/lib/mcc2/images/Image-Arrow-Right.gif +0 -0
  37. data/lib/mcc2/images/Image-FastArrowLeft.gif +0 -0
  38. data/lib/mcc2/images/Image-FastArrowRight.bmp +0 -0
  39. data/lib/mcc2/images/Image-FastArrowRight.gif +0 -0
  40. data/lib/mcc2/images/application-exit.png +0 -0
  41. data/lib/mcc2/images/copy.png +0 -0
  42. data/lib/mcc2/images/country_de.png +0 -0
  43. data/lib/mcc2/images/country_gb.png +0 -0
  44. data/lib/mcc2/images/country_rs.png +0 -0
  45. data/lib/mcc2/images/cut.png +0 -0
  46. data/lib/mcc2/images/distribute-horizontal-baseline.png +0 -0
  47. data/lib/mcc2/images/distribute-vertical-baseline.png +0 -0
  48. data/lib/mcc2/images/document-close.png +0 -0
  49. data/lib/mcc2/images/document-edit.png +0 -0
  50. data/lib/mcc2/images/document-new.png +0 -0
  51. data/lib/mcc2/images/document-open.png +0 -0
  52. data/lib/mcc2/images/document-print-frame.png +0 -0
  53. data/lib/mcc2/images/document-print.png +0 -0
  54. data/lib/mcc2/images/document-save-as.png +0 -0
  55. data/lib/mcc2/images/document-save.png +0 -0
  56. data/lib/mcc2/images/documentation.png +0 -0
  57. data/lib/mcc2/images/draw-rectangle.png +0 -0
  58. data/lib/mcc2/images/dummy.gif +0 -0
  59. data/lib/mcc2/images/exchange-positions.png +0 -0
  60. data/lib/mcc2/images/insert-image.png +0 -0
  61. data/lib/mcc2/images/insert-text.png +0 -0
  62. data/lib/mcc2/images/libreoffice-oasis-master-document.png +0 -0
  63. data/lib/mcc2/images/measure.png +0 -0
  64. data/lib/mcc2/images/messagebox_warning.png +0 -0
  65. data/lib/mcc2/images/paste.png +0 -0
  66. data/lib/mcc2/images/process-stop.png +0 -0
  67. data/lib/mcc2/images/zoom-in.png +0 -0
  68. data/lib/mcc2/layout.rb +323 -0
  69. data/lib/mcc2/layout_file.rb +794 -0
  70. data/lib/mcc2/layout_object/barcode.rb +33 -0
  71. data/lib/mcc2/layout_object/box.rb +18 -0
  72. data/lib/mcc2/layout_object/chip.rb +54 -0
  73. data/lib/mcc2/layout_object/embed.rb +16 -0
  74. data/lib/mcc2/layout_object/go_attribut.rb +16 -0
  75. data/lib/mcc2/layout_object/graphic.rb +59 -0
  76. data/lib/mcc2/layout_object/magstripe.rb +13 -0
  77. data/lib/mcc2/layout_object/picture.rb +22 -0
  78. data/lib/mcc2/layout_object/text.rb +29 -0
  79. data/lib/mcc2/layout_win.rb +2052 -0
  80. data/lib/mcc2/layoutview.rb +845 -0
  81. data/lib/mcc2/layoutview_dlg.rb +2058 -0
  82. data/lib/mcc2/locales.rb +27 -0
  83. data/lib/mcc2/mcc2_mainwin.rb +453 -0
  84. data/lib/mcc2/mcc2gui.rb +295 -0
  85. data/lib/mcc2/mcc2print.rb +54 -0
  86. data/lib/mcc2/picture_data_edit_dlg.rb +139 -0
  87. data/lib/mcc2/print_dlg.rb +520 -0
  88. data/lib/mcc2/printer/base.rb +148 -0
  89. data/lib/mcc2/printer/card_printer.rb +45 -0
  90. data/lib/mcc2/printer/file_printer.rb +135 -0
  91. data/lib/mcc2/printer/gdi_card_printer.rb +14 -0
  92. data/lib/mcc2/printer/gdi_printer.rb +197 -0
  93. data/lib/mcc2/printer/linux_cups_printer.rb +92 -0
  94. data/lib/mcc2/printer/preview.rb +277 -0
  95. data/lib/mcc2/printer/printer_cab.rb +118 -0
  96. data/lib/mcc2/printer/printer_cx320_direct.rb +286 -0
  97. data/lib/mcc2/printer/printer_epl.rb +118 -0
  98. data/lib/mcc2/printer/printer_ttp34x.rb +124 -0
  99. data/lib/mcc2/printer/printer_zebra.rb +324 -0
  100. data/lib/mcc2/printer/svg_drawer.rb +689 -0
  101. data/lib/mcc2/printerview.rb +604 -0
  102. data/lib/mcc2/printerview_dlg.rb +1248 -0
  103. data/lib/mcc2/version.rb +3 -0
  104. data/lib/mcc2.rb +11 -0
  105. data/locales/de.yml +6 -0
  106. data/locales/en.yml +502 -0
  107. data/locales/rs.yml +502 -0
  108. data/mcc2.gemspec +41 -0
  109. data/test/dummy.rb +19 -0
  110. data/test/layouts/bart_simpson.png +0 -0
  111. data/test/layouts/color_test.xml +151 -0
  112. data/test/layouts/ms.xml +67 -0
  113. data/test/ruby_print.rb +380 -0
  114. data/test/test.csv +4 -0
  115. data/test/test.dbf +0 -0
  116. data/test/test.str +4 -0
  117. data/test/test_mcc2.rb +8 -0
  118. data.tar.gz.sig +6 -0
  119. metadata +421 -0
  120. metadata.gz.sig +0 -0
@@ -0,0 +1,139 @@
1
+ # source generated by foxGUIb 0.7.1
2
+
3
+ class PictureDataEditDialogBox
4
+ def initialize(parent)
5
+ construct_widget_tree(parent)
6
+ init if respond_to? :init
7
+ end
8
+
9
+ def construct_widget_tree(parent)
10
+ @topwin =
11
+ FX::DialogBox.new(parent) { |w|
12
+ @pictureDataEditDialogBox = w
13
+ w.wdg_name = "pictureDataEditDialogBox"
14
+ w.width = 365
15
+ w.shown = true
16
+ w.y = 331
17
+ w.height = 119
18
+ w.x = 276
19
+ FX::VerticalFrame.new(@pictureDataEditDialogBox) { |w|
20
+ @verticalframe1 = w
21
+ w.wdg_name = "verticalframe1"
22
+ w.width = 365
23
+ w.height = 119
24
+ FX::Packer.new(@verticalframe1) { |w|
25
+ @packer2 = w
26
+ w.wdg_name = "packer2"
27
+ w.width = 365
28
+ w.height = 20
29
+ w.layoutHints = 1536
30
+ }
31
+ FX::HorizontalFrame.new(@verticalframe1) { |w|
32
+ @horizontalframe1 = w
33
+ w.wdg_name = "horizontalframe1"
34
+ w.width = 365
35
+ w.y = 20
36
+ w.height = 21
37
+ w.layoutHints = 1024
38
+ FX::Packer.new(@horizontalframe1) { |w|
39
+ @packer3 = w
40
+ w.wdg_name = "packer3"
41
+ w.width = 20
42
+ w.height = 21
43
+ w.layoutHints = 2304
44
+ }
45
+ FX::TextField.new(@horizontalframe1) { |w|
46
+ @textfield_data = w
47
+ w.wdg_name = "textfield_data"
48
+ w.width = 325
49
+ w.height = 19
50
+ w.numColumns = 10
51
+ w.layoutHints = 1024
52
+ w.x = 20
53
+ }
54
+ FX::Button.new(@horizontalframe1) { |w|
55
+ @button_file = w
56
+ w.wdg_name = "button_file"
57
+ w.text = "..."
58
+ w.width = 20
59
+ w.height = 21
60
+ w.x = 345
61
+ }
62
+ }
63
+ FX::Packer.new(@verticalframe1) { |w|
64
+ @packer4 = w
65
+ w.wdg_name = "packer4"
66
+ w.width = 365
67
+ w.y = 41
68
+ w.height = 20
69
+ w.layoutHints = 1536
70
+ }
71
+ FX::HorizontalFrame.new(@verticalframe1) { |w|
72
+ @horizontalframe2 = w
73
+ w.wdg_name = "horizontalframe2"
74
+ w.width = 365
75
+ w.y = 61
76
+ w.height = 58
77
+ FX::Packer.new(@horizontalframe2) { |w|
78
+ @packer5 = w
79
+ w.wdg_name = "packer5"
80
+ w.width = 20
81
+ w.height = 58
82
+ w.layoutHints = 2304
83
+ }
84
+ FX::Button.new(@horizontalframe2) { |w|
85
+ @button_exit = w
86
+ w.wdg_name = "button_exit"
87
+ w.text = "Beenden"
88
+ w.width = 100
89
+ w.height = 21
90
+ w.layoutHints = 256
91
+ w.x = 20
92
+ }
93
+ FX::Button.new(@horizontalframe2) { |w|
94
+ @button_cancel = w
95
+ w.wdg_name = "button_cancel"
96
+ w.text = "Abbrechen"
97
+ w.width = 100
98
+ w.height = 21
99
+ w.layoutHints = 256
100
+ w.x = 120
101
+ }
102
+ FX::Button.new(@horizontalframe2) { |w|
103
+ @button_apply = w
104
+ w.wdg_name = "button_apply"
105
+ w.text = "\303\234bernehmen"
106
+ w.width = 100
107
+ w.height = 21
108
+ w.layoutHints = 256
109
+ w.x = 220
110
+ }
111
+ }
112
+ }
113
+ }
114
+ end
115
+ attr_reader :topwin
116
+ attr_reader :pictureDataEditDialogBox
117
+ attr_reader :verticalframe1
118
+ attr_reader :packer2
119
+ attr_reader :horizontalframe1
120
+ attr_reader :packer3
121
+ attr_reader :textfield_data
122
+ attr_reader :button_file
123
+ attr_reader :packer4
124
+ attr_reader :horizontalframe2
125
+ attr_reader :packer5
126
+ attr_reader :button_exit
127
+ attr_reader :button_cancel
128
+ attr_reader :button_apply
129
+ end
130
+
131
+ # unit test
132
+ if __FILE__ == $0
133
+ require "libGUIb16"
134
+ app = FX::App.new
135
+ w = PictureDataEditDialogBox.new app
136
+ w.topwin.show(Fox::PLACEMENT_SCREEN)
137
+ app.create
138
+ app.run
139
+ end
@@ -0,0 +1,52 @@
1
+ module Mcc2
2
+ # FehlerAuswahlDialog mit variablen Buttons zur Eingabe der Batchnummer
3
+ class FXFehlerAuswahlDialog < Fox::FXDialogBox
4
+ include Fox
5
+ attr_accessor :selection
6
+
7
+ def initialize(owner, message, buttonlist)
8
+ # Invoke base class initialize function first
9
+ super(owner, I18n.t(:question_dialog_caption, default: "Modusauswahl (bitte unterstrichenen Buchstabe drücken)"), DECOR_TITLE | DECOR_BORDER)
10
+
11
+ # Bottom buttons
12
+ FXVerticalFrame.new(self,
13
+ LAYOUT_SIDE_BOTTOM | FRAME_NONE | LAYOUT_FILL_X | PACK_UNIFORM_WIDTH,
14
+ 0, 0, 0, 0, 40, 40, 20, 20) do |vf|
15
+ @l = FXLabel.new(vf, message)
16
+
17
+ buttonsfr = FXHorizontalFrame.new(vf,
18
+ FRAME_NONE | LAYOUT_FILL_X | PACK_UNIFORM_WIDTH,
19
+ 0, 0, 0, 0, 40, 40, 20, 40)
20
+
21
+ buttonlist.each_with_index { |button, button_idx|
22
+ FXButton.new(buttonsfr, button, nil, self, ID_CANCEL,
23
+ FRAME_RAISED | FRAME_THICK | LAYOUT_CENTER_Y) { |this|
24
+ this.connect(SEL_COMMAND) { |sender, sel, event|
25
+ handle(self, MKUINT(FXDialogBox::ID_ACCEPT, SEL_COMMAND), nil)
26
+ @selection = button_idx
27
+ }
28
+ if button_idx == 0
29
+ this.setFocus
30
+ this.connect(SEL_KEYPRESS) { |sender, sel, event|
31
+ if event.code == KEY_Escape
32
+ handle(self, MKUINT(FXDialogBox::ID_ACCEPT, SEL_COMMAND), nil)
33
+ @selection = 0
34
+ else
35
+ buttonlist.each_with_index { |button, button_idx|
36
+ if button =~ /&(\w)/
37
+ keycode = eval("KEY_#{$1.downcase}")
38
+ if keycode == event.code
39
+ handle(self, MKUINT(FXDialogBox::ID_ACCEPT, SEL_COMMAND), nil)
40
+ @selection = button_idx
41
+ end
42
+ end
43
+ }
44
+ end
45
+ }
46
+ end
47
+ }
48
+ }
49
+ end
50
+ end
51
+ end # Ende Klasse 'FXFehlerAuswahlDialog'
52
+ end
@@ -0,0 +1,154 @@
1
+ # *****************************************************************************
2
+
3
+ module Mcc2
4
+ # Konstanten-Definition
5
+ TAB = 9.chr
6
+
7
+ FRONT = 0
8
+ BACK = 1
9
+
10
+ # das sind die Bezeichner von Attributen, die ein grafisches Objekt haben kann
11
+ GOA_NAME = "object_name"
12
+ GOA_TYP = "object_typ"
13
+ GOA_PAGE_NR = "page_nr"
14
+ GOA_LAYER = "layer"
15
+ GOA_FONT_HEIGHT = "font_height"
16
+ GOA_FONT_TYP = "font_typ"
17
+ GOA_FONT_WEIGHT = "font_weight"
18
+ GOA_FONT_STYLE = "font_style"
19
+ GOA_FONT_STRETCH = "font_stretch"
20
+ GOA_FONT_COLOR = "font_color"
21
+ GOA_FONT_FILE = "font_file"
22
+ GOA_BACK_COLOR = "back_color"
23
+ GOA_JUSTIFICATION = "justification"
24
+ GOA_JUSTIFICATION_BLOCK = "justification_block"
25
+ GOA_X = "x"
26
+ GOA_Y = "y"
27
+ GOA_WIDTH = "width"
28
+ GOA_HEIGHT = "height"
29
+ GOA_ROTATION = "rotation"
30
+ GOA_ID = "id"
31
+ GOA_BARCODE_TYP = "barcode_typ"
32
+ GOA_BARCODE_HEIGHT = "barcode_height"
33
+ GOA_BARCODE_OPTIMIZED = "barcode_optimized"
34
+ GOA_BARCODE_OPTION_1 = "barcode_option_1"
35
+ GOA_BARCODE_OPTION_2 = "barcode_option_2"
36
+ GOA_BARCODE_OPTION_3 = "barcode_option_3"
37
+ GOA_DATA = "data"
38
+ GOA_SAMPLE_DATA = "sample_data"
39
+ GOA_PRINTLIST = "view_in_printlist"
40
+ GOA_IMAGE_PAGE = "image_page"
41
+
42
+ GOA_FILL_COLOR = "fill_color"
43
+ GOA_BORDER_COLOR = "border_color"
44
+ GOA_BORDER_WIDTH = "border_width"
45
+ GOA_CORNER_RADIUS = "corner_radius"
46
+
47
+ # das sind die Objektbezeichner
48
+ GRAPHICOBJECTS = "GraphicObjects"
49
+ GRAPHICOBJECT = "GraphicObject"
50
+ TEXTOBJECT = "TextObject"
51
+ BARCODEOBJECT = "BarcodeObject"
52
+ PICTUREOBJECT = "PictureObject"
53
+ BOXOBJECT = "BoxObject"
54
+ EMBEDOBJECT = "EmbedObject"
55
+
56
+ S_LAYOUT = "Layout"
57
+ S_DUPLEX = "Duplex"
58
+ S_CONTACTLESS = "Contactless"
59
+ S_CONTACT = "Contact"
60
+ S_MAGSTRIPE = "Magstripe"
61
+
62
+ S_CHIP = "Chip_Params"
63
+ S_MAGSTRIPEPARAMS = "Magstripe_Params"
64
+ S_HEIGHT = "Height"
65
+ S_WIDTH = "Width"
66
+ S_PARAM = "Param"
67
+ S_ROOT = "Root"
68
+ S_X_OFFSET = "x_offset"
69
+ S_Y_OFFSET = "y_offset"
70
+ S_JUST_LEFT = "left"
71
+ S_JUST_MID = "mid"
72
+ S_JUST_RIGHT = "right"
73
+ S_BARCODE_DPI = "barcode_dpi"
74
+
75
+ S_DATASOURCE = "datasource"
76
+ S_DATASOURCETYP = "datasource_typ"
77
+ S_DATASOURCEENCODING = "datasource_encoding"
78
+
79
+ S_CHIPPARAMS = "chipparams"
80
+ S_PRINTERTYPE = "printertype"
81
+
82
+ S_FILEPRINTER_SAVE_AS = "fileprinter_save_as"
83
+ S_FILEPRINTER_DPI = "fileprinter_dpi"
84
+
85
+ S_LINUX_CUPS_PRINTER = "linux_cups_printer"
86
+ S_LINUX_CUPS_DPI = "linux_cups_dpi"
87
+ S_LINUX_CUPS_OPTIONS = "linux_cups_options"
88
+
89
+ S_GDIPRINTER_NAME = "gdiprinter_name"
90
+ S_GDIPRINTER_INITDATA = "gdiprinter_initdata"
91
+ S_ZEBRAPRINTER_NAME = "zebraprinter_name"
92
+ S_ZEBRAPRINTER_INITDATA = "zebraprinter_initdata"
93
+ S_CABPRINTER_HOST = "cabprinter_host"
94
+ S_CABPRINTER_PORT = "cabprinter_port"
95
+ S_CABPRINTER_DPI = "cabprinter_dpi"
96
+ S_CABPRINTER_PAGE_COMMANDS = "cabprinter_page_commands"
97
+ S_EPLPRINTER_DEVICE = "eplprinter_device"
98
+ S_EPLPRINTER_DPI = "eplprinter_dpi"
99
+ S_EPLPRINTER_PAGE_COMMANDS = "eplprinter_page_commands"
100
+
101
+ # TSC TTP 343M Pro
102
+ S_TTP34XPRINTER_DEVICE = "ttp34xprinter_device"
103
+ S_TTP34XPRINTER_DPI = "ttp34xprinter_dpi"
104
+ S_TTP34XPRINTER_PAGE_COMMANDS = "ttp34xprinter_page_commands"
105
+
106
+ S_CX320_DRIVER = "cx320_driver"
107
+ S_CX320_PRINTER_NR = "cx320_printer_nr"
108
+ S_CX320_PARALLEL_PRINT = "cx320_parallel_print"
109
+ S_CX320_CONFIG = "cx320_config"
110
+
111
+ S_FRONT_FLIP = "front_flip"
112
+ S_FRONT_FLOP = "front_flop"
113
+ S_BACK_FLIP = "back_flip"
114
+ S_BACK_FLOP = "back_flop"
115
+
116
+ UP = 0
117
+ DOWN = 1
118
+
119
+ NONE = "none"
120
+ CSV = "csv"
121
+ DBF = "dbf"
122
+ DATABASE = "database"
123
+
124
+ NO = "no"
125
+ YES = "yes"
126
+
127
+ S_FALSE = "false"
128
+ S_TRUE = "true"
129
+
130
+ ENC_UTF8 = "UTF-8"
131
+ ENC_IBM850 = "IBM850"
132
+ ENC_LATIN1 = "LATIN1"
133
+
134
+ VALID_ENCODINGS = [ENC_UTF8, ENC_IBM850, ENC_LATIN1]
135
+ VALID_DATASOURCES = [DATABASE, CSV, DBF, NONE]
136
+
137
+ DELETE = 0
138
+ COPY = 1
139
+ ADD = 2
140
+
141
+ S_MSSPUR1 = "ms_spur1"
142
+ S_MSSPUR2 = "ms_spur2"
143
+ S_MSSPUR3 = "ms_spur3"
144
+
145
+ PRINT_FROM = 0
146
+ PRINT_TO = 1
147
+
148
+ LAYOUT_DEFAULT_WIDTH = 85.6
149
+ LAYOUT_DEFAULT_HEIGHT = 53.98
150
+ LAYOUT_DEFAULT_X_OFFSET = 0.0
151
+ LAYOUT_DEFAULT_Y_OFFSET = 0.0
152
+
153
+ CHIPPARAM_FIELD_COUNT = 23
154
+ end
@@ -0,0 +1,61 @@
1
+ require "mcc2/constants"
2
+
3
+ module Mcc2
4
+ module DataMan
5
+ # ermittelt, ob der übergebene String eine erlaubtes Encoding ist
6
+ # === Return
7
+ # true oder false
8
+ # === Paramter
9
+ # +encoding+:: das Encoding [String]
10
+ def self.valid_datasource_encoding?(encoding)
11
+ VALID_ENCODINGS.include?(encoding.upcase)
12
+ end
13
+
14
+ # ermittelt, ob der übergebene String eine erlaubte Datenquelle ist
15
+ # === Return
16
+ # true oder false
17
+ # === Paramter
18
+ # +datasource+:: der Datenquellentyp [String]
19
+ def self.valid_datasourcetyp?(datasource)
20
+ VALID_DATASOURCES.include?(datasource)
21
+ end
22
+
23
+ # ersetzt die Felder in data, welche dem Muster {feldname[pos,anz]} entsprechen, durch ihren Inhalt
24
+ # === Paramter
25
+ # +data+:: die im Layut definierten Daten für dieses Objekt
26
+ # +row+:: ein Datensatz im FasteCSV-Format
27
+ def self.replace_variables(data, row)
28
+ return data unless row # die unveränderten Daten zurückgeben, wenn kein Datensatz übergeben wurde
29
+ pattern = /\{ *([-\._\w]*)\[ *(\d{1,5}) *, *(\d{1,5}) *\] *\}/
30
+ data.gsub(pattern) {
31
+ feld = $1
32
+ von = $2.to_i
33
+ anz = $3.to_i
34
+ vardata = row[feld].to_s[von, anz].strip
35
+ if row.to_hash.has_key?(feld)
36
+ vardata
37
+ else
38
+ $& # die unveränderten Daten zurückgeben, wenn kein passendes Feld im Datensatz gefunden wurde
39
+ end
40
+ }
41
+ end
42
+
43
+ def self.meta_headers
44
+ ["row_number"]
45
+ end
46
+
47
+ class Base
48
+ class BadEncodingError < RuntimeError
49
+ end
50
+ attr_reader :filename
51
+
52
+ def headers
53
+ data_headers + meta_headers
54
+ end
55
+
56
+ def meta_headers
57
+ DataMan.meta_headers
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,49 @@
1
+ require "mcc2/dataman/base"
2
+ require "csv"
3
+
4
+ module Mcc2
5
+ module DataMan
6
+ class CSV < Base
7
+ class CanNotOpenFile < RuntimeError
8
+ end
9
+
10
+ class DataNotAvailable < RuntimeError
11
+ end
12
+
13
+ def initialize(fn, encoding)
14
+ @table = nil
15
+
16
+ return if fn.empty?
17
+
18
+ fail CanNotOpenFile, "CSV file not found: #{fn.inspect}" unless File.exist?(fn)
19
+ @table = ::CSV.read(fn, col_sep: ";", encoding: "#{encoding}:UTF-8")
20
+ fail DataNotAvailable, "CSV file #{fn} contains no records" unless @table
21
+
22
+ @header_row = @table.slice!(0) if @table && @table.size > 0
23
+
24
+ # convert Array of Arrays to Array of Hashs
25
+ @table = @table.map.with_index(1) do |row, row_number|
26
+ h = {"row_number" => row_number.to_s}
27
+ row.each_with_index do |text, idx|
28
+ h[@header_row[idx]] = text
29
+ end
30
+ h
31
+ end
32
+ @filename = fn
33
+ end
34
+
35
+ def data_headers
36
+ @header_row
37
+ end
38
+
39
+ def row(index)
40
+ return unless @table
41
+ @table[index]
42
+ end
43
+
44
+ def rows
45
+ @table
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,8 @@
1
+ require "mcc2/dataman/base"
2
+
3
+ module Mcc2
4
+ module DataMan
5
+ class Database < Base
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,45 @@
1
+ require "mcc2/dataman/base"
2
+ require "dbf"
3
+
4
+ module Mcc2
5
+ module DataMan
6
+ class DBF < Base
7
+ class CanNotOpenFile < RuntimeError
8
+ end
9
+
10
+ def initialize(fn, encoding)
11
+ @table = nil
12
+
13
+ return if fn.empty?
14
+
15
+ raise CanNotOpenFile, "DBF file not found: #{fn.inspect}" unless File.exist?(fn)
16
+ table = ::DBF::Table.new(fn)
17
+ @header_row = table.columns.map { |c| c.name }
18
+
19
+ # convert DBF::Table to Array of Hashs
20
+ @table = []
21
+ table.each.with_index(1) do |row, row_number|
22
+ h = {"row_number" => row_number.to_s}
23
+ row.to_a.each_with_index do |text, idx|
24
+ h[@header_row[idx]] = text.to_s.encode("utf-8", encoding)
25
+ end
26
+ @table << h
27
+ end
28
+ @filename = fn
29
+ end
30
+
31
+ def data_headers
32
+ @header_row
33
+ end
34
+
35
+ def row(index)
36
+ return unless @table
37
+ @table[index]
38
+ end
39
+
40
+ def rows
41
+ @table
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,25 @@
1
+ require "mcc2/dataman/base"
2
+
3
+ module Mcc2
4
+ module DataMan
5
+ class None < Base
6
+ def initialize(datasource)
7
+ @num_rows = datasource.to_i
8
+ @num_rows = 100 if @num_rows == 0
9
+ @rows = @num_rows.times.map do |row_number|
10
+ {"row_number" => (row_number + 1).to_s}
11
+ end
12
+ end
13
+
14
+ def data_headers
15
+ []
16
+ end
17
+
18
+ def row(index)
19
+ @rows[index]
20
+ end
21
+
22
+ attr_reader :rows
23
+ end
24
+ end
25
+ end