tangsalesparser 0.0.3
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/bin/Alert.rb +16 -0
- data/bin/App.rb +78 -0
- data/bin/ConfigEditor.rb +34 -0
- data/bin/InputDialog.rb +23 -0
- data/bin/OutputDialog.rb +23 -0
- data/bin/TangConfig.rb +33 -0
- data/bin/TangSalesParser.rb +83 -0
- data/bin/glade/Alert.glade +72 -0
- data/bin/glade/App.glade +205 -0
- data/bin/glade/ConfigEditor.glade +92 -0
- data/bin/glade/InputDialog.glade +86 -0
- data/bin/glade/OutputDialog.glade +89 -0
- data/bin/glade/Save_Dialog.glade +66 -0
- data/tsp +14 -0
- metadata +118 -0
data/bin/Alert.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
class Alert
|
2
|
+
|
3
|
+
include GladeGUI
|
4
|
+
|
5
|
+
def initialize(parent, message)
|
6
|
+
@parent = parent
|
7
|
+
load_glade(__FILE__)
|
8
|
+
@builder['label_message'].set_label(message)
|
9
|
+
show_window()
|
10
|
+
end
|
11
|
+
|
12
|
+
def button_close__clicked(*args)
|
13
|
+
destroy_window()
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/bin/App.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
class App
|
2
|
+
|
3
|
+
include GladeGUI
|
4
|
+
|
5
|
+
attr_accessor :input_file_path, :output_file_path
|
6
|
+
|
7
|
+
def show()
|
8
|
+
load_glade(__FILE__)
|
9
|
+
set_glade_all()
|
10
|
+
show_window()
|
11
|
+
end
|
12
|
+
|
13
|
+
def button_start__clicked(*args)
|
14
|
+
# Check if input file exists
|
15
|
+
if file_exists?(@builder['entry_input_path'].text) then
|
16
|
+
# Check to see if config file exists, if not create a blank one
|
17
|
+
if !file_exists?('./config.txt') then
|
18
|
+
create_config_file
|
19
|
+
end
|
20
|
+
# Process the file using TangSalesParser and write output
|
21
|
+
input_file_path = @builder['entry_input_path'].text
|
22
|
+
output_file_path = @builder['entry_output_path'].text
|
23
|
+
tc = TangSalesParser.new
|
24
|
+
tc.process(input_file_path, output_file_path)
|
25
|
+
alert("Success. Your file is at: #{output_file_path}")
|
26
|
+
else
|
27
|
+
alert("ERROR: The data file you specified does not exist.")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_config_file
|
32
|
+
file = File.open('./config.txt', 'w')
|
33
|
+
file.write("")
|
34
|
+
file.close
|
35
|
+
end
|
36
|
+
|
37
|
+
def alert(msg)
|
38
|
+
modal_win = Alert.new(self, msg)
|
39
|
+
end
|
40
|
+
|
41
|
+
def file_exists?(file_path)
|
42
|
+
File.exist?(file_path)
|
43
|
+
end
|
44
|
+
|
45
|
+
def button_edit_config__clicked(*args)
|
46
|
+
modal_win = ConfigEditor.new(self)
|
47
|
+
end
|
48
|
+
|
49
|
+
def button_input_location__clicked(*args)
|
50
|
+
modal_win = InputDialog.new(self)
|
51
|
+
modal_win.show(self)
|
52
|
+
@builder['entry_input_path'].text = @input_file_path
|
53
|
+
allow_start?
|
54
|
+
end
|
55
|
+
|
56
|
+
def button_output_location__clicked(*args)
|
57
|
+
modal_win = OutputDialog.new(self)
|
58
|
+
modal_win.show(self)
|
59
|
+
@builder['entry_output_path'].text = @output_file_path
|
60
|
+
allow_start?
|
61
|
+
end
|
62
|
+
|
63
|
+
def entry_output_path__changed(*args)
|
64
|
+
allow_start?
|
65
|
+
end
|
66
|
+
|
67
|
+
def entry_input_path__changed(*args)
|
68
|
+
allow_start?
|
69
|
+
end
|
70
|
+
|
71
|
+
def allow_start?
|
72
|
+
if @builder['entry_input_path'].text != "" && @builder['entry_output_path'].text != "" then
|
73
|
+
@builder['button_start'].sensitive = true
|
74
|
+
else
|
75
|
+
@builder['button_start'].sensitive = false
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/bin/ConfigEditor.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
class ConfigEditor
|
2
|
+
|
3
|
+
include GladeGUI
|
4
|
+
|
5
|
+
def initialize(parent)
|
6
|
+
@config_file = "./config.txt"
|
7
|
+
|
8
|
+
@parent = parent
|
9
|
+
load_glade(__FILE__)
|
10
|
+
load_config_file
|
11
|
+
show_window()
|
12
|
+
end
|
13
|
+
|
14
|
+
def load_config_file
|
15
|
+
text_buffer = @builder['textview_config'].buffer
|
16
|
+
file = File.open(@config_file, 'r')
|
17
|
+
text_buffer.text = file.read
|
18
|
+
file.close
|
19
|
+
end
|
20
|
+
|
21
|
+
def button_save__clicked(*args)
|
22
|
+
data = @builder['textview_config'].buffer.text
|
23
|
+
data.gsub!(/^$\n/,"") #remove blank lines
|
24
|
+
file = File.open('./config.txt','w')
|
25
|
+
file.write(data)
|
26
|
+
file.close
|
27
|
+
destroy_window()
|
28
|
+
end
|
29
|
+
|
30
|
+
def button_cancel__clicked(*args)
|
31
|
+
destroy_window()
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
data/bin/InputDialog.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
class InputDialog
|
2
|
+
|
3
|
+
include GladeGUI
|
4
|
+
|
5
|
+
def initialize(parent)
|
6
|
+
@parent = parent
|
7
|
+
end
|
8
|
+
|
9
|
+
def show(parent)
|
10
|
+
load_glade(__FILE__)
|
11
|
+
show_window()
|
12
|
+
end
|
13
|
+
|
14
|
+
def button_open__clicked(*args)
|
15
|
+
@parent.input_file_path = @builder['filechooserwidget_input'].filename
|
16
|
+
destroy_window()
|
17
|
+
end
|
18
|
+
|
19
|
+
def button_cancel__clicked(*args)
|
20
|
+
destroy_window()
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/bin/OutputDialog.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
class OutputDialog
|
2
|
+
|
3
|
+
include GladeGUI
|
4
|
+
|
5
|
+
def initialize(parent)
|
6
|
+
@parent = parent
|
7
|
+
end
|
8
|
+
|
9
|
+
def show(parent)
|
10
|
+
load_glade(__FILE__)
|
11
|
+
show_window()
|
12
|
+
end
|
13
|
+
|
14
|
+
def button_save__clicked(*args)
|
15
|
+
@parent.output_file_path = @builder['filechooserwidget_output'].filename
|
16
|
+
destroy_window()
|
17
|
+
end
|
18
|
+
|
19
|
+
def button_cancel__clicked(*args)
|
20
|
+
destroy_window()
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/bin/TangConfig.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
class TangConfig
|
2
|
+
|
3
|
+
attr_accessor :string, :num_commas, :location
|
4
|
+
|
5
|
+
def initialize(location = 'after', string = "", num_commas = 0)
|
6
|
+
self.location = location
|
7
|
+
self.string = string
|
8
|
+
self.num_commas = num_commas
|
9
|
+
end
|
10
|
+
|
11
|
+
def num_commas=(val)
|
12
|
+
if val.is_a? String
|
13
|
+
val = val.strip
|
14
|
+
end
|
15
|
+
@num_commas = val.to_i
|
16
|
+
end
|
17
|
+
|
18
|
+
def string=(val)
|
19
|
+
@string = val.strip.gsub("_", " ")
|
20
|
+
end
|
21
|
+
|
22
|
+
def location=(val)
|
23
|
+
@location = val.strip
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
"location = #{@location}, string = #{@string}, num_commas = #{@num_commas}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def ==(other)
|
31
|
+
self.location == other.location && self.string == other.string && self.num_commas == other.num_commas
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
class TangSalesParser
|
2
|
+
|
3
|
+
attr_accessor :data, :configs
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@configs = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def process(input_file_path, output_file_path)
|
10
|
+
self.read_file(input_file_path)
|
11
|
+
self.clear_commas
|
12
|
+
self.compress_spaces
|
13
|
+
self.split_numbers
|
14
|
+
self.fix_percentage_symbol
|
15
|
+
self.read_configs
|
16
|
+
self.run_configs
|
17
|
+
self.collapse_spaces_following_comma #run this at the very end of the process only
|
18
|
+
self.write_file(output_file_path)
|
19
|
+
end
|
20
|
+
|
21
|
+
def read_file(file_path)
|
22
|
+
file = File.open(file_path, 'r')
|
23
|
+
@data = file.read
|
24
|
+
end
|
25
|
+
|
26
|
+
def count(substring)
|
27
|
+
@data.scan(substring).length
|
28
|
+
end
|
29
|
+
|
30
|
+
def clear_commas
|
31
|
+
@data.gsub!(/,/,"")
|
32
|
+
end
|
33
|
+
|
34
|
+
def compress_spaces
|
35
|
+
@data.squeeze!(" ")
|
36
|
+
end
|
37
|
+
|
38
|
+
def collapse_spaces_following_comma
|
39
|
+
@data.gsub!(/, +/, ",")
|
40
|
+
end
|
41
|
+
|
42
|
+
def read_configs
|
43
|
+
file = File.open("./config.txt", 'r')
|
44
|
+
file.each do |line|
|
45
|
+
values = line.split(",")
|
46
|
+
config = TangConfig.new
|
47
|
+
config.location = values[0]
|
48
|
+
config.string = values[1]
|
49
|
+
config.num_commas = values[2]
|
50
|
+
@configs << config
|
51
|
+
end
|
52
|
+
file.close
|
53
|
+
end
|
54
|
+
|
55
|
+
def run_configs
|
56
|
+
@configs.each do |config|
|
57
|
+
replacement = ""
|
58
|
+
if config.location == 'after' then
|
59
|
+
replacement = config.string + "," * config.num_commas
|
60
|
+
elsif config.location == 'before' then
|
61
|
+
replacement = ","*config.num_commas + config.string
|
62
|
+
end
|
63
|
+
|
64
|
+
s = '(?<![A-Za-z])' + config.string + '(?![A-Za-z0-9%])'
|
65
|
+
regex = Regexp.new s
|
66
|
+
@data.gsub!(regex, replacement)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def fix_percentage_symbol
|
71
|
+
@data.gsub!(/ +%/, "%")
|
72
|
+
end
|
73
|
+
|
74
|
+
def split_numbers
|
75
|
+
@data.gsub!(/(?<![\/\:\-\d[A-Za-z]])[-+]?[0-9]*\.?[0-9]+(?![\d\:\/\-]|( or)|( and))/,'\0,')
|
76
|
+
end
|
77
|
+
|
78
|
+
def write_file(file_path)
|
79
|
+
file = File.open(file_path, 'w')
|
80
|
+
file.write(@data)
|
81
|
+
file.close
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<interface>
|
3
|
+
<requires lib="gtk+" version="2.16"/>
|
4
|
+
<!-- interface-naming-policy project-wide -->
|
5
|
+
<object class="GtkWindow" id="window1">
|
6
|
+
<property name="visible">True</property>
|
7
|
+
<property name="can_focus">False</property>
|
8
|
+
<property name="title" translatable="yes">Alert</property>
|
9
|
+
<property name="resizable">False</property>
|
10
|
+
<property name="modal">True</property>
|
11
|
+
<property name="window_position">center</property>
|
12
|
+
<signal name="destroy" handler="destroy_window" swapped="no"/>
|
13
|
+
<child>
|
14
|
+
<object class="GtkHBox" id="hbox1">
|
15
|
+
<property name="visible">True</property>
|
16
|
+
<property name="can_focus">False</property>
|
17
|
+
<child>
|
18
|
+
<object class="GtkVBox" id="vbox1">
|
19
|
+
<property name="visible">True</property>
|
20
|
+
<property name="can_focus">False</property>
|
21
|
+
<child>
|
22
|
+
<object class="GtkLabel" id="label_message">
|
23
|
+
<property name="visible">True</property>
|
24
|
+
<property name="can_focus">False</property>
|
25
|
+
<property name="label" translatable="yes">default message</property>
|
26
|
+
<property name="justify">center</property>
|
27
|
+
<property name="wrap">True</property>
|
28
|
+
</object>
|
29
|
+
<packing>
|
30
|
+
<property name="expand">True</property>
|
31
|
+
<property name="fill">True</property>
|
32
|
+
<property name="padding">20</property>
|
33
|
+
<property name="position">0</property>
|
34
|
+
</packing>
|
35
|
+
</child>
|
36
|
+
<child>
|
37
|
+
<object class="GtkHButtonBox" id="hbuttonbox1">
|
38
|
+
<property name="visible">True</property>
|
39
|
+
<property name="can_focus">False</property>
|
40
|
+
<child>
|
41
|
+
<object class="GtkButton" id="button_close">
|
42
|
+
<property name="label" translatable="yes">Close</property>
|
43
|
+
<property name="visible">True</property>
|
44
|
+
<property name="can_focus">True</property>
|
45
|
+
<property name="receives_default">True</property>
|
46
|
+
</object>
|
47
|
+
<packing>
|
48
|
+
<property name="expand">False</property>
|
49
|
+
<property name="fill">False</property>
|
50
|
+
<property name="position">0</property>
|
51
|
+
</packing>
|
52
|
+
</child>
|
53
|
+
</object>
|
54
|
+
<packing>
|
55
|
+
<property name="expand">False</property>
|
56
|
+
<property name="fill">False</property>
|
57
|
+
<property name="padding">10</property>
|
58
|
+
<property name="position">1</property>
|
59
|
+
</packing>
|
60
|
+
</child>
|
61
|
+
</object>
|
62
|
+
<packing>
|
63
|
+
<property name="expand">True</property>
|
64
|
+
<property name="fill">True</property>
|
65
|
+
<property name="padding">20</property>
|
66
|
+
<property name="position">0</property>
|
67
|
+
</packing>
|
68
|
+
</child>
|
69
|
+
</object>
|
70
|
+
</child>
|
71
|
+
</object>
|
72
|
+
</interface>
|
data/bin/glade/App.glade
ADDED
@@ -0,0 +1,205 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<interface>
|
3
|
+
<requires lib="gtk+" version="2.16"/>
|
4
|
+
<!-- interface-naming-policy project-wide -->
|
5
|
+
<object class="GtkWindow" id="window1">
|
6
|
+
<property name="visible">True</property>
|
7
|
+
<property name="can_focus">False</property>
|
8
|
+
<property name="title" translatable="yes">Tang's Sales Parser</property>
|
9
|
+
<property name="resizable">False</property>
|
10
|
+
<property name="modal">True</property>
|
11
|
+
<property name="window_position">center</property>
|
12
|
+
<property name="default_width">600</property>
|
13
|
+
<signal name="destroy" handler="destroy_window" swapped="no"/>
|
14
|
+
<child>
|
15
|
+
<object class="GtkVBox" id="vbox1">
|
16
|
+
<property name="width_request">500</property>
|
17
|
+
<property name="visible">True</property>
|
18
|
+
<property name="can_focus">False</property>
|
19
|
+
<property name="spacing">1</property>
|
20
|
+
<child>
|
21
|
+
<object class="GtkHBox" id="hbox1">
|
22
|
+
<property name="visible">True</property>
|
23
|
+
<property name="can_focus">False</property>
|
24
|
+
<child>
|
25
|
+
<object class="GtkVBox" id="vbox2">
|
26
|
+
<property name="visible">True</property>
|
27
|
+
<property name="can_focus">False</property>
|
28
|
+
<property name="spacing">20</property>
|
29
|
+
<child>
|
30
|
+
<object class="GtkHBox" id="hbox3">
|
31
|
+
<property name="visible">True</property>
|
32
|
+
<property name="can_focus">False</property>
|
33
|
+
<child>
|
34
|
+
<object class="GtkButton" id="button_input_location">
|
35
|
+
<property name="label" translatable="yes">...</property>
|
36
|
+
<property name="visible">True</property>
|
37
|
+
<property name="can_focus">True</property>
|
38
|
+
<property name="receives_default">True</property>
|
39
|
+
</object>
|
40
|
+
<packing>
|
41
|
+
<property name="expand">False</property>
|
42
|
+
<property name="fill">False</property>
|
43
|
+
<property name="padding">10</property>
|
44
|
+
<property name="pack_type">end</property>
|
45
|
+
<property name="position">0</property>
|
46
|
+
</packing>
|
47
|
+
</child>
|
48
|
+
<child>
|
49
|
+
<object class="GtkEntry" id="entry_input_path">
|
50
|
+
<property name="visible">True</property>
|
51
|
+
<property name="can_focus">True</property>
|
52
|
+
<property name="invisible_char">•</property>
|
53
|
+
<property name="primary_icon_activatable">False</property>
|
54
|
+
<property name="secondary_icon_activatable">False</property>
|
55
|
+
<property name="primary_icon_sensitive">True</property>
|
56
|
+
<property name="secondary_icon_sensitive">True</property>
|
57
|
+
</object>
|
58
|
+
<packing>
|
59
|
+
<property name="expand">True</property>
|
60
|
+
<property name="fill">True</property>
|
61
|
+
<property name="pack_type">end</property>
|
62
|
+
<property name="position">1</property>
|
63
|
+
</packing>
|
64
|
+
</child>
|
65
|
+
<child>
|
66
|
+
<object class="GtkLabel" id="label_data">
|
67
|
+
<property name="width_request">75</property>
|
68
|
+
<property name="visible">True</property>
|
69
|
+
<property name="can_focus">False</property>
|
70
|
+
<property name="label" translatable="yes">Data:</property>
|
71
|
+
</object>
|
72
|
+
<packing>
|
73
|
+
<property name="expand">False</property>
|
74
|
+
<property name="fill">False</property>
|
75
|
+
<property name="padding">10</property>
|
76
|
+
<property name="pack_type">end</property>
|
77
|
+
<property name="position">2</property>
|
78
|
+
</packing>
|
79
|
+
</child>
|
80
|
+
</object>
|
81
|
+
<packing>
|
82
|
+
<property name="expand">False</property>
|
83
|
+
<property name="fill">False</property>
|
84
|
+
<property name="position">0</property>
|
85
|
+
</packing>
|
86
|
+
</child>
|
87
|
+
<child>
|
88
|
+
<object class="GtkHBox" id="hbox2">
|
89
|
+
<property name="visible">True</property>
|
90
|
+
<property name="can_focus">False</property>
|
91
|
+
<child>
|
92
|
+
<object class="GtkButton" id="button_output_location">
|
93
|
+
<property name="label" translatable="yes">...</property>
|
94
|
+
<property name="visible">True</property>
|
95
|
+
<property name="can_focus">True</property>
|
96
|
+
<property name="receives_default">True</property>
|
97
|
+
</object>
|
98
|
+
<packing>
|
99
|
+
<property name="expand">False</property>
|
100
|
+
<property name="fill">False</property>
|
101
|
+
<property name="padding">10</property>
|
102
|
+
<property name="pack_type">end</property>
|
103
|
+
<property name="position">0</property>
|
104
|
+
</packing>
|
105
|
+
</child>
|
106
|
+
<child>
|
107
|
+
<object class="GtkEntry" id="entry_output_path">
|
108
|
+
<property name="visible">True</property>
|
109
|
+
<property name="can_focus">True</property>
|
110
|
+
<property name="invisible_char">•</property>
|
111
|
+
<property name="primary_icon_activatable">False</property>
|
112
|
+
<property name="secondary_icon_activatable">False</property>
|
113
|
+
<property name="primary_icon_sensitive">True</property>
|
114
|
+
<property name="secondary_icon_sensitive">True</property>
|
115
|
+
</object>
|
116
|
+
<packing>
|
117
|
+
<property name="expand">True</property>
|
118
|
+
<property name="fill">True</property>
|
119
|
+
<property name="pack_type">end</property>
|
120
|
+
<property name="position">1</property>
|
121
|
+
</packing>
|
122
|
+
</child>
|
123
|
+
<child>
|
124
|
+
<object class="GtkLabel" id="label_output">
|
125
|
+
<property name="width_request">75</property>
|
126
|
+
<property name="visible">True</property>
|
127
|
+
<property name="can_focus">False</property>
|
128
|
+
<property name="label" translatable="yes">Output:</property>
|
129
|
+
</object>
|
130
|
+
<packing>
|
131
|
+
<property name="expand">False</property>
|
132
|
+
<property name="fill">False</property>
|
133
|
+
<property name="padding">10</property>
|
134
|
+
<property name="pack_type">end</property>
|
135
|
+
<property name="position">2</property>
|
136
|
+
</packing>
|
137
|
+
</child>
|
138
|
+
</object>
|
139
|
+
<packing>
|
140
|
+
<property name="expand">False</property>
|
141
|
+
<property name="fill">False</property>
|
142
|
+
<property name="position">1</property>
|
143
|
+
</packing>
|
144
|
+
</child>
|
145
|
+
<child>
|
146
|
+
<object class="GtkHButtonBox" id="hbuttonbox1">
|
147
|
+
<property name="visible">True</property>
|
148
|
+
<property name="can_focus">False</property>
|
149
|
+
<property name="homogeneous">True</property>
|
150
|
+
<property name="layout_style">spread</property>
|
151
|
+
<child>
|
152
|
+
<object class="GtkButton" id="button_edit_config">
|
153
|
+
<property name="label" translatable="yes">Edit Configuration</property>
|
154
|
+
<property name="visible">True</property>
|
155
|
+
<property name="can_focus">True</property>
|
156
|
+
<property name="receives_default">True</property>
|
157
|
+
</object>
|
158
|
+
<packing>
|
159
|
+
<property name="expand">False</property>
|
160
|
+
<property name="fill">False</property>
|
161
|
+
<property name="position">0</property>
|
162
|
+
</packing>
|
163
|
+
</child>
|
164
|
+
<child>
|
165
|
+
<object class="GtkButton" id="button_start">
|
166
|
+
<property name="label" translatable="yes">Start</property>
|
167
|
+
<property name="visible">True</property>
|
168
|
+
<property name="sensitive">False</property>
|
169
|
+
<property name="can_focus">True</property>
|
170
|
+
<property name="receives_default">True</property>
|
171
|
+
</object>
|
172
|
+
<packing>
|
173
|
+
<property name="expand">False</property>
|
174
|
+
<property name="fill">False</property>
|
175
|
+
<property name="position">1</property>
|
176
|
+
</packing>
|
177
|
+
</child>
|
178
|
+
</object>
|
179
|
+
<packing>
|
180
|
+
<property name="expand">True</property>
|
181
|
+
<property name="fill">False</property>
|
182
|
+
<property name="padding">10</property>
|
183
|
+
<property name="position">2</property>
|
184
|
+
</packing>
|
185
|
+
</child>
|
186
|
+
</object>
|
187
|
+
<packing>
|
188
|
+
<property name="expand">True</property>
|
189
|
+
<property name="fill">True</property>
|
190
|
+
<property name="padding">20</property>
|
191
|
+
<property name="position">0</property>
|
192
|
+
</packing>
|
193
|
+
</child>
|
194
|
+
</object>
|
195
|
+
<packing>
|
196
|
+
<property name="expand">True</property>
|
197
|
+
<property name="fill">True</property>
|
198
|
+
<property name="padding">10</property>
|
199
|
+
<property name="position">0</property>
|
200
|
+
</packing>
|
201
|
+
</child>
|
202
|
+
</object>
|
203
|
+
</child>
|
204
|
+
</object>
|
205
|
+
</interface>
|
@@ -0,0 +1,92 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<interface>
|
3
|
+
<requires lib="gtk+" version="2.16"/>
|
4
|
+
<!-- interface-naming-policy project-wide -->
|
5
|
+
<object class="GtkWindow" id="window1">
|
6
|
+
<property name="visible">True</property>
|
7
|
+
<property name="can_focus">False</property>
|
8
|
+
<property name="title" translatable="yes">Config Editor</property>
|
9
|
+
<property name="modal">True</property>
|
10
|
+
<property name="window_position">center</property>
|
11
|
+
<property name="default_width">700</property>
|
12
|
+
<property name="default_height">400</property>
|
13
|
+
<signal name="destroy" handler="destroy_window" swapped="no"/>
|
14
|
+
<child>
|
15
|
+
<object class="GtkHBox" id="hbox1">
|
16
|
+
<property name="visible">True</property>
|
17
|
+
<property name="can_focus">False</property>
|
18
|
+
<child>
|
19
|
+
<object class="GtkVBox" id="vbox1">
|
20
|
+
<property name="visible">True</property>
|
21
|
+
<property name="can_focus">False</property>
|
22
|
+
<child>
|
23
|
+
<object class="GtkScrolledWindow" id="scrolledwindow1">
|
24
|
+
<property name="visible">True</property>
|
25
|
+
<property name="can_focus">True</property>
|
26
|
+
<property name="hscrollbar_policy">automatic</property>
|
27
|
+
<property name="vscrollbar_policy">automatic</property>
|
28
|
+
<child>
|
29
|
+
<object class="GtkTextView" id="textview_config">
|
30
|
+
<property name="visible">True</property>
|
31
|
+
<property name="can_focus">True</property>
|
32
|
+
</object>
|
33
|
+
</child>
|
34
|
+
</object>
|
35
|
+
<packing>
|
36
|
+
<property name="expand">True</property>
|
37
|
+
<property name="fill">True</property>
|
38
|
+
<property name="padding">10</property>
|
39
|
+
<property name="position">0</property>
|
40
|
+
</packing>
|
41
|
+
</child>
|
42
|
+
<child>
|
43
|
+
<object class="GtkHButtonBox" id="hbuttonbox1">
|
44
|
+
<property name="visible">True</property>
|
45
|
+
<property name="can_focus">False</property>
|
46
|
+
<property name="layout_style">spread</property>
|
47
|
+
<child>
|
48
|
+
<object class="GtkButton" id="button_save">
|
49
|
+
<property name="label" translatable="yes">Save</property>
|
50
|
+
<property name="visible">True</property>
|
51
|
+
<property name="can_focus">True</property>
|
52
|
+
<property name="receives_default">True</property>
|
53
|
+
</object>
|
54
|
+
<packing>
|
55
|
+
<property name="expand">False</property>
|
56
|
+
<property name="fill">False</property>
|
57
|
+
<property name="position">0</property>
|
58
|
+
</packing>
|
59
|
+
</child>
|
60
|
+
<child>
|
61
|
+
<object class="GtkButton" id="button_cancel">
|
62
|
+
<property name="label" translatable="yes">Cancel</property>
|
63
|
+
<property name="visible">True</property>
|
64
|
+
<property name="can_focus">True</property>
|
65
|
+
<property name="receives_default">True</property>
|
66
|
+
</object>
|
67
|
+
<packing>
|
68
|
+
<property name="expand">False</property>
|
69
|
+
<property name="fill">False</property>
|
70
|
+
<property name="position">1</property>
|
71
|
+
</packing>
|
72
|
+
</child>
|
73
|
+
</object>
|
74
|
+
<packing>
|
75
|
+
<property name="expand">False</property>
|
76
|
+
<property name="fill">False</property>
|
77
|
+
<property name="padding">10</property>
|
78
|
+
<property name="position">1</property>
|
79
|
+
</packing>
|
80
|
+
</child>
|
81
|
+
</object>
|
82
|
+
<packing>
|
83
|
+
<property name="expand">True</property>
|
84
|
+
<property name="fill">True</property>
|
85
|
+
<property name="padding">8</property>
|
86
|
+
<property name="position">0</property>
|
87
|
+
</packing>
|
88
|
+
</child>
|
89
|
+
</object>
|
90
|
+
</child>
|
91
|
+
</object>
|
92
|
+
</interface>
|
@@ -0,0 +1,86 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<interface>
|
3
|
+
<requires lib="gtk+" version="2.16"/>
|
4
|
+
<!-- interface-naming-policy project-wide -->
|
5
|
+
<object class="GtkWindow" id="window1">
|
6
|
+
<property name="visible">True</property>
|
7
|
+
<property name="can_focus">False</property>
|
8
|
+
<property name="title" translatable="yes">Select Data File</property>
|
9
|
+
<property name="modal">True</property>
|
10
|
+
<property name="window_position">center</property>
|
11
|
+
<property name="default_width">700</property>
|
12
|
+
<signal name="destroy" handler="destroy_window" swapped="no"/>
|
13
|
+
<child>
|
14
|
+
<object class="GtkHBox" id="hbox1">
|
15
|
+
<property name="height_request">500</property>
|
16
|
+
<property name="visible">True</property>
|
17
|
+
<property name="can_focus">False</property>
|
18
|
+
<property name="spacing">10</property>
|
19
|
+
<child>
|
20
|
+
<object class="GtkVBox" id="vbox1">
|
21
|
+
<property name="visible">True</property>
|
22
|
+
<property name="can_focus">False</property>
|
23
|
+
<child>
|
24
|
+
<object class="GtkFileChooserWidget" id="filechooserwidget_input">
|
25
|
+
<property name="visible">True</property>
|
26
|
+
<property name="can_focus">False</property>
|
27
|
+
<property name="orientation">vertical</property>
|
28
|
+
</object>
|
29
|
+
<packing>
|
30
|
+
<property name="expand">True</property>
|
31
|
+
<property name="fill">True</property>
|
32
|
+
<property name="position">0</property>
|
33
|
+
</packing>
|
34
|
+
</child>
|
35
|
+
<child>
|
36
|
+
<object class="GtkHButtonBox" id="hbuttonbox1">
|
37
|
+
<property name="visible">True</property>
|
38
|
+
<property name="can_focus">False</property>
|
39
|
+
<property name="layout_style">spread</property>
|
40
|
+
<child>
|
41
|
+
<object class="GtkButton" id="button_open">
|
42
|
+
<property name="label" translatable="yes">Open</property>
|
43
|
+
<property name="visible">True</property>
|
44
|
+
<property name="can_focus">True</property>
|
45
|
+
<property name="receives_default">True</property>
|
46
|
+
</object>
|
47
|
+
<packing>
|
48
|
+
<property name="expand">False</property>
|
49
|
+
<property name="fill">False</property>
|
50
|
+
<property name="position">0</property>
|
51
|
+
</packing>
|
52
|
+
</child>
|
53
|
+
<child>
|
54
|
+
<object class="GtkButton" id="button_cancel">
|
55
|
+
<property name="label" translatable="yes">Cancel</property>
|
56
|
+
<property name="visible">True</property>
|
57
|
+
<property name="can_focus">True</property>
|
58
|
+
<property name="receives_default">True</property>
|
59
|
+
</object>
|
60
|
+
<packing>
|
61
|
+
<property name="expand">False</property>
|
62
|
+
<property name="fill">False</property>
|
63
|
+
<property name="position">1</property>
|
64
|
+
</packing>
|
65
|
+
</child>
|
66
|
+
</object>
|
67
|
+
<packing>
|
68
|
+
<property name="expand">False</property>
|
69
|
+
<property name="fill">False</property>
|
70
|
+
<property name="padding">10</property>
|
71
|
+
<property name="pack_type">end</property>
|
72
|
+
<property name="position">1</property>
|
73
|
+
</packing>
|
74
|
+
</child>
|
75
|
+
</object>
|
76
|
+
<packing>
|
77
|
+
<property name="expand">True</property>
|
78
|
+
<property name="fill">True</property>
|
79
|
+
<property name="padding">10</property>
|
80
|
+
<property name="position">0</property>
|
81
|
+
</packing>
|
82
|
+
</child>
|
83
|
+
</object>
|
84
|
+
</child>
|
85
|
+
</object>
|
86
|
+
</interface>
|
@@ -0,0 +1,89 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<interface>
|
3
|
+
<requires lib="gtk+" version="2.16"/>
|
4
|
+
<!-- interface-naming-policy project-wide -->
|
5
|
+
<object class="GtkWindow" id="window1">
|
6
|
+
<property name="visible">True</property>
|
7
|
+
<property name="can_focus">False</property>
|
8
|
+
<property name="title" translatable="yes">Output Location</property>
|
9
|
+
<property name="modal">True</property>
|
10
|
+
<property name="window_position">center</property>
|
11
|
+
<property name="default_width">700</property>
|
12
|
+
<signal name="destroy" handler="destroy_window" swapped="no"/>
|
13
|
+
<child>
|
14
|
+
<object class="GtkHBox" id="hbox1">
|
15
|
+
<property name="visible">True</property>
|
16
|
+
<property name="can_focus">False</property>
|
17
|
+
<child>
|
18
|
+
<object class="GtkVBox" id="vbox1">
|
19
|
+
<property name="height_request">500</property>
|
20
|
+
<property name="visible">True</property>
|
21
|
+
<property name="can_focus">False</property>
|
22
|
+
<property name="spacing">10</property>
|
23
|
+
<child>
|
24
|
+
<object class="GtkFileChooserWidget" id="filechooserwidget_output">
|
25
|
+
<property name="visible">True</property>
|
26
|
+
<property name="can_focus">False</property>
|
27
|
+
<property name="orientation">vertical</property>
|
28
|
+
<property name="spacing">10</property>
|
29
|
+
<property name="action">save</property>
|
30
|
+
</object>
|
31
|
+
<packing>
|
32
|
+
<property name="expand">True</property>
|
33
|
+
<property name="fill">True</property>
|
34
|
+
<property name="padding">10</property>
|
35
|
+
<property name="position">0</property>
|
36
|
+
</packing>
|
37
|
+
</child>
|
38
|
+
<child>
|
39
|
+
<object class="GtkHButtonBox" id="hbuttonbox1">
|
40
|
+
<property name="visible">True</property>
|
41
|
+
<property name="can_focus">False</property>
|
42
|
+
<property name="spacing">10</property>
|
43
|
+
<property name="layout_style">spread</property>
|
44
|
+
<child>
|
45
|
+
<object class="GtkButton" id="button_save">
|
46
|
+
<property name="label" translatable="yes">Save</property>
|
47
|
+
<property name="visible">True</property>
|
48
|
+
<property name="can_focus">True</property>
|
49
|
+
<property name="receives_default">True</property>
|
50
|
+
</object>
|
51
|
+
<packing>
|
52
|
+
<property name="expand">False</property>
|
53
|
+
<property name="fill">False</property>
|
54
|
+
<property name="position">0</property>
|
55
|
+
</packing>
|
56
|
+
</child>
|
57
|
+
<child>
|
58
|
+
<object class="GtkButton" id="button_cancel">
|
59
|
+
<property name="label" translatable="yes">Cancel</property>
|
60
|
+
<property name="visible">True</property>
|
61
|
+
<property name="can_focus">True</property>
|
62
|
+
<property name="receives_default">True</property>
|
63
|
+
</object>
|
64
|
+
<packing>
|
65
|
+
<property name="expand">False</property>
|
66
|
+
<property name="fill">False</property>
|
67
|
+
<property name="position">1</property>
|
68
|
+
</packing>
|
69
|
+
</child>
|
70
|
+
</object>
|
71
|
+
<packing>
|
72
|
+
<property name="expand">False</property>
|
73
|
+
<property name="fill">False</property>
|
74
|
+
<property name="padding">10</property>
|
75
|
+
<property name="position">1</property>
|
76
|
+
</packing>
|
77
|
+
</child>
|
78
|
+
</object>
|
79
|
+
<packing>
|
80
|
+
<property name="expand">True</property>
|
81
|
+
<property name="fill">True</property>
|
82
|
+
<property name="padding">10</property>
|
83
|
+
<property name="position">0</property>
|
84
|
+
</packing>
|
85
|
+
</child>
|
86
|
+
</object>
|
87
|
+
</child>
|
88
|
+
</object>
|
89
|
+
</interface>
|
@@ -0,0 +1,66 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<interface>
|
3
|
+
<requires lib="gtk+" version="2.24"/>
|
4
|
+
<!-- interface-naming-policy project-wide -->
|
5
|
+
<object class="GtkFileChooserDialog" id="filechooserdialog1">
|
6
|
+
<property name="can_focus">False</property>
|
7
|
+
<property name="border_width">5</property>
|
8
|
+
<property name="role">GtkFileChooserDialog</property>
|
9
|
+
<property name="type_hint">dialog</property>
|
10
|
+
<property name="opacity">0.71999999999999997</property>
|
11
|
+
<property name="action">save</property>
|
12
|
+
<child internal-child="vbox">
|
13
|
+
<object class="GtkVBox" id="dialog-vbox1">
|
14
|
+
<property name="visible">True</property>
|
15
|
+
<property name="can_focus">False</property>
|
16
|
+
<property name="spacing">2</property>
|
17
|
+
<child internal-child="action_area">
|
18
|
+
<object class="GtkHButtonBox" id="dialog-action_area1">
|
19
|
+
<property name="visible">True</property>
|
20
|
+
<property name="can_focus">False</property>
|
21
|
+
<property name="layout_style">end</property>
|
22
|
+
<child>
|
23
|
+
<object class="GtkButton" id="button_save">
|
24
|
+
<property name="label" translatable="yes">Save</property>
|
25
|
+
<property name="visible">True</property>
|
26
|
+
<property name="can_focus">True</property>
|
27
|
+
<property name="receives_default">True</property>
|
28
|
+
</object>
|
29
|
+
<packing>
|
30
|
+
<property name="expand">False</property>
|
31
|
+
<property name="fill">False</property>
|
32
|
+
<property name="position">0</property>
|
33
|
+
</packing>
|
34
|
+
</child>
|
35
|
+
<child>
|
36
|
+
<object class="GtkButton" id="button_cancel">
|
37
|
+
<property name="label" translatable="yes">Cancel</property>
|
38
|
+
<property name="visible">True</property>
|
39
|
+
<property name="can_focus">True</property>
|
40
|
+
<property name="receives_default">True</property>
|
41
|
+
</object>
|
42
|
+
<packing>
|
43
|
+
<property name="expand">False</property>
|
44
|
+
<property name="fill">False</property>
|
45
|
+
<property name="position">1</property>
|
46
|
+
</packing>
|
47
|
+
</child>
|
48
|
+
</object>
|
49
|
+
<packing>
|
50
|
+
<property name="expand">False</property>
|
51
|
+
<property name="fill">True</property>
|
52
|
+
<property name="pack_type">end</property>
|
53
|
+
<property name="position">0</property>
|
54
|
+
</packing>
|
55
|
+
</child>
|
56
|
+
<child>
|
57
|
+
<placeholder/>
|
58
|
+
</child>
|
59
|
+
</object>
|
60
|
+
</child>
|
61
|
+
<action-widgets>
|
62
|
+
<action-widget response="0">button_save</action-widget>
|
63
|
+
<action-widget response="0">button_cancel</action-widget>
|
64
|
+
</action-widgets>
|
65
|
+
</object>
|
66
|
+
</interface>
|
data/tsp
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'vrlib'
|
4
|
+
|
5
|
+
#make program output in real time so errors visible in VR.
|
6
|
+
STDOUT.sync = true
|
7
|
+
STDERR.sync = true
|
8
|
+
|
9
|
+
#everything in these directories will be included
|
10
|
+
my_path = File.expand_path(File.dirname(__FILE__))
|
11
|
+
require_all Dir.glob(my_path + "/bin/**/*.rb")
|
12
|
+
|
13
|
+
App.new.show
|
14
|
+
|
metadata
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tangsalesparser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Leo Tumwattana
|
9
|
+
autorequire:
|
10
|
+
bindir:
|
11
|
+
- .
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-02-07 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: vrlib
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.0.1
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 0.0.1
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: gtk2
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: 0.0.1
|
39
|
+
type: :runtime
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 0.0.1
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: require_all
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.0.1
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 0.0.1
|
63
|
+
description: ! "Copyright (c) <''2013''> <''Leo Tumwattana''>\n\nThis software is
|
64
|
+
provided 'as-is', without any express or implied\nwarranty. In no event will the
|
65
|
+
authors be held liable for any damages\narising from the use of this software.\n\nPermission
|
66
|
+
is granted to anyone to use this software for any purpose,\nincluding commercial
|
67
|
+
applications, and to alter it and redistribute it\nfreely, subject to the following
|
68
|
+
restrictions:\n\n 1. The origin of this software must not be misrepresented; you
|
69
|
+
must not\n claim that you wrote the original software. If you use this software\n
|
70
|
+
\ in a product, an acknowledgment in the product documentation would be\n appreciated
|
71
|
+
but is not required.\n\n 2. Altered source versions must be plainly marked as
|
72
|
+
such, and must not be\n misrepresented as being the original software.\n\n 3.
|
73
|
+
This notice may not be removed or altered from any source\n distribution."
|
74
|
+
email: leo.tumwattana@gmail.com
|
75
|
+
executables:
|
76
|
+
- tsp
|
77
|
+
extensions: []
|
78
|
+
extra_rdoc_files: []
|
79
|
+
files:
|
80
|
+
- bin/Alert.rb
|
81
|
+
- bin/App.rb
|
82
|
+
- bin/ConfigEditor.rb
|
83
|
+
- bin/InputDialog.rb
|
84
|
+
- bin/OutputDialog.rb
|
85
|
+
- bin/TangConfig.rb
|
86
|
+
- bin/TangSalesParser.rb
|
87
|
+
- bin/glade/Alert.glade
|
88
|
+
- bin/glade/App.glade
|
89
|
+
- bin/glade/ConfigEditor.glade
|
90
|
+
- bin/glade/InputDialog.glade
|
91
|
+
- bin/glade/OutputDialog.glade
|
92
|
+
- bin/glade/Save_Dialog.glade
|
93
|
+
- ./tsp
|
94
|
+
homepage: ''
|
95
|
+
licenses: []
|
96
|
+
post_install_message:
|
97
|
+
rdoc_options: []
|
98
|
+
require_paths:
|
99
|
+
- .
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ! '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
requirements: []
|
113
|
+
rubyforge_project: nowarning
|
114
|
+
rubygems_version: 1.8.25
|
115
|
+
signing_key:
|
116
|
+
specification_version: 3
|
117
|
+
summary: ''
|
118
|
+
test_files: []
|