Update Link Validationpull/387/head
@@ -4,7 +4,7 @@ notifications: | |||||
before_install: | before_install: | ||||
- rvm install 2.4.0 | - rvm install 2.4.0 | ||||
install: | install: | ||||
- gem install awesome_bot | |||||
- gem install httparty ruby-progressbar | |||||
before_script: | before_script: | ||||
- cd build | - cd build | ||||
script: | script: | ||||
@@ -12,4 +12,3 @@ script: | |||||
after_success: | after_success: | ||||
- ./build.sh | - ./build.sh | ||||
- ./deploy.sh | - ./deploy.sh | ||||
@@ -1,16 +1,20 @@ | |||||
#!/bin/bash | #!/bin/bash | ||||
echo "running format validation..." | echo "running format validation..." | ||||
./validate.rb ../README.md | |||||
./validate_format.rb ../README.md | |||||
if [[ $? != 0 ]]; then | if [[ $? != 0 ]]; then | ||||
echo "format validation failed!" | echo "format validation failed!" | ||||
exit $? | |||||
exit 1 | |||||
else | else | ||||
echo "format validation passed!" | echo "format validation passed!" | ||||
fi | fi | ||||
if [ "$TRAVIS_BRANCH" == "master" ]; then | if [ "$TRAVIS_BRANCH" == "master" ]; then | ||||
echo "running link validation..." | echo "running link validation..." | ||||
awesome_bot ../README.md --allow-ssl --allow 403,302 | |||||
./validate_links.rb ../README.md | |||||
if [[ $? != 0 ]]; then | |||||
echo "link validation failed!" | |||||
exit 1 | |||||
else | |||||
echo "link validation passed!" | |||||
fi | |||||
fi | fi |
@@ -1,11 +1,9 @@ | |||||
#!/usr/bin/env ruby | #!/usr/bin/env ruby | ||||
auth_keys = ['apiKey', 'OAuth', 'X-Mashape-Key', 'No'] | auth_keys = ['apiKey', 'OAuth', 'X-Mashape-Key', 'No'] | ||||
https_keys = ['Yes', 'No'] | https_keys = ['Yes', 'No'] | ||||
args = ARGV | args = ARGV | ||||
filename = args[0] | filename = args[0] | ||||
fail_flag = false | fail_flag = false | ||||
File.foreach(filename).with_index do |line, line_num| | File.foreach(filename).with_index do |line, line_num| | ||||
line_num += 1 | line_num += 1 | ||||
if line.start_with?('|') | if line.start_with?('|') | ||||
@@ -14,28 +12,24 @@ File.foreach(filename).with_index do |line, line_num| | |||||
next | next | ||||
end | end | ||||
values = line.split("|") | values = line.split("|") | ||||
# Check Description to make sure first character is capitalized | # Check Description to make sure first character is capitalized | ||||
desc_val = values[2].lstrip.chop | desc_val = values[2].lstrip.chop | ||||
if !/[[:upper:]]/.match(desc_val[0]) | if !/[[:upper:]]/.match(desc_val[0]) | ||||
puts "(#{line_num}) Invalid Description (first char not uppercase): #{desc_val}" | puts "(#{line_num}) Invalid Description (first char not uppercase): #{desc_val}" | ||||
fail_flag = true | fail_flag = true | ||||
end | end | ||||
# Check Auth values to conform to valid options only | # Check Auth values to conform to valid options only | ||||
auth_val = values[3].lstrip.chop.tr('``', '') | auth_val = values[3].lstrip.chop.tr('``', '') | ||||
if !auth_keys.include?(auth_val) | if !auth_keys.include?(auth_val) | ||||
puts "(#{line_num}) Invalid Auth (not a valid option): #{auth_val}" | puts "(#{line_num}) Invalid Auth (not a valid option): #{auth_val}" | ||||
fail_flag = true | fail_flag = true | ||||
end | end | ||||
# Check HTTPS Support values to be either "Yes" or "No" | # Check HTTPS Support values to be either "Yes" or "No" | ||||
https_val = values[4].lstrip.chop | https_val = values[4].lstrip.chop | ||||
if !https_keys.include?(https_val) | if !https_keys.include?(https_val) | ||||
puts "(#{line_num}) Invalid HTTPS: (must use \"Yes\" or \"No\"): #{https_val}" | puts "(#{line_num}) Invalid HTTPS: (must use \"Yes\" or \"No\"): #{https_val}" | ||||
fail_flag = true | fail_flag = true | ||||
end | end | ||||
# Check Link to ensure url is wrapped in "[Go!]" view | # Check Link to ensure url is wrapped in "[Go!]" view | ||||
link_val = values[5].lstrip.chop | link_val = values[5].lstrip.chop | ||||
if !link_val.start_with?("[Go!](") || !link_val.end_with?(')') | if !link_val.start_with?("[Go!](") || !link_val.end_with?(')') | ||||
@@ -44,7 +38,6 @@ File.foreach(filename).with_index do |line, line_num| | |||||
end | end | ||||
end | end | ||||
end | end | ||||
if fail_flag | if fail_flag | ||||
exit(1) | exit(1) | ||||
else | else |
@@ -0,0 +1,66 @@ | |||||
#!/usr/bin/env ruby | |||||
require 'httparty' | |||||
require 'ruby-progressbar' | |||||
require 'uri' | |||||
allowed_codes = [200, 302, 403] | |||||
args = ARGV | |||||
filename = args[0] | |||||
contents = File.open(filename, 'rb') { |f| f.read } | |||||
raw_links = URI.extract(contents, ['http', 'https']) | |||||
# Remove trailing ')' from entry URLs | |||||
links = [] | |||||
raw_links.each do |link| | |||||
if link.end_with?(')') | |||||
links.push(link[0...-1]) | |||||
else | |||||
links.push(link) | |||||
end | |||||
end | |||||
fails = [] | |||||
# Fail on any duplicate elements | |||||
dup = links.select{|element| links.count(element) > 1} | |||||
if dup.uniq.length > 0 | |||||
dup.uniq.each do |e| | |||||
fails.push("(DUP): #{e}") | |||||
end | |||||
end | |||||
# Remove any duplicates from array | |||||
links = links.uniq | |||||
count = 0 | |||||
total = links.length | |||||
progressbar = ProgressBar.create(:total => total) | |||||
# GET each link and check for valid response code from allowed_codes | |||||
links.each do |link| | |||||
begin | |||||
count += 1 | |||||
res = HTTParty.get(link, timeout: 10) | |||||
if res.code.nil? | |||||
fails.push("(NIL): #{link}") | |||||
next | |||||
end | |||||
if !allowed_codes.include?(res.code) | |||||
fails.push("(#{res.code}): #{link}") | |||||
end | |||||
rescue Net::ReadTimeout | |||||
fails.push("(TMO): #{link}") | |||||
rescue OpenSSL::SSL::SSLError | |||||
fails.push("(SSL): #{link}") | |||||
rescue SocketError | |||||
fails.push("(SOK): #{link}") | |||||
rescue Errno::ECONNREFUSED | |||||
fails.push("(CON): #{link}") | |||||
end | |||||
progressbar.increment | |||||
end | |||||
puts "#{count}/#{total} links checked" | |||||
if fails.length <= 0 | |||||
puts "all links valid" | |||||
exit(0) | |||||
else | |||||
puts "-- RESULTS --" | |||||
fails.sort! | |||||
fails.each do |e| | |||||
puts e | |||||
end | |||||
exit(1) | |||||
end |