cartocss_helper 1.0.1 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,11 +10,13 @@ module CartoCSSHelper
10
10
  end
11
11
  return @@loaded_filename
12
12
  end
13
+
13
14
  def self.load_data_into_database(data_filename, debug=false)
14
15
  if get_filename_of_recently_loaded_file == data_filename
15
16
  puts "\tavoided reloading the same file! <#{data_filename}>"
16
17
  return
17
18
  end
19
+ start_time = Time.now
18
20
  puts "\tloading data into database <#{data_filename}>"
19
21
  @@loaded_filename = nil
20
22
  silence = '> /dev/null 2>&1'
@@ -36,6 +38,8 @@ module CartoCSSHelper
36
38
  end
37
39
  end
38
40
  @@loaded_filename = data_filename
41
+ time_in_seconds = Time.now - start_time
42
+ puts "\tloading lasted #{time_in_seconds.to_i}s"
39
43
  end
40
44
  end
41
45
 
@@ -11,14 +11,13 @@ module CartoCSSHelper
11
11
  return get_overpass_query_results_file_location(query, "download data for #{latitude} #{longitude} (#{size})")
12
12
  end
13
13
 
14
-
15
14
  def self.download_osm_data_for_location(latitude, longitude, size, accept_cache=true)
16
15
  filename = CartoCSSHelper::Configuration.get_path_to_folder_for_cache + "#{latitude} #{longitude} #{size}.osm"
17
16
  if File.exists?(filename)
18
17
  if accept_cache
19
18
  return filename
20
19
  end
21
- File.delete(filename)
20
+ delete_file(filename, 'query refusing to accept cache was used')
22
21
  end
23
22
  query = get_query_to_download_data_around_location(latitude, longitude, size)
24
23
  text = get_overpass_query_results(query, "download data for #{latitude} #{longitude} (#{size})")
@@ -38,7 +37,7 @@ module CartoCSSHelper
38
37
  query += "\n"
39
38
  query += "(node(#{bb});<;);"
40
39
  query += "\n"
41
- query += 'out meta;'
40
+ query += 'out;'
42
41
  query += "\n"
43
42
  query += '/*'
44
43
  query += "\nbbox size: #{size}"
@@ -134,7 +133,9 @@ module CartoCSSHelper
134
133
  def self.get_overpass_query_results(query, description, debug=false)
135
134
  cached = get_overpass_query_results_from_cache(query)
136
135
  if cached == ''
137
- raise OverpassRefusedResponse
136
+ if File.exists?(get_query_cache_refused_response_filename(query))
137
+ raise OverpassRefusedResponse
138
+ end
138
139
  end
139
140
  return cached unless cached == nil
140
141
 
@@ -148,6 +149,7 @@ module CartoCSSHelper
148
149
  begin
149
150
  cached = Downloader.run_overpass_query query, description
150
151
  rescue OverpassRefusedResponse
152
+ mark_query_as_refused(query)
151
153
  write_to_cache(query, '')
152
154
  raise OverpassRefusedResponse
153
155
  end
@@ -155,6 +157,16 @@ module CartoCSSHelper
155
157
  return cached
156
158
  end
157
159
 
160
+ def self.get_query_cache_refused_response_filename(query)
161
+ return get_query_cache_filename(query)+'_response_refused'
162
+ end
163
+
164
+ def self.mark_query_as_refused(query)
165
+ file = File.new(get_query_cache_refused_response_filename(query), 'w')
166
+ file.write ''
167
+ file.close
168
+ end
169
+
158
170
  def self.write_to_cache(query, response)
159
171
  file = File.new(get_query_cache_filename(query), 'w')
160
172
  file.write response
@@ -199,7 +211,7 @@ module CartoCSSHelper
199
211
  end
200
212
 
201
213
  def self.not_enough_free_space
202
- minimum_gb = 2
214
+ minimum_gb = 1
203
215
  return get_available_space_for_cache_in_gb < minimum_gb
204
216
  end
205
217
 
@@ -210,22 +222,30 @@ module CartoCSSHelper
210
222
 
211
223
  def self.attempt_cleanup
