columbus3 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 20d8bb20cc305bf99ef9859d3b01835079b058c3fe9a16cc02c1a51a0f95d68f
4
- data.tar.gz: c267002099bf400d4a6391c2e5a1442af09293b356875bb622b0346ad66b9b15
2
+ SHA1:
3
+ metadata.gz: 7cc5864ef1e5f14f52939520fa0a1bc7e2506a45
4
+ data.tar.gz: b95abe7c54af522d1a747e25d1dd647585fa5e22
5
5
  SHA512:
6
- metadata.gz: bf0a4000b8f5a97700dca556efc87ecb5096474b89eee17fb8222e6996488f5d050eda691101ab17c494a779d937365273d4930b5bb872497297dbd31957fff0
7
- data.tar.gz: b5b65c76736b6b83d0350f33b0a5988ade2a186f84dc49d24b4c159d306403c865c9f22893e43e069106b20f145b8602402965d72c114a9d646584d5d6c9f087
6
+ metadata.gz: 96aa4ef40cd7bd9cdf16764839cf9fc38c00494ae698bf7242aa0cb808983b25d2cbf05f1c903a56c2773d6e708f3256313d9750cc78348e20a727d925e6f1df
7
+ data.tar.gz: 54db9fe50f38f4e405b9fd94c1dbba2655d57509dd6d0422ae1be196753ad2a094f6a1ca496eac0e225d90ddfc03e566d4003a4505894891d42ad4c3144aa798
data/README.md CHANGED
@@ -1,18 +1,22 @@
1
1
  Columbus3
2
2
  =========
3
3
 
4
- A gem to manage GPS tracks generated by the Columbus V900 and V990 GPS trackers.
4
+ A ruby gem to show, organize, and search GPS tracks generated by the
5
+ Columbus V900 and V990 GPS trackers.
5
6
 
6
- This gem:
7
+ The gem works by allowing you to associate a "sidecar" file to each
8
+ Columbus track. The sidecar file, in YAML fromat, contains
9
+ information such as the start and end location, the maximum speed, the
10
+ maximum elevation of the track.
7
11
 
8
- - generates a sidecar file for each columbus track you process. The
9
- sidecar file contains information about date, start location, end
10
- location, max speed, etc.
11
- - allows to search tracks using complex queries. For instance, "get
12
- me all tracks with max speed less than 10 kilometers per hours"
13
- - allows to show one or more tracks on a map, using leaflet.js
14
- - it is "pipe friendly", so that you can search for all track matching
15
- a given criteria and show them on a map
12
+ The information stored in the sidecar files can then be used to search
13
+ tracks. Them gem allows you, for instance, to perform complex queries
14
+ such as: "get the tracks whose max speed less than 10 kilometers per
15
+ hours and whose start location is in the USA".
16
+
17
+ Tracks can be shown on a map. The application is pipe "friendly", so
18
+ that, for instance, you can pipe the output of a search to the show
19
+ command to view all the tracks matching your search.
16
20
 
17
21
  Installation
18
22
  ------------
@@ -32,16 +36,77 @@ Or install it yourself as:
32
36
 
33
37
  Usage
34
38
  -----
39
+ Generate the sidecar files for your tracks with the `process` command:
40
+
41
+ columbus3 process 11010101.CSV # generate the sidecar file for 11010101.CSV
42
+
43
+ notice that you can pass `*` as argument to process all your tracks at
44
+ once. The process command reverse geocodes the first and last point
45
+ of the track and stores other information about the track.
46
+
47
+ cat 11010101.CSV
48
+ ---
49
+ :start_date: 2011-01-01 22:15:58.000000000 Z
50
+ :end_date: 2011-01-02 03:06:57.000000000 Z
51
+ :duration: 17459.0
52
+ :size: 17440
53
+ :start_location: University of California, Santa Barbara, Ocean Road, Isla Vista, CA 93117, USA
54
+ :end_location: 500-524 Matadero Avenue, Palo Alto, CA 94306, USA
55
+ :min_speed: 0
56
+ :max_speed: 138
57
+ :min_height: -9
58
+ :max_height: 432
59
+ :bearing: NW
60
+ :distance: 885.6399415490763
61
+ :distance_aerial: 392.2223148453187
62
+ :filename: 11010101.CSV
63
+
64
+ Once you have the sidecar files, you can search, show, and display
65
+ detailed information about your tracks.
66
+
67
+ For instance:
68
+
69
+ columbus3 search 'location ~ "USA"'
70
+
71
+ returns all tracks in the current directory, whose start or end location has "USA" in the address
72
+ field. Notice the usage of the single quote to protect the `~` from expansion.
35
73
 
