earth 0.11.17 → 0.11.18

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,4 +1,10 @@
1
- 0.11.7 / 2012-04-17
1
+ 0.11.18 / 2012-04-20
2
+
3
+ * Bug fixes
4
+
5
+ * Replace col :foo, :index => true with col :foo; add_index :foo to match new active_record_inline_schema requirement
6
+
7
+ 0.11.17 / 2012-04-17
2
8
 
3
9
  * Breaking changes
4
10
 
@@ -13,13 +13,7 @@ Gem::Specification.new do |s|
13
13
  s.files = `git ls-files`.split("\n")
14
14
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
15
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
- s.extra_rdoc_files = [
17
- "LICENSE",
18
- "LICENSE-PREAMBLE",
19
- "README.markdown"
20
- ]
21
- s.require_paths = ["lib"]
22
-
16
+
23
17
  s.require_paths = ["lib"]
24
18
 
25
19
  s.add_runtime_dependency 'activerecord'
@@ -8,7 +8,7 @@ CommercialBuildingEnergyConsumptionSurveyResponse.class_eval do
8
8
  key 'id', :field_name => 'PUBID8'
9
9
  store 'census_region_number', :field_name => 'REGION8'
10
10
  store 'census_division_number', :field_name => 'CENDIV8'
11
- store 'climate_zone_number', :synthesize => Proc.new { |row| row['CLIMATE8'].to_i == 7 ? nil : row['CLIMATE8'].to_i }
11
+ store 'climate_zone_number', :synthesize => proc { |row| row['CLIMATE8'].to_i == 7 ? nil : row['CLIMATE8'].to_i }
12
12
  store 'area', :field_name => 'SQFT8', :from_units => :square_feet, :to_units => :square_metres
13
13
  store 'principal_activity', :field_name => 'PBA8', :dictionary => { :input => 'principal_activity_code', :output => 'principal_activity', :url => 'https://docs.google.com/spreadsheet/pub?key=0AoQJbWqPrREqdHRGVHczYXRoU2dFLV90aDdET0dQLUE&single=true&gid=2&output=csv' }
14
14
  store 'floors', :field_name => 'NFLOOR8', :dictionary => { :input => 'floors_code', :output => 'floors', :url => 'https://docs.google.com/spreadsheet/pub?key=0AoQJbWqPrREqdHRGVHczYXRoU2dFLV90aDdET0dQLUE&single=true&gid=0&output=csv' }
@@ -29,9 +29,9 @@ CommercialBuildingEnergyConsumptionSurveyResponse.class_eval do
29
29
  store 'first_activity', :field_name => 'ACT18', :dictionary => { :input => 'activity_code', :output => 'activity', :url => 'https://docs.google.com/spreadsheet/pub?&key=0AoQJbWqPrREqdHRGVHczYXRoU2dFLV90aDdET0dQLUE&single=true&gid=4&output=csv' }
30
30
  store 'second_activity', :field_name => 'ACT28', :dictionary => { :input => 'activity_code', :output => 'activity', :url => 'https://docs.google.com/spreadsheet/pub?&key=0AoQJbWqPrREqdHRGVHczYXRoU2dFLV90aDdET0dQLUE&single=true&gid=4&output=csv' }
31
31
  store 'third_activity', :field_name => 'ACT38', :dictionary => { :input => 'activity_code', :output => 'activity', :url => 'https://docs.google.com/spreadsheet/pub?&key=0AoQJbWqPrREqdHRGVHczYXRoU2dFLV90aDdET0dQLUE&single=true&gid=4&output=csv' }
32
- store 'first_activity_share', :synthesize => Proc.new { |row| row['ACT1PCT8'].blank? ? nil : row['ACT1PCT8'].to_f / 100.0 }
33
- store 'second_activity_share', :synthesize => Proc.new { |row| row['ACT2PCT8'].blank? ? nil : row['ACT2PCT8'].to_f / 100.0 }
34
- store 'third_activity_share', :synthesize => Proc.new { |row| row['ACT3PCT8'].blank? ? nil : row['ACT3PCT8'].to_f / 100.0 }
32
+ store 'first_activity_share', :synthesize => proc { |row| row['ACT1PCT8'].blank? ? nil : row['ACT1PCT8'].to_f / 100.0 }
33
+ store 'second_activity_share', :synthesize => proc { |row| row['ACT2PCT8'].blank? ? nil : row['ACT2PCT8'].to_f / 100.0 }
34
+ store 'third_activity_share', :synthesize => proc { |row| row['ACT3PCT8'].blank? ? nil : row['ACT3PCT8'].to_f / 100.0 }
35
35
  store 'lodging_rooms', :field_name => 'LODGRM8'
