Class: UsdaNutrientDatabase::Import::Downloader

Inherits:
Object
  • Object
show all
Defined in:
lib/usda_nutrient_database/import/downloader.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(directory = 'tmp/usda', version = UsdaNutrientDatabase.usda_version) ⇒ Downloader

Returns a new instance of Downloader.



9
10
11
12
# File 'lib/usda_nutrient_database/import/downloader.rb', line 9

def initialize(directory = 'tmp/usda', version = UsdaNutrientDatabase.usda_version)
  @directory = directory
  @version = version
end

Instance Attribute Details

#directoryObject (readonly)

Returns the value of attribute directory.



7
8
9
# File 'lib/usda_nutrient_database/import/downloader.rb', line 7

def directory
  @directory
end

#versionObject (readonly)

Returns the value of attribute version.



7
8
9
# File 'lib/usda_nutrient_database/import/downloader.rb', line 7

def version
  @version
end

Instance Method Details

#cleanupObject



14
15
16
17
# File 'lib/usda_nutrient_database/import/downloader.rb', line 14

def cleanup
  UsdaNutrientDatabase.log 'Cleaning up data'
  FileUtils.rm_rf(directory)
end

#connectionObject



57
58
59
# File 'lib/usda_nutrient_database/import/downloader.rb', line 57

def connection
  @connection ||= Faraday.new(url: 'https://www.ars.usda.gov')
end

#downloadObject



36
37
38
39
40
41
42
43
44
# File 'lib/usda_nutrient_database/import/downloader.rb', line 36

def download
  UsdaNutrientDatabase.log "Downloading USDA data version: #{version}"
  unless File.directory?(directory)
    FileUtils.mkdir_p("#{directory}/#{version}")
  end
  File.open("#{directory}/#{version}.zip", 'w+b') do |file|
    file.write connection.get(final_path).body
  end
end

#download_and_unzipObject



19
20
21
# File 'lib/usda_nutrient_database/import/downloader.rb', line 19

def download_and_unzip
  download and unzip
end

#final_pathObject



61
62
63
64
65
66
67
68
69
# File 'lib/usda_nutrient_database/import/downloader.rb', line 61

def final_path
  look_ahead = connection.head(path)
  if look_ahead.status == 302
    raise 'No location' unless look_ahead.headers['location']
    URI.parse(look_ahead.headers['location']).path
  else
    path
  end
end

#pathObject



23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/usda_nutrient_database/import/downloader.rb', line 23

def path
  [
    'SP2UserFiles',
    'Place',
    '12354500',
    'Data',
    version == 'sr28' ? 'SR' : nil,
    version.upcase,
    'dnload',
    "#{version_file}.zip"
  ].compact.join('/')
end

#unzipObject



46
47
48
49
50
51
52
53
54
55
# File 'lib/usda_nutrient_database/import/downloader.rb', line 46

def unzip
  UsdaNutrientDatabase.log 'Unzipping data'
  Zip::File.open("#{directory}/#{version}.zip") do |zipfile|
    zipfile.each do |file|
      unless File.exist?("#{directory}/#{version}/#{file.name}")
        zipfile.extract(file, "#{directory}/#{version}/#{file.name}")
      end
    end
  end
end

#version_fileObject



71
72
73
74
75
76
77
78
79
80
# File 'lib/usda_nutrient_database/import/downloader.rb', line 71

def version_file
  case @version
  when 'sr27'
    'sr27asc'
  when 'sr28'
    'sr28asc'
  else
    @version
  end
end