36
- Get detailed instructions with:
74
+ The command:
37
75
 
38
- columbus3 man
76
+ columbus3 show 11010101.CSV 11010201.CSV
77
+
78
+ shows tracks on a map (you need to open `_show.html` in a browser to view the map), while
79
+
80
+ columbus3 graph 11010101.CSV
81
+
82
+ shows info about a single track (you need to open `_graph.html` in a browser to view the info).
83
+
84
+ Piping also works. For instance:
85
+
86
+ columbus3 search 'location ~ "USA"' --fields path | colmumbus3 show
87
+
88
+ gets all tracks whose start or end location has "USA" in the address field and diplays them on a map.
89
+
90
+ GPX files can also be managed, although it is first necessary to
91
+ convert them to V900 tracks with the following command:
92
+
93
+ columbus3 convert file.gpx
39
94
 
40
- You can also view the manual online: [manual](doc/manual.txt).
95
+ makes `file.gpx` into a V900 CSV track.
41
96
 
42
- A console is also available for simplifying interaction. Invoke it with:
97
+ If you do not want to type `columbus3` every time, you can invoke a console:
43
98
 
44
99
  columbus3 console
100
+ columbus3:000> process 11010101.CSV
101
+ columbus3:001> show 11010101.CSV
102
+ columbus3:002>
103
+
104
+ More information with:
105
+
106
+ columbus3 help # get list of available commands
107
+ columbus3 help process # get help about the process command
108
+ columbus3 man
109
+
45
110
 
46
111
  Development
47
112
  -----------
@@ -60,11 +125,55 @@ Contributing
60
125
  ------------
61
126
 
62
127
  Bug reports and pull requests are welcome on GitHub at