212
224
  if not_enough_free_space
213
- delete_large_overpass_caches
225
+ delete_large_overpass_caches 500
226
+ end
227
+ if not_enough_free_space
228
+ delete_large_overpass_caches 100
229
+ end
230
+ if not_enough_free_space
231
+ delete_large_overpass_caches 50
214
232
  end
215
233
  end
216
234
 
217
- def self.delete_file(file)
218
- open(CartoCSSHelper::Configuration.get_path_to_folder_for_cache+'log.txt', 'a') { |file|
219
- file.puts("deleting #{file}, #{File.size(file)/1024/1024}MB")
235
+ def self.delete_file(filename, reason)
236
+ open(CartoCSSHelper::Configuration.get_path_to_folder_for_output+'log.txt', 'a') { |file|
237
+ message = "deleting #{filename}, #{File.size(filename)/1024/1024}MB - #{reason}"
238
+ puts message
239
+ file.puts(message)
240
+ File.delete(filename)
220
241
  }
221
- File.delete(file)
222
242
  end
223
243
 
224
- def self.delete_large_overpass_caches
244
+ def self.delete_large_overpass_caches(threshold_in_MB)
225
245
  #todo - find library that deals with caches like this, bug here may be unfunny
226
246
  Dir.glob(CartoCSSHelper::Configuration.get_path_to_folder_for_overpass_cache+'*') {|file|
227
- if File.size(file) > (1024 * 1024 * 50)
228
- delete_file(file)
247
+ if File.size(file) > (1024 * 1024 * threshold_in_MB)
248
+ delete_file(file, "removing everpass cache entries larger than #{threshold_in_MB} MB to make free space on the disk")
229
249
  end
230
250
  }
231
251
  end
@@ -98,7 +98,7 @@ module CartoCSSHelper
98
98
  return tags
99
99
  end
100
100
 
101
- def get_generic_tag_value
101
+ def self.get_generic_tag_value
102
102
  return '*'
103
103
  end
104
104
 
@@ -87,7 +87,7 @@ module CartoCSSHelper
87
87
  def generate_image(lat, lon, debug)
88
88
  export_filename = self.get_filename
89
89
  bbox_size = self.get_bbox_size
90
- TilemillHandler.run_tilemill_export_image(lat, lon, @zlevel, bbox_size, 200, export_filename, debug)
90
+ TilemillHandler.run_tilemill_export_image(lat, lon, @zlevel, [bbox_size, bbox_size], 200, export_filename, debug)
91
91
  end
92
92
  end
93
93
  end
@@ -154,7 +154,6 @@ module CartoCSSHelper
154
154
  TagRenderingStatus.new('highway', 'platform', :primary),
155
155
  TagRenderingStatus.new('highway', 'primary', :primary),
156
156
  TagRenderingStatus.new('highway', 'primary_link', :primary),
157
- TagRenderingStatus.new('highway', 'proposed', :primary),
158
157
  TagRenderingStatus.new('highway', 'raceway', :primary),
159
158
  TagRenderingStatus.new('highway', 'residential', :primary),
160
159
  TagRenderingStatus.new('highway', 'rest_area', :primary),
@@ -104,7 +104,7 @@ module CartoCSSHelper
104
104
  [false, true].each { |on_water|
105
105
  [Configuration.get_max_z].each { |zlevel|
106
106
  ['area', 'closed_way', 'way', 'node'].each{ |type|
107
- if rendered_on_zlevel({key => value}, type, zlevel, on_water)
107
+ if CartoCSSHelper::Info.rendered_on_zlevel({key => value}, type, zlevel, on_water)
108
108
  if !is_key_rendered_and_value_ignored_set(key, value, type, zlevel, on_water)
109
109
  return false
110
110
  end
@@ -123,9 +123,9 @@ module CartoCSSHelper
123
123
 
124
124
  def is_rendered(key, value)
125
125
  [false, true].each { |on_water|
126
- [Configuration.get_max_z].each { |zlevel|
126
+ [Configuration.get_max_z].each { |zlevel| #TODO - note that some tags may be rendered up to X zoom level, but checking all zlevels would take too much time
127
127
  ['area', 'closed_way', 'way', 'node'].each{ |type|
128
- if rendered_on_zlevel({key => value}, type, zlevel, on_water)
128
+ if CartoCSSHelper::Info.rendered_on_zlevel({key => value}, type, zlevel, on_water)
129
129
  return true
130
130
  end
131
131
  }
@@ -142,8 +142,6 @@ module CartoCSSHelper
142
142
  return true
143
143
  end
144
144
 
145
- protected
146
-
147
145
  def how_rendered_as_composite(key, value, suggested_composite)
148
146
  [false, true].each { |on_water|
149
147
  [Configuration.get_max_z].each { |zlevel|
@@ -167,12 +165,14 @@ module CartoCSSHelper
167
165
  return nil
168
166
  end
169
167
 
170
- def rendered_on_zlevel(tags, type, zlevel, on_water)
168
+ def self.rendered_on_zlevel(tags, type, zlevel, on_water)
171
169
  empty = Scene.new({}, zlevel, on_water, type)
172
170
  tested = Scene.new(tags, zlevel, on_water, type)
173
171
  return tested.is_output_different(empty)
174
172
  end
175
173
 
174
+ protected
175
+
176
176
  def how_rendered_on_zlevel_as_composite(tags, type, zlevel, on_water, suggested_composite)
177
177
  if suggested_composite != nil
178
178
  if is_rendered_with_this_composite tags, type, suggested_composite, zlevel, on_water
@@ -11,11 +11,13 @@ module CartoCSSHelper
11
11
  if debug
12
12
  silence = ''
13
13
  end
14
+ latitude_bb_size = bbox_size[0]
15
+ longitude_bb_size = bbox_size[0]
14
16
  #--bbox=[xmin,ymin,xmax,ymax]
15
- xmin = lon-bbox_size/2
16
- ymin = lat-bbox_size/2
17
- xmax = lon+bbox_size/2
18
- ymax = lat+bbox_size/2
17
+ xmin = lon-longitude_bb_size/2
18
+ ymin = lat-latitude_bb_size/2
19
+ xmax = lon+longitude_bb_size/2
20
+ ymax = lat+latitude_bb_size/2
19
21
  bbox = "#{xmin},#{ymin},#{xmax},#{ymax}"
20
22
  params = "--format=png --width=#{image_size} --height=#{image_size} --static_zoom=#{zlevel} --bbox=\"#{bbox}\""
21
23
  project_name = CartoCSSHelper::Configuration.get_tilemill_project_name
@@ -1,4 +1,4 @@
1
- require 'RMagick'
1
+ require 'rmagick'
2
2
 
3
3
  module CartoCSSHelper
4
4
  class ImageForComparison
@@ -47,8 +47,8 @@ module CartoCSSHelper
47
47
  end
48
48
  end
49
49
 
50
- def self.add_job(filename, latitude, longitude, zlevels, header, new_branch, old_branch, download_bbox_size, image_size)
51
- print 'pool <- '
50
+ def self.add_job(filename, latitude, longitude, zlevels, header, new_branch, old_branch, download_bbox_size, image_size, prefix)
51
+ print prefix
52
52
  new_job = MapGenerationJob.new(filename, latitude, longitude, zlevels, header, new_branch, old_branch, download_bbox_size, image_size)
53
53
  new_job.print
54
54
 
@@ -79,8 +79,8 @@ module CartoCSSHelper
79
79
  @@jobs = []
80
80
  end
81
81
 
82
- def self.shuffle_jobs
83
- @@jobs.shuffle!
82
+ def self.shuffle_jobs(seed)
83
+ @@jobs.shuffle!(random: Random.new(seed))
84
84
  end
85
85
 
86
86
  def self.visualise_changes_synthethic_test(tags, type, on_water, zlevel_range, new_branch, old_branch)
@@ -143,17 +143,19 @@ module CartoCSSHelper
143
143
 
144
144
  def self.visualise_changes_on_real_data(tags, type, wanted_latitude, wanted_longitude, zlevels, new_branch, old_branch='master')
145
145
  #special support for following tag values: :any_value
146
- header = "#{ VisualDiff.dict_to_pretty_tag_list(tags) } #{type} #{ wanted_latitude } #{ wanted_longitude } #{zlevels}"
147
- puts "visualise_changes_on_real_data <#{header}> #{old_branch} -> #{new_branch}"
146
+ header_prefix = "#{ VisualDiff.dict_to_pretty_tag_list(tags) } #{type} [#{ wanted_latitude }, #{ wanted_longitude }] -> "
147
+ target_location = '[?, ?]'
148
+ header_sufix = " #{old_branch}->#{new_branch} #{zlevels}"
149
+ puts "visualise_changes_on_real_data <#{header_prefix}#{header_sufix}> #{old_branch} -> #{new_branch}"
148
150
  begin
149
151
  latitude, longitude = Downloader.locate_element_with_given_tags_and_type tags, type, wanted_latitude, wanted_longitude
152
+ target_location = "[#{latitude}, #{longitude}]"
150
153
  rescue Downloader::OverpassRefusedResponse
151
154
  puts 'No nearby instances of tags and tag is not extremely rare - no generation of nearby location and wordwide search was impossible. No diff image will be generated for this location.'
152
155
  return false
153
156
  end
154
- header = "#{ VisualDiff.dict_to_pretty_tag_list(tags) } #{type} #{ wanted_latitude } #{ wanted_longitude } #{zlevels}"
155
157
  download_bbox_size = 0.4
156
- visualise_changes_for_location(latitude, longitude, zlevels, header, new_branch, old_branch, download_bbox_size)
158
+ visualise_changes_for_location(latitude, longitude, zlevels, header_prefix+target_location+header_sufix, new_branch, old_branch, download_bbox_size)
157
159
  return true
158
160
  end
159
161
 
@@ -167,7 +169,7 @@ module CartoCSSHelper
167
169
  if @@job_pooling
168
170
  prefix = 'pool <- '
169
171
  end
170
- add_job(filename, latitude, longitude, zlevels, header, new_branch, old_branch, download_bbox_size, image_size)
172
+ add_job(filename, latitude, longitude, zlevels, header, new_branch, old_branch, download_bbox_size, image_size, prefix)
171
173
  if !@@job_pooling
172
174
  run_jobs
173
175
  end
@@ -187,27 +189,17 @@ module CartoCSSHelper
187
189
  return reference_value*rescaler
188
190
  end
189
191
 
190
- def self.collect_images_for_real_data_test(latitude, longitude, zlevels, source, wanted_image_size=400)
192
+ def self.get_render_bbox_size(zlevel, wanted_image_size, latitude)
193
+ longitude_equator_rendered_length_in_pixels = 256 * 2**zlevel
194
+ longitude_size = 360*wanted_image_size.to_f/longitude_equator_rendered_length_in_pixels
195
+ latitude_size = longitude_size * Math.cos(latitude*Math::PI/180)
196
+ return [latitude_size, longitude_size]
197
+ end
198
+
199
+ def self.collect_images_for_real_data_test(latitude, longitude, zlevels, source, image_size=400)
191
200
  collection = []
192
201
  zlevels.each { |zlevel|
193
- image_size_for_16_zoom_level = 1000
194
- image_size = (VisualDiff.scale zlevel, image_size_for_16_zoom_level, 16)
195
- mutiplier = 1000
196
- image_size = (image_size*mutiplier).to_int
197
- render_bbox_size = 0.015
198
- ratio = 1.0*image_size/(wanted_image_size*mutiplier)
199
- image_size /= ratio
200
- render_bbox_size /= ratio
201
- image_size /= mutiplier
202
- image_size = image_size.to_i
203
- if image_size!=wanted_image_size
204
- puts VisualDiff.scale zlevel, image_size_for_16_zoom_level, 16
205
- puts zlevel
206
- puts image_size
207
- puts wanted_image_size
208
- puts ratio
209
- raise "#{image_size} mismatches #{wanted_image_size}"
210
- end
202
+ render_bbox_size = VisualDiff.get_render_bbox_size(zlevel, image_size, latitude)
211
203
  cache_folder = CartoCSSHelper::Configuration.get_path_to_folder_for_branch_specific_cache
212
204
  filename = "#{cache_folder+"#{latitude} #{longitude} #{zlevel}zlevel #{image_size}px #{source.get_timestamp} #{source.download_bbox_size}.png"}"
213
205
  if !File.exists?(filename)
@@ -14,33 +14,41 @@ include CartoCSSHelper::Validator
14
14
  include CartoCSSHelper::Git
15
15
 
16
16
  module CartoCSSHelper
17
- def self.test_tag_on_real_data(tags, new_branch, old_branch, zlevels, types=['node', 'closed_way', 'way'])
17
+ def self.test_tag_on_real_data(tags, new_branch, old_branch, zlevels, types=['node', 'closed_way', 'way'], min = 4, skip = 0)
18
18
  types.each {|type|
19
- test_tag_on_real_data_for_this_type(tags, new_branch, old_branch, zlevels, type)
19
+ test_tag_on_real_data_for_this_type(tags, new_branch, old_branch, zlevels, type, min, skip)
20
20
  }
21
21
  end
22
22
 
23
- def self.test_tag_on_real_data_for_this_type(tags, new_branch, old_branch, zlevels, type)
24
- min = 6
23
+ def self.test_tag_on_real_data_for_this_type(tags, new_branch, old_branch, zlevels, type, min = 4, skip = 0)
24
+ if type.kind_of?(Array)
25
+ type = type[0]
26
+ end
25
27
  generated = 0
26
28
 
27
29
  n = 0
28
30
  max_n = get_maxn_for_nth_location
31
+ max_n -= skip
32
+ skip_string = ''
33
+ if skip > 0
34
+ skip_string = " (#{skip} locations skipped)"
35
+ end
29
36
  while generated < min
30
- location = get_nth_location(n)
37
+ location = get_nth_location(n + skip)
31
38
  generated +=1 if CartoCSSHelper::VisualDiff.visualise_changes_on_real_data(tags, type, location[0], location[1], zlevels, new_branch, old_branch)
32
39
  n+=1
33
40
  if n > max_n
34
41
  return
35
42
  end
43
+ puts "#{n}/#{max_n} locations checked #{skip_string}. #{generated}/#{min} testing location found"
36
44
  end
37
45
  end
38
46
 
39
- def get_maxn_for_nth_location
47
+ def self.get_maxn_for_nth_location
40
48
  return get_list_of_testing_locations.length-1
41
49
  end
42
50
 
43
- def get_nth_location(n)
51
+ def self.get_nth_location(n)
44
52
  return get_list_of_testing_locations[n]
45
53
  end
46
54
 
@@ -70,29 +78,40 @@ module CartoCSSHelper
70
78
  }
71
79
  end
72
80
 
73
- def visualise_place_by_url(url, zlevels, new_branch, old_branch='master', header=nil, download_bbox_size=0.04, image_size = 350)
74
- raise "#{url} is not a string" unless old_branch.class == String
75
- raise "#{zlevels} is not a range" unless zlevels.class == Range
76
- raise "#{new_branch} is not a string" unless new_branch.class == String
77
- raise "#{old_branch} is not a string" unless old_branch.class == String
78
- raise "#{header} is not a string" unless header.class == String
79
- raise "#{download_bbox_size} is not a number" unless download_bbox_size.kind_of? Numeric
80
- raise "#{image_size} is not a integer" unless image_size.kind_of? Integer
81
+ def self.get_latitude_longitude_from_url(url)
82
+ if(url.scan(/[\/]((-|)\d+(\.\d+))/)).length >= 2
83
+ latitude = url.scan(/[\/]((-|)\d+(\.\d+))/)[0][0].to_f
84
+ longitude = url.scan(/[\/]((-|)\d+(\.\d+))/)[1][0].to_f
85
+ return latitude, longitude
86
+ end
87
+ latitude = url.scan(/[\/=]((-|)\d+(\.\d+))/)[0][0].to_f
88
+ longitude = url.scan(/[\/=]((-|)\d+(\.\d+))/)[1][0].to_f
89
+ return latitude, longitude
90
+ end
81
91
 
82
- latitude = url.scan(/\/((-|)\d+(\.\d+))/)[0][0].to_f
83
- longitude = url.scan(/\/((-|)\d+(\.\d+))/)[1][0].to_f
92
+ def self.visualise_place_by_url(url, zlevels, new_branch, old_branch='master', header=nil, download_bbox_size=0.04, image_size = 350)
84
93
  if header == nil
85
94
  header = url
86
95
  end
96
+
97
+ raise "#{url} is not a string, it is #{url.class}" unless url.class == String
98
+ raise "#{zlevels} is not a range, it is #{zlevels.class}" unless zlevels.class == Range
99
+ raise "#{new_branch} is not a string, it is #{new_branch.class}" unless new_branch.class == String
100
+ raise "#{old_branch} is not a string, it is #{old_branch.class}" unless old_branch.class == String
101
+ raise "#{header} is not a string, it is #{header.class}" unless header.class == String
102
+ raise "#{download_bbox_size} is not a number" unless download_bbox_size.kind_of? Numeric
103
+ raise "#{image_size} is not a integer" unless image_size.kind_of? Integer
104
+
105
+ latitude, longitude = get_latitude_longitude_from_url(url)
87
106
  header += ' ' + old_branch + '->' + new_branch + ' ' + zlevels.to_s + ' '+ image_size.to_s + 'px'
88
107
  CartoCSSHelper::VisualDiff.visualise_changes_for_location(latitude, longitude, zlevels, header, new_branch, old_branch, download_bbox_size, image_size)
89
108
  end
90
109
 
91
- def get_place_of_storage_of_resource_under_url(url)
110
+ def self.get_place_of_storage_of_resource_under_url(url)
92
111
  return CartoCSSHelper::Configuration.get_path_to_folder_for_overpass_cache + '.manual.cache' + FileHelper::make_string_usable_as_filename(url)
93
112
  end
94
113
 
95
- def download_remote_file(url)
114
+ def self.download_remote_file(url)
96
115
  filename = get_place_of_storage_of_resource_under_url(url)
97
116
  if !File.exists?(filename)
98
117
  begin
@@ -109,13 +128,13 @@ module CartoCSSHelper
109
128
  end
110
129
  end
111
130
 
112
- def visualise_place_by_remote_file(url, latitude, longitude, zlevels, new_branch, old_branch='master', header=nil, bb=0.04, image_size = 350)
131
+ def self.visualise_place_by_remote_file(url, latitude, longitude, zlevels, new_branch, old_branch='master', header=nil, bb=0.04, image_size = 350)
113
132
  download_remote_file(url)
114
133
  filename = get_place_of_storage_of_resource_under_url(url)
115
134
  visualise_place_by_file(filename, latitude, longitude, zlevels, new_branch, old_branch, header, bb, image_size)
116
135
  end
117
136
 
118
- def visualise_place_by_file(filename, latitude, longitude, zlevels, new_branch, old_branch='master', header=nil, bb=0.04, image_size = 350)
137
+ def self.visualise_place_by_file(filename, latitude, longitude, zlevels, new_branch, old_branch='master', header=nil, bb=0.04, image_size = 350)
119
138
  raise "#{filename} does not exists" unless File.exists?(filename)
120
139
  raise "#{latitude} is not a number" unless latitude.kind_of? Numeric
121
140
  raise "#{longitude} is not a number" unless longitude.kind_of? Numeric
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cartocss_helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-07-16 00:00:00.000000000 Z
12
+ date: 2015-07-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 1.7.3
21
+ version: 1.8.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: 1.7.3
29
+ version: 1.8.0
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: sys-filesystem
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - ~>
52
52
  - !ruby/object:Gem::Version
53
- version: 2.13.4
53
+ version: 2.15.2
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,7 +58,7 @@ dependencies:
58
58
  requirements:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: 2.13.4
61
+ version: 2.15.2
62
62
  description: Tool to make development of CartoCSS styles more efficient. Automates
63
63
  actions necessary to produce test images and validates style. Loading data using
64
64
  osm2pgsql, rendering with TileMill, obtaining test data from overpass turbo.