Module: ShasumDemo

Included in:
DiscreteMathTopics::PreliminaryMath
Defined in:
lib/modules/topics/demos/shasum_demo.rb

Class Method Summary collapse

Class Method Details

.get_checksum_for_gem(gem_name, gem_version) ⇒ Object



26
27
28
29
30
31
32
33
# File 'lib/modules/topics/demos/shasum_demo.rb', line 26

def self.get_checksum_for_gem(gem_name, gem_version)
  puts "\nObtaining actual checksum SHA 256 for #{gem_name} gem version #{gem_version}"
  raw = RestClient::Request.execute(
      method: :get,
      url: "https://rubygems.org/downloads/#{gem_name}-#{gem_version}.gem",
      raw_response: true)
  Digest::SHA256.file(raw.file.path).hexdigest
end

.is_gem?(gem_name, gem_version) ⇒ Boolean



14
15
16
17
18
19
20
21
22
23
24
# File 'lib/modules/topics/demos/shasum_demo.rb', line 14

def self.is_gem?(gem_name, gem_version)
  puts "Please wait. Checking that given version exists for gem"
  response = %x[gem search '^#{gem_name}$' --all]
  if response != "\n"
    gem_versions_list = response[response.index('(')+1..response.index(')')-1].split(',').map {|ver| ver.strip }
    return (gem_versions_list.include? gem_version) ? true : false
  else
    puts "\nNo versions of the gem exist"
    return false
  end
end

.runObject



5
6
7
8
9
10
11
12
# File 'lib/modules/topics/demos/shasum_demo.rb', line 5

def self.run
  puts "\nChoose a Gem from RubyGems to validate its the Checksum of its SHA-256"
  puts "- Enter name of Gem (i.e. rails): "
  gem_name = gets.chomp.downcase.strip
  puts "Enter version of Gem (i.e. 5.1.2): "
  gem_version = gets.chomp.strip
  valid_shasum?(gem_name, gem_version)
end

.valid_shasum?(gem_name, gem_version) ⇒ Boolean



35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/modules/topics/demos/shasum_demo.rb', line 35

def self.valid_shasum?(gem_name, gem_version)
  is_gem = is_gem?(gem_name, gem_version)
  return false if not is_gem
  expected_checksum = get_checksum_for_gem(gem_name, gem_version)
  puts "Please wait. Downloading gem into subfolder ./temp"
  %x[mkdir -p temp; cd temp; gem fetch #{gem_name} --version '#{gem_version}';]
  output = %x[cd temp; shasum -a 256 ./#{gem_name}-#{gem_version}.gem]
  actual_checksum = output.split[0] # split on space
  puts "Actual Checksum: #{actual_checksum}"
  puts "Expected Checksum: #{expected_checksum}"
  puts "Valid Checksum: #{actual_checksum == expected_checksum}"
  actual_checksum == expected_checksum
end