63
- https://github.com/\[USERNAME\]/columbus3.
128
+ https://github.com/avillafiorita/columbus3.
129
+
130
+ License
131
+ -------
132
+
133
+ The original code of this gem is available as open source under the
134
+ terms of the [MIT License](http://opensource.org/licenses/MIT).
135
+
136
+ The gem ships wih the following Javascript libraries, which are
137
+ distributed according to their licenses:
138
+
139
+ - [Leaflet](http://leafletjs.com/)
140
+ ([License](https://github.com/Leaflet/Leaflet/blob/master/LICENSE))
141
+ - [Flot](http://www.flotcharts.org/)
142
+ ([License](https://github.com/flot/flot/blob/master/LICENSE.txt))
143
+ - [jQuery](http://jquery.com/)
144
+ ([License](https://github.com/jquery/jquery/blob/master/LICENSE.txt))
145
+
146
+ See Also
147
+ --------
148
+
149
+ If you are looking for a full graphical client and work on MacOS, you
150
+ might want to download Columbus from http://www.minimalbit.com
64
151
 
65
152
  Version History
66
153
  ---------------
67
154
 
155
+ **0.6.0**
156
+ - More informative output from commands
157
+ - The `help` command is now more informative
158
+ - The `path` field in the search command now returns the path of the
159
+ CSV file (and not that of the YAML sidecar file), simplifying piping
160
+ searches to the show command
161
+ - When searching, a new field `yaml` returns the name of the sidecar
162
+ file associated to a track
163
+ - New behaviour of `show` and `graph` commands: the `_show.html` and
164
+ `_graph.html` are always created, even if a file with the same name
165
+ already exists in the current directory (previous versions required
166
+ to specify the `--force` option to achieve the same behaviour); a
167
+ backup copy of the files which are overwritten is always created.
168
+ The `--force` option forces rewriting of the javascript files;
169
+ backup copies of existing files are created.
170
+ - The number of tile providers has been significantly reduced
171
+ - Some code has been refactored to improve readability
172
+ - Added `-h` and `--help` (in addition to the `help` command)
173
+ - Updates to the documentation
174
+ - Bumped version of gems used in production
175
+ - Bumped version of gems used for development
176
+
68
177
  **0.5.0**
69
178
 
70
179
  - Fixed a bug with searches on dates
@@ -73,14 +182,14 @@ Version History
73
182
  - More informative messages when running commands
74
183
  - Added a console: launch it with `columbus3 console`
75
184
  - Fixed a bug with graph (call to sanitize failed)
76
- - Added [Changelog File](doc/ChangeLog.org), which I am using to help mantaining
185
+ - Added [Changelog File](doc/ChangeLog.org), which I am using to help maintaning
77
186
  this list of changes
78
187
 
79
188
  **0.4.0**
80
189
 
81
190
  - Improved syntax for search:
82
191
  - new option -r searches in sub-directories
83
- - new option --fields allows to specify the fields to look for
192
+ - new option --fields allows to specify the to look for
84
193
 
85
194
  **0.3.0**
86
195
 
@@ -104,19 +213,3 @@ Version History
104
213
 
105
214
  - Initial release
106
215
 
107
- License
108
- -------
109
-
110
- The original code of this gem is available as open source under the
111
- terms of the [MIT License](http://opensource.org/licenses/MIT).
112
-
113
- The gem ships wih the following javascript libraries, which are
114
- distributed according to their licenses:
115
-
116
- - [Leaflet](http://leafletjs.com/)
117
- ([License](https://github.com/Leaflet/Leaflet/blob/master/LICENSE))
118
- - [Flot](http://www.flotcharts.org/)
119
- ([License](https://github.com/flot/flot/blob/master/LICENSE.txt))
120
- - [jQuery](http://jquery.com/)
121
- ([License](https://github.com/jquery/jquery/blob/master/LICENSE.txt))
122
-
File without changes
data/bin/setup CHANGED
File without changes
@@ -7,11 +7,11 @@ Gem::Specification.new do |spec|
7
7
  spec.name = "columbus3"
8
8
  spec.version = Columbus3::VERSION
9
9
  spec.authors = ["Adolfo Villafiorita"]
10
- spec.email = ["adolfo.villafiorita@ict4g.net"]
10
+ spec.email = ["adolfo.villafiorita@me.com"]
11
11
 
12
- spec.summary = %q{Manage V900 and V990 GPS tracks from the command line.}
13
- spec.description = %q{Some simple command line commands to manage tracks generated by the V900 family of GPS loggers (CSV format).}
14
- spec.homepage = "https://www.ict4g.net/gitea/adolfo/columbus3"
12
+ spec.summary = %q{Manage Columbus V900 and V990 GPS tracks from the command line.}
13
+ spec.description = %q{Some simple command line commands to manage tracks generated by the Columbus family of GPS loggers (CSV format).}
14
+ spec.homepage = "http://www.github.com/avillafiorita/columbus3"
15
15
  spec.license = "MIT"
16
16
 
17
17
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
@@ -19,10 +19,10 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_development_dependency "bundler", "~> 1.10"
23
- spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_development_dependency "bundler"
23
+ spec.add_development_dependency "rake"
24
24
  spec.add_development_dependency "minitest"
25
25
 
26
- spec.add_dependency "slop", "~> 4.3.0"
26
+ spec.add_dependency "slop", "~> 4.5.0"
27
27
  spec.add_dependency "geocoder"
28
28
  end
@@ -8,3 +8,50 @@ Archived entries from file /home/adolfo/Documents/Sources/ruby/columbus3/doc/tod
8
8
  :ARCHIVE_CATEGORY: todo
9
9
  :ARCHIVE_TODO: DONE
10
10
  :END:
11
+
12
+ * REJECTED fix filename standards in a specific class (or one method per class)
13
+ :PROPERTIES:
14
+ :ARCHIVE_TIME: 2017-08-10 Thu 14:29
15
+ :ARCHIVE_FILE: ~/Documents/Sources/ruby/columbus3/doc/todo.org
16
+ :ARCHIVE_OLPATH: Rails: columbus3
17
+ :ARCHIVE_CATEGORY: todo
18
+ :ARCHIVE_TODO: REJECTED
19
+ :ARCHIVE_ITAGS: columbus3
20
+ :END:
21
+ .yaml extension
22
+ .js extension
23
+ _show.html
24
+ _graph.html
25
+ ... there should be one place only where filename.csv is tranformed
26
+ appropriately
27
+
28
+
29
+ * DONE new policy for --force
30
+ :PROPERTIES:
31
+ :ARCHIVE_TIME: 2017-08-10 Thu 14:30
32
+ :ARCHIVE_FILE: ~/Documents/Sources/ruby/columbus3/doc/todo.org
33
+ :ARCHIVE_OLPATH: Rails: columbus3
34
+ :ARCHIVE_CATEGORY: todo
35
+ :ARCHIVE_TODO: DONE
36
+ :ARCHIVE_ITAGS: columbus3
37
+ :END:
38
+ backup are always created, if the files exist
39
+ --force rewrites yaml, js, or graph_js files (they shouldn't be changed
40
+ once generated)
41
+
42
+ _show.html, _graph.html are expendable and can be written and rewritten
43
+ every time
44
+
45
+
46
+ * DONE be more informative about what is going on
47
+ :PROPERTIES:
48
+ :ARCHIVE_TIME: 2017-08-10 Thu 15:21
49
+ :ARCHIVE_FILE: ~/Documents/Sources/ruby/columbus3/doc/todo.org
50
+ :ARCHIVE_OLPATH: Rails: columbus3
51
+ :ARCHIVE_CATEGORY: todo
52
+ :ARCHIVE_TODO: DONE
53
+ :ARCHIVE_ITAGS: columbus3
54
+ :END:
55
+ Many commands succeed silently. They could probably print some
56
+ informative messages
57
+
@@ -4,10 +4,27 @@
4
4
  #+STARTUP: showall
5
5
 
6
6
  * Rails: columbus3
7
- ** TODO integrate manual generation (manual.txt) in the deployment process
8
- ** FEATURE be more informative about what is going on
9
- Many commands succeed silently. They could probably print some
10
- informative messages
7
+ ** FEATURE Add a web interface with sinatra
8
+ The web interface does three things:
9
+ - show the list of tracks
10
+ - filter tracks using search
11
+ - show/graph tracks
12
+
13
+ ** FEATURE support for tags
14
+ columbus3 tag -a TAG_NAME track1...trackN
15
+ columbus3 tag -d TAG_NAME track1...trackN
16
+
17
+ ** FEATURE As a user I want to split a track at a given point
18
+ Pass the index as argument and generate two files out of the existing one
19
+ Give the option to delete the old file and to process the new files
20
+
21
+ ** FEATURE As a user I want to merge to different tracks
22
+ Main motivation for this feature is that the CSV files have an index
23
+ column, which needs to be properly updated.
24
+
25
+ ** FEATURE GPX export (for DarkTable and GoogleEarth)
26
+ This is covered by GPS Babel, but it is also very simple to implement
27
+
11
28
  ** FEATURE As a user I want to be able to view the individual points
12
29
  Performance is an issue, here. Maybe activate the layer on a need-basis.
13
30
  Also: it would be nice to produce a single GeoJSON set of data (e.g., the
@@ -47,17 +64,13 @@
47
64
 
48
65
  ** FEATURE As a user I want to identify the time/index of individual points
49
66
  This is useful for track splitting
67
+
50
68
  ** FEATURE As a user I want to have an idea of the direction and other info such as speed and height
51
69
  Some possible solutions include: color dots, put height and speed plot on the same page)
52
- ** FEATURE As a user I want to split a track at point
53
- Pass the index as argument and generate two files out of the existing one
54
- Give the option to delete the old file and to process the new files
55
- ** FEATURE GPX export for DarkTable and GoogleEarth
56
- ** FEATURE As a user I want to be able to add custom fields
57
- Allow users to specify custom fields in the sidecar file
70
+
58
71
  ** FEATURE As a user I want to filter values with wrong precision
72
+
59
73
  ** FEATURE As a user I do not want to view data only in ZULU time
60
74
  - get the local timezone (or let the user specify a timezone)
61
75
  - use the timezone of the starting point
62
- ** FEATURE Make it into a sinatra app?
63
76
 
@@ -1,135 +1,12 @@
1
1
  require 'columbus3/version'
2
2
  require 'find'
3
3
  require 'readline'
4
+ require 'fileutils'
4
5
 
5
6
  module Columbus3
6
7
  module CommandSemantics
7
8
  APPNAME = 'columbus3'
8
9
  VERSION = Columbus3::VERSION
9
- MAN = <<EOS
10
- NAME
11
- #{APPNAME} -- manage Columbus V900 and V990 tracks from the command line
12
-
13
- SYNOPSYS
14
- #{APPNAME} [-h|-v]
15
- #{APPNAME} command [options] [args]
16
-
17
- DESCRIPTION
18
-
19
- columbus3 manages Columbus V900 and V990 tracks from the command line,
20
- allowing a user to associate a sidecar file with the main information
21
- about a track, searching tracks (through sidecar files), displaying
22
- tracks on a map.
23
-
24
- EXAMPLES
25
-
26
- #{APPNAME} -h # get syntax of each command
27
- columbus3 process 11010101.CSV # generate a sidecar file
28
- columbus3 search 'location ~ "USA"' # get tracks in the USA
29
- columbus3 show 11010101.CSV 11010201.CSV # show tracks on a map (_show.html)
30
- columbus3 graph 11010101.CSV # show info about a track (_graph.html)
31
-
32
- if you do not want to type columbus3 each type, you can invoke a console:
33
-
34
- columbus3 console
35
- columbus3:000> process 11010101.CSV
36
- columbus3:001> show 11010101.CSV
37
- columbus3:002>
38
-
39
- columbus3 also has a function to convert a GPX into a bunch of CSV
40
- files (which you can then process with the other commands), with some
41
- limitations (see below).
42
-
43
- The command is useful if you are using different loggers for generating your
44
- tracks:
45
-
46
- columbus3 convert file.gpx
47
-
48
- will generate
49
-
50
- file-1.csv
51
- file-2.csv
52
- ...
53
-
54
- one per track in the GPX file.
55
-
56
- **CSV export limitations** The Columbus V900 format has fields with fixed width,
57
- and uses ^@ as a filler. The CSV file generated by the convert command generates fields
58
- of variable width (standard CSV files, I dare say). The heading field is not computed
59
- and the field is filled with -1.
60
-
61
- Piping commands. You can pipe the output of a search command to show, using
62
- the following syntax:
63
-
64
- columbus3 search 'location ~ "USA"' --fields path | columbus3 show --sidecar
65
-
66
- The option --fields shows only the pathname of the files found; the option
67
- --sidecar removes the .yaml extension from the list of files found.
68
-
69
- SEARCH SYNTAX
70
-
71
- >>> DON'T FORGET TO EMBED YOUR QUERY IN SINGLE QUOTES <<<
72
-
73
- Terms you can search for:
74
-
75
- location, start_location, end_location
76
- date, start_date, end_date
77
- year
78
- duration
79
- max_speed
80
- min_height
81
- max_height
82
-
83
- Numerical operators:
84
- <, <=, ==, >=, >
85
-
86
- String operators (locations):
87
- ~ (contains), == (is exactly)
88
-
89
- Complex Terms:
90
- Use "and" and "or" to build complex queries
91
-
92
- Examples of simple searches
93
- 'location ~ "USA"' any track whose start or end location contains USA
94
- 'date > 2015-02-14' any track whose start or end date is after Feb 14, 2015
95
- 'year == 2015' any track whose start or end date is in 2015
96
- 'duration <= 01:02:03' any track with a duration of less than 1h, 2min, and 3secs
97
- 'max_speed > 120' any track with a max speed greater than 120 km/h
98
- 'min_height == 10' any track with a min height lower than 10 meters
99
-
100
- Examples of complex searches
101
- 'location ~ "USA" and start_date >= 2015-01-01' tracks in the USA after or on Jan 1, 2015
102
- 'start_location ~ "Trenton" and end_location ~ "New York"' trips from Trenton to New York
103
-
104
- List of supported fields in output
105
- path -> relative path of the CSV file
106
- filename -> basename of the CSV file
107
- start_location -> start location
108
- end_location -> end location
109
- start_date -> start date (and time)
110
- end_date -> end date (and time)
111
- duration -> duration in seconds
112
- min_speed -> minimum speed in km/h
113
- max_speed -> maximum speed in km/h
114
- min_height -> minimum height in meters
115
- max_height -> maximum height in meters
116
-
117
- VERSION
118
- This is version #{VERSION}
119
-
120
- LICENSE
121
- MIT
122
-
123
- Columbus3 uses leaflet, leafleft-providers, flot, and jquery. They
124
- are distributed under a different license: see their websites for more
125
- details (or have a look at the license file shipped with the Gem)
126
-
127
- SEE ALSO
128
- If you are looking for a full graphical client, you might want to
129
- download Columbus from http://www.minimalbit.com
130
-
131
- https://github.com/avillafiorita/columbus3
132
- EOS
133
10
 
134
11
  #
135
12
  # Main App Starts Here!
@@ -139,14 +16,17 @@ EOS
139
16
  end
140
17
 
141
18
  def self.man opts = nil, argv = []
142
- puts MAN
19
+ path = File.join(File.dirname(__FILE__), "/../../../README.md")
20
+ file = File.open(path, "r")
21
+ contents = file.read
22
+ puts contents
143
23
  end
144
24
 
145
25
  def self.help opts = nil, argv = []
146
26
  all_commands = CommandSyntax.commands
147
27
 
148
28
  if argv != []
149
- argv.map { |x| puts all_commands[x.to_sym][0] }
29
+ argv.map { |x| puts all_commands[x.to_sym][2] }
150
30
  else
151
31
  puts "#{APPNAME} command [options] [args]"
152
32
  puts ""
@@ -187,6 +67,7 @@ EOS
187
67
  if sidecar.exist? and not force
188
68
  puts "Sidecar file for #{track.filename} already exists. Use --force if you want to overwrite it."
189
69
  else
70
+ backup(sidecar.filename) if sidecar.exist?
190
71
  printf "Processing %s ...", track.filename
191
72
  sidecar.metadata = track.metadata
192
73
  sidecar.save
@@ -199,7 +80,7 @@ EOS
199
80
  debug = opts[:debug]
200
81
  directory = opts[:dir] || "."
201
82
  recurse = opts[:recurse]
202
- fields = opts[:fields].any? ? opts[:fields].map { |x| x.to_sym } : [:path, :filename, :start_location, :end_location, :start_date, :end_date, :duration, :min_speed, :max_speed, :min_height, :max_height]
83
+ output_fields = opts[:fields].any? ? opts[:fields].map { |x| x.to_sym } : [:path, :filename, :start_location, :end_location, :start_date, :end_date, :duration, :min_speed, :max_speed, :min_height, :max_height]
203
84
 
204
85
  if recurse then
205
86
  files = Find.find(directory).select { |e| File.extname(e) == ".yaml" }
@@ -212,84 +93,24 @@ EOS
212
93
  puts "Searched files: #{files.join(",")}"
213
94
  puts "Searched files count: #{files.size}"
214
95
  puts "Processed query: #{query}"
215
- puts "Fields: #{fields}"
96
+ puts "Output Fields: #{fields}"
216
97
  else
217
98
  sidecar_search = Columbus3::SidecarSearch.new
218
99
  sidecar_search.load files
219
100
  match = sidecar_search.search query
220
101
  match.each do |m|
221
- string = fields.map { |x| "#{m[x]}" }.join("\t")
102
+ string = output_fields.map { |x| "#{m[x]}" }.join("\t")
222
103
  printf "%s\n", string
223
104
  end
224
105
  end
225
106
  end
226
107
 
227
108
  def self.show opts, args
228
- filename = opts[:filename] || "_show.html"
229
- force = opts[:force]
230
- sidecar = opts[:sidecar]
231
-
232
- # build the argument list, which are either provided from the command line
233
- # or, if args, is empty, from the standard input
234
- files = args == [] ? STDIN.read.split("\n") : args
235
-
236
- # remove .yaml from files, if required to do so
237
- pruned_args = sidecar ? files.map { |x| x.gsub(/\.(YAML|yaml)$/, '') } : files
238
-
239
- pruned_args.each do |arg|
240
- # generate the js file(s), if not already existing or forced to
241
- # do so by the force directive
242
- if force or not File.exist? arg
243
- printf "Creating json file for #{arg} ..."
244
- complete = true
245
- else
246
- puts "Json file for #{arg} already exists (--force to force updating)"
247
- complete = false
248
- end
249
- Columbus3::LeafletRenderer::to_leaflet arg, force
250
- puts "done!" if complete
251
- end
252
- if force or not File.exist? filename
253
- printf "Creating #{filename} ..."
254
- complete = true
255
- else
256
- puts "#{filename} already exists (--force to force updating)"
257
- complete = false
258
- end
259
- Columbus3::LeafletRenderer::show(filename, pruned_args) if args
260
- puts "done!" if complete
261
- puts "You might now want to open #{filename}."
109
+ show_machinery opts, args, Columbus3::LeafletRenderer
262
110
  end
263
111
 
264
112
  def self.graph opts, args
265
- filename = opts[:filename] || "_graph.html"
266
- force = opts[:force]
267
-
268
- input_filename = args[0]
269
- if input_filename
270
- if force or not File.exist? input_filename
271
- printf "Creating javascript graph data for #{input_filename} ..."
272
- complete = true
273
- else
274
- puts "Javascript graph data for #{input_filename} already exists (--force to force updating)"
275
- complete = false
276
- end
277
- Columbus3::FlotRenderer::to_graph_data input_filename, force
278
- puts "done!" if complete
279
-
280
- if force or not File.exist? arg
281
- printf "Creating #{filename} ..."
282
- complete = true
283
- else
284
- puts "#{filename} already exists (--force to force updating)"
285
- complete = false
286
- end
287
- Columbus3::FlotRenderer::show filename, input_filename
288
- puts "done!" if complete
289
- puts "You might now want to open #{filename}."
290
- else
291
- puts "Error: please specify a track file"
292
- end
113
+ show_machinery opts, args, Columbus3::FlotRenderer
293
114
  end
294
115
 
295
116
  def self.convert opts, args
@@ -320,7 +141,7 @@ EOS
320
141
 
321
142
  # read-eval-print step
322
143
  def self.reps all_commands, argv
323
- if argv == []
144
+ if argv == [] or argv[0] == "--help" or argv[0] == "-h"
324
145
  CommandSemantics.help
325
146
  exit 0
326
147
  else
@@ -348,5 +169,63 @@ EOS
348
169
  end
349
170
  end
350
171
  end
172
+
173
+ private
174
+
175
+ def self.backup filename
176
+ FileUtils::cp filename, filename + "~"
177
+ puts "Backup copy #{filename} created in #{filename}~."
178
+ end
179
+
180
+ def self.backup_and_write filename, content
181
+ backup(filename) if File.exist?(filename)
182
+ File.open(filename, "w") { |f| f.puts content }
183
+ end
184
+
185
+ # low level machinery for all renderers
186
+ # - opts list of options (filename and force)
187
+ # - args: CSV files to process
188
+ # - renderer, the renderer module to use, which has to expose the following
189
+ # calls: OUTPUT_FILENAME, to_javascript_filename, to_javascript_file,
190
+ def self.show_machinery opts, args, renderer
191
+ filename = opts[:filename] || renderer::OUTPUT_FILENAME
192
+ force = opts[:force]
193
+
194
+ # build the argument list, which is either provided from the
195
+ # command line or, if args is empty, from the standard input
196
+ files = (args == [] ? STDIN.read.split("\n") : args)
197
+
198
+ if files.empty?
199
+ puts "Error! Please pipe or pass as argument the list of files to show on the map."
200
+ exit 1
201
+ end
202
+
203
+ files.each do |file|
204
+ javascript_filename = renderer::to_javascript_filename file
205
+
206
+ # backup if the geojson file exists and we are forcing writing
207
+ backup(javascript_filename) if File.exist?(javascript_filename) and force
208
+
209
+ # print some messages
210
+ if force or not File.exist?(javascript_filename)
211
+ printf "Creating javascript file for #{file} ..."
212
+ print_done = true
213
+ else
214
+ puts "Javascript file for #{file} already exists (--force to force updating)"
215
+ print_done = false
216
+ end
217
+ # create the geojson file (if necessary or required to do so)
218
+ renderer::to_javascript_file file, force
219
+ # print some messages
220
+ puts "done!" if print_done
221
+ end
222
+
223
+ backup(filename) if File.exist? filename
224
+ printf "Writing #{filename}... "
225
+ renderer::show filename: filename, files: files
226
+ puts "done!"
227
+ puts "You might now want to open #{filename}."
228
+ end
229
+
351
230
  end
352
231
  end