36
36
  end
37
37
 
@@ -40,7 +40,7 @@ CommercialBuildingEnergyConsumptionSurveyResponse.class_eval do
40
40
  :skip => 1,
41
41
  :headers => ["PUBID8","REGION8","CENDIV8","SQFT8","SQFTC8","YRCONC8","PBA8","ELUSED8","NGUSED8","FKUSED8","PRUSED8","STUSED8","HWUSED8","HEATP8","HTLS508","FURNAC8","BOILER8","PKGHT8","SLFCON8","HTPMPH8","STHW8","OTHTEQ8","FURNP8","BOILP8","PKGHP8","SLFCNP8","HTPHP8","STHWP8","OTHTP8","MAINHT8","PKGHPS8","SPLHPS8","RMHPS8","AIRHPT8","GRDHPT8","WTRHPT8","NWMNHT8","RDHTNF8","HWRDHT8","COOLP8","PKGCL8","RCAC8","ACWNWL8","HTPMPC8","CHWT8","CHILLR8","EVAPCL8","OTCLEQ8","PKGCP8","RCACP8","ACWNWP8","HTPCP8","CHWTP8","CHILP8","EVAPP8","OTCLP8","MAINCL8","PKGCPS8","SPLCPS8","RMCPS8","AIRCPT8","GRDCPT8","WTRCPT8","NWMNCL8","RDCLNF8","HWRDCL8","VAV8","ECN8","MAINT8","EMCS8","ADJWT8","STRATUM8","PAIR8"] do
42
42
  key 'id', :field_name => 'PUBID8'
43
- store 'percent_cooled', :synthesize => Proc.new { |row| row['COOLP8'].to_f / 100.0 }
43
+ store 'percent_cooled', :synthesize => proc { |row| row['COOLP8'].to_f / 100.0 }
44
44
  end
45
45
 
46
46
  import 'electricity use from the 2003 EIA CBECS',
@@ -50,7 +50,7 @@ CommercialBuildingEnergyConsumptionSurveyResponse.class_eval do
50
50
  key 'id', :field_name => 'PUBID8'
51
51
  store 'heating_degree_days', :field_name => 'HDD658', :from_units => :degrees_fahrenheit, :to_units => :degrees_celsius
52
52
  store 'cooling_degree_days', :field_name => 'CDD658', :from_units => :degrees_fahrenheit, :to_units => :degrees_celsius
53
- store 'electricity_use', :synthesize => Proc.new { |row| row['ELCNS8'].to_i }, :units => :kilowatt_hours
53
+ store 'electricity_use', :synthesize => proc { |row| row['ELCNS8'].to_i }, :units => :kilowatt_hours
54
54
  store 'electricity_energy', :field_name => 'ELBTU8', :from_units => :kbtus, :to_units => :megajoules
55
55
  end
56
56
 
@@ -3,11 +3,14 @@ require 'earth/locality'
3
3
  class CbecsEnergyIntensity < ActiveRecord::Base
4
4
  self.primary_key = "name"
5
5
 
6
- col :name, :index => true
6
+ col :name
7
7
  col :principal_building_activity
8
- col :naics_code, :index => true
9
- col :census_region_number, :type => :integer, :index => true
10
- col :census_division_number, :type => :integer, :index => true
8
+ col :naics_code
9
+ col :census_region_number, :type => :integer
10
+ col :census_division_number, :type => :integer
11
+ add_index :naics_code
12
+ add_index :census_region_number
13
+ add_index :census_division_number
11
14
 
12
15
  col :electricity, :type => :float
13
16
  col :electricity_units
