columbus3 0.5.1 → 0.6.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.
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