@@ -176,25 +176,25 @@ CbecsEnergyIntensity.class_eval do
176
176
  import "2003 CBECS #{table.upcase} - Electricity Consumption and Intensity - #{division}",
177
177
  :url => "http://www.eia.gov/emeu/cbecs/cbecs2003/detailed_tables_2003/2003set#{CbecsEnergyIntensity::FUELS[energy_source][:set]}/2003excel/#{table}.xls",
178
178
  :headers => false,
179
- :select => Proc.new { |row| CbecsEnergyIntensity::NAICS_CODE_SYNTHESIZER.call(row) }, # only select rows where we can translate activity to a NAICS code
179
+ :select => proc { |row| CbecsEnergyIntensity::NAICS_CODE_SYNTHESIZER.call(row) }, # only select rows where we can translate activity to a NAICS code
180
180
  :crop => (21..37) do
181
- key :name, :synthesize => Proc.new { |row|
181
+ key :name, :synthesize => proc { |row|
182
182
  "#{Industry.format_naics_code(CbecsEnergyIntensity::NAICS_CODE_SYNTHESIZER.call(row))}-#{region_number}-#{division_data[:census_division]}"
183
183
  }
184
184
 
185
- store :principal_building_activity, :synthesize => Proc.new { |row| row[0].gsub(/[\.\(\)]/,'').strip }
185
+ store :principal_building_activity, :synthesize => proc { |row| row[0].gsub(/[\.\(\)]/,'').strip }
186
186
  store :naics_code, :synthesize => CbecsEnergyIntensity::NAICS_CODE_SYNTHESIZER
187
187
  store :census_region_number, :static => region_number
188
188
  store :census_division_number, :static => division_data[:census_division]
189
189
 
190
190
  fuel_data = CbecsEnergyIntensity::FUELS[energy_source]
191
- store energy_source, :units => :megajoules, :synthesize => Proc.new { |row|
191
+ store energy_source, :units => :megajoules, :synthesize => proc { |row|
192
192
  Earth::EIA.convert_value(row[division_data[:column] + 1], :from => fuel_data[:consumption], :to => :megajoules)
193
193
  }
194
- store "#{energy_source}_floorspace", :units => :square_metres, :synthesize => Proc.new { |row|
194
+ store "#{energy_source}_floorspace", :units => :square_metres, :synthesize => proc { |row|
195
195
  Earth::EIA.convert_value(row[division_data[:column] + 4], :from => :million_square_feet, :to => :square_metres)
196
196
  }
197
- store "#{energy_source}_intensity", :units => :megajoules_per_square_metre, :synthesize => Proc.new { |row|
197
+ store "#{energy_source}_intensity", :units => :megajoules_per_square_metre, :synthesize => proc { |row|
198
198
  Earth::EIA.convert_value(row[division_data[:column] + 7], :from => fuel_data[:intensity], :to => :megajoules_per_square_metre)
199
199
  }
200
200
  end
@@ -208,26 +208,26 @@ CbecsEnergyIntensity.class_eval do
208
208
  CbecsEnergyIntensity::CBECS[:regions].each do |region, region_data|
209
209
  import "2003 CBECS #{table.upcase} - #{energy_source.to_s.titleize} Consumption and Intensity - #{region.capitalize} Region",
210
210
  :url => "http://www.eia.gov/emeu/cbecs/cbecs2003/detailed_tables_2003/2003set#{CbecsEnergyIntensity::FUELS[energy_source][:set]}/2003excel/#{table}.xls",
211
- :select => Proc.new { |row| CbecsEnergyIntensity::NAICS_CODE_SYNTHESIZER.call(row) }, # only select rows where we can translate activity to a NAICS code
211
+ :select => proc { |row| CbecsEnergyIntensity::NAICS_CODE_SYNTHESIZER.call(row) }, # only select rows where we can translate activity to a NAICS code
212
212
  :headers => false,
213
213
  :crop => (energy_source == :fuel_oil ? (16..19) : (21..37)) do
214
214
 
215
- key :name, :synthesize => Proc.new { |row|
215
+ key :name, :synthesize => proc { |row|
216
216
  "#{Industry.format_naics_code(CbecsEnergyIntensity::NAICS_CODE_SYNTHESIZER.call(row))}-#{region_data[:census_region]}"
217
217
  }
218
218
 
219
219
  store :census_region_number, :static => region_data[:census_region]
220
- store :principal_building_activity, :synthesize => Proc.new { |row| row[0].gsub(/[\.\(\)]/,'').strip }
220
+ store :principal_building_activity, :synthesize => proc { |row| row[0].gsub(/[\.\(\)]/,'').strip }
221
221
  store :naics_code, :synthesize => CbecsEnergyIntensity::NAICS_CODE_SYNTHESIZER
222
222
 
223
- store energy_source, :units => :megajoules, :synthesize => Proc.new { |row|
223
+ store energy_source, :units => :megajoules, :synthesize => proc { |row|
224
224
  Earth::EIA.convert_value(row[region_data[:column]], :from => CbecsEnergyIntensity::FUELS[energy_source][:consumption],
225
225
  :to => :megajoules)
226
226
  }
227
- store "#{energy_source}_floorspace", :units => :square_metres, :synthesize => Proc.new { |row|
227
+ store "#{energy_source}_floorspace", :units => :square_metres, :synthesize => proc { |row|
228
228
  Earth::EIA.convert_value(row[region_data[:column] + 4], :from => :million_square_feet, :to => :square_metres)
229
229
  }
230
- store "#{energy_source}_intensity", :units => :megajoules_per_square_metre, :synthesize => Proc.new { |row|
230
+ store "#{energy_source}_intensity", :units => :megajoules_per_square_metre, :synthesize => proc { |row|
231
231
  Earth::EIA.convert_value(row[region_data[:column] + 8], :from => CbecsEnergyIntensity::FUELS[energy_source][:intensity],
232
232
  :to => :megajoules_per_square_metre)
233
233
  }
@@ -239,16 +239,16 @@ CbecsEnergyIntensity.class_eval do
239
239
  import "2003 CBECS C1 - District Heat Consumption and Intensity - US Total",
240
240
  :url => "http://www.eia.gov/emeu/cbecs/cbecs2003/detailed_tables_2003/2003set9/2003excel/c1.xls",
241
241
  :headers => false,
242
- :select => Proc.new { |row| CbecsEnergyIntensity::NAICS_CODE_SYNTHESIZER.call(row) }, # only select rows where we can translate activity to a NAICS code
242
+ :select => proc { |row| CbecsEnergyIntensity::NAICS_CODE_SYNTHESIZER.call(row) }, # only select rows where we can translate activity to a NAICS code
243
243
  :crop => (21..37) do
244
- key :name, :synthesize => Proc.new { |row|
244
+ key :name, :synthesize => proc { |row|
245
245
  Industry.format_naics_code(CbecsEnergyIntensity::NAICS_CODE_SYNTHESIZER.call(row))
246
246
  }
247
- store :principal_building_activity, :synthesize => Proc.new { |row| row[0].gsub(/[\.\(\)]/,'').strip }
247
+ store :principal_building_activity, :synthesize => proc { |row| row[0].gsub(/[\.\(\)]/,'').strip }
248
248
  store :naics_code, :synthesize => CbecsEnergyIntensity::NAICS_CODE_SYNTHESIZER
249
249
 
250
250
  {:electricity => [4,5], :natural_gas => [6], :fuel_oil => [7], :district_heat => [8]}.each do |energy_source, columns|
251
- store energy_source, :units => :megajoules, :synthesize => Proc.new { |row|
251
+ store energy_source, :units => :megajoules, :synthesize => proc { |row|
252
252
  total_energy = nil
253
253
  columns.each do |column|
254
254
  value = Earth::EIA.convert_value(row[column], :from => :trillion_btus, :to => :megajoules)
@@ -259,10 +259,10 @@ CbecsEnergyIntensity.class_eval do
259
259
  end
260
260
  total_energy
261
261
  }
262
- store "#{energy_source}_floorspace", :units => :square_metres, :synthesize => Proc.new { |row|
262
+ store "#{energy_source}_floorspace", :units => :square_metres, :synthesize => proc { |row|
263
263
  Earth::EIA.convert_value(row[2], :from => :million_square_feet, :to => :square_metres)
264
264
  }
265
- store "#{energy_source}_intensity", :units => :megajoules_per_square_metre, :synthesize => Proc.new { |row|
265
+ store "#{energy_source}_intensity", :units => :megajoules_per_square_metre, :synthesize => proc { |row|
266
266
  total_energy = nil
267
267
  columns.each do |column|
268
268
  value = Earth::EIA.convert_value(row[column])
@@ -31,34 +31,34 @@ MecsEnergy.class_eval do
31
31
  :url => "http://205.254.135.24/emeu/mecs/mecs2006/excel/Table3_2.xls",
32
32
  :crop => data[:crop],
33
33
  :headers => ["NAICS Code", "Subsector and Industry", "Total", "BLANK", "Net Electricity", "BLANK", "Residual Fuel Oil", "Distillate Fuel Oil", "Natural Gas", "BLANK", "LPG and NGL", "BLANK", "Coal", "Coke and Breeze", "Other"]) do
34
- key :name, :synthesize => Proc.new { |row| "#{Industry.format_naics_code(row['NAICS Code'])}-#{data[:code]}" }
34
+ key :name, :synthesize => proc { |row| "#{Industry.format_naics_code(row['NAICS Code'])}-#{data[:code]}" }
35
35
  store :census_region_number, :static => data[:code]
36
36
  store :naics_code, :field_name => 'NAICS Code'
37
- store :energy, :units => :megajoules, :synthesize => Proc.new { |row|
37
+ store :energy, :units => :megajoules, :synthesize => proc { |row|
38
38
  Earth::EIA.convert_value(row['Total'], :from => :trillion_btus, :to => :megajoules)
39
39
  }
40
- store :electricity, :units => :megajoules, :synthesize => Proc.new { |row|
40
+ store :electricity, :units => :megajoules, :synthesize => proc { |row|
41
41
  Earth::EIA.convert_value(row['Net Electricity'], :from => :trillion_btus, :to => :megajoules)
42
42
  }
43
- store :residual_fuel_oil, :units => :megajoules, :synthesize => Proc.new { |row|
43
+ store :residual_fuel_oil, :units => :megajoules, :synthesize => proc { |row|
44
44
  Earth::EIA.convert_value(row['Residual Fuel Oil'], :from => :trillion_btus, :to => :megajoules)
45
45
  }
46
- store :distillate_fuel_oil, :units => :megajoules, :synthesize => Proc.new { |row|
46
+ store :distillate_fuel_oil, :units => :megajoules, :synthesize => proc { |row|
47
47
  Earth::EIA.convert_value(row['Distillate Fuel Oil'], :from => :trillion_btus, :to => :megajoules)
48
48
  }
49
- store :natural_gas, :units => :megajoules, :synthesize => Proc.new { |row|
49
+ store :natural_gas, :units => :megajoules, :synthesize => proc { |row|
50
50
  Earth::EIA.convert_value(row['Natural Gas'], :from => :trillion_btus, :to => :megajoules)
51
51
  }
52
- store :lpg_and_ngl, :units => :megajoules, :synthesize => Proc.new { |row|
52
+ store :lpg_and_ngl, :units => :megajoules, :synthesize => proc { |row|
53
53
  Earth::EIA.convert_value(row['LPG and NGL'], :from => :trillion_btus, :to => :megajoules)
54
54
  }
55
- store :coal, :units => :megajoules, :synthesize => Proc.new { |row|
55
+ store :coal, :units => :megajoules, :synthesize => proc { |row|
56
56
  Earth::EIA.convert_value(row['Coal'], :from => :trillion_btus, :to => :megajoules)
57
57
  }
58
- store :coke_and_breeze, :units => :megajoules, :synthesize => Proc.new { |row|
58
+ store :coke_and_breeze, :units => :megajoules, :synthesize => proc { |row|
59
59
  Earth::EIA.convert_value(row['Coke and Breeze'], :from => :trillion_btus, :to => :megajoules)
60
60
  }
61
- store :other_fuel, :units => :megajoules, :synthesize => Proc.new { |row|
61
+ store :other_fuel, :units => :megajoules, :synthesize => proc { |row|
62
62
  Earth::EIA.convert_value(row['Other'], :from => :trillion_btus, :to => :megajoules)
63
63
  }
64
64
  end
@@ -31,10 +31,10 @@ MecsRatio.class_eval do
31
31
  :url => "http://205.254.135.24/emeu/mecs/mecs2006/excel/Table6_1.xls",
32
32
  :crop => data[:crop],
33
33
  :headers => ["NAICS Code", "Subsector and Industry", "Consumption per Employee", "Consumption per Dollar of Value Added", "Consumption per Dollar of Value of Shipments"]) do
34
- key :name, :synthesize => Proc.new { |row| "#{Industry.format_naics_code(row["NAICS Code"])}-#{data[:code]}" }
34
+ key :name, :synthesize => proc { |row| "#{Industry.format_naics_code(row["NAICS Code"])}-#{data[:code]}" }
35
35
  store :census_region_number, :static => data[:code]
36
- store :naics_code, :synthesize => Proc.new { |row| Industry.format_naics_code row["NAICS Code"] }
37
- store :energy_per_dollar_of_shipments, :units => :megajoules, :synthesize => Proc.new { |row|
36
+ store :naics_code, :synthesize => proc { |row| Industry.format_naics_code row["NAICS Code"] }
37
+ store :energy_per_dollar_of_shipments, :units => :megajoules, :synthesize => proc { |row|
38
38
  Earth::EIA.convert_value(row['Consumption per Dollar of Value of Shipments'], :from => :kbtus, :to => :megajoules)
39
39
  }
40
40
  end
@@ -6,7 +6,7 @@ CensusDivision.class_eval do
6
6
  :url => 'http://www.census.gov/popest/about/geo/state_geocodes_v2009.txt',
7
7
  :skip => 6,
8
8
  :headers => %w{ Region Division FIPS Name },
9
- :select => ::Proc.new { |row| row['Division'].to_i > 0 and row['FIPS'].to_i == 0 }) do
9
+ :select => proc { |row| row['Division'].to_i > 0 and row['FIPS'].to_i == 0 }) do
10
10
  key 'number', :field_name => 'Division'
11
11
  store 'name', :field_name => 'Name'
12
12
  store 'census_region_number', :field_name => 'Region'
@@ -20,7 +20,7 @@ Country.class_eval do
20
20
 
21
21
  import "heating and cooling degree day data from WRI CAIT",
22
22
  :url => 'https://docs.google.com/spreadsheet/pub?key=0AoQJbWqPrREqdDN4MkRTSWtWRjdfazhRdWllTkVSMkE&output=csv',
23
- :select => Proc.new { |record| record['country'] != 'European Union (27)' },
23
+ :select => proc { |record| record['country'] != 'European Union (27)' },
24
24
  :errata => { :url => "file://#{Earth::ERRATA_DIR}/country/wri_errata.csv" } do
25
25
  key 'name', :field_name => 'country'
26
26
  store 'heating_degree_days', :units => :degrees_celsius
@@ -27,7 +27,7 @@ module Earth
27
27
  def self.insert_ignore(args = {})
28
28
  dest_cols = args[:cols].values
29
29
  dest_primary_key = args[:dest].primary_key.to_sym
30
- dest_primary_key_in_src = args[:cols].key(dest_primary_key)
30
+ dest_primary_key_in_src = args[:cols].detect { |k, _| k == dest_primary_key }
31
31
 
32
32
  sql_items = {}
33
33
  args[:cols].each do |src_col, dest_col|
@@ -1,3 +1,3 @@
1
1
  module Earth
2
- VERSION = "0.11.17"
2
+ VERSION = "0.11.18"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: earth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.17
4
+ version: 0.11.18
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-04-17 00:00:00.000000000 Z
14
+ date: 2012-04-20 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activerecord
@@ -406,10 +406,7 @@ email:
406
406
  executables:
407
407
  - earth_tester.rb
408
408
  extensions: []
409
- extra_rdoc_files:
410
- - LICENSE
411
- - LICENSE-PREAMBLE
412
- - README.markdown
409
+ extra_rdoc_files: []
413
410
  files:
414
411
  - .gitignore
415
412
  - CHANGELOG