Add Format Validation to CI
diff --git a/.travis.yml b/.travis.yml
index 5d5c5e8ea0..e702877de6 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,9 +5,11 @@ before_install:
   - rvm install 2.4.0
 install:
   - gem install awesome_bot
+before_script:
+  - cd build
 script:
-  - awesome_bot README.md --allow-ssl --allow 403,302
+  - ./main.sh
 after_success:
-  - cd build
-  - sh build.sh
-  - sh deploy.sh
+  - ./build.sh
+  - ./deploy.sh
+
diff --git a/build/deploy.sh b/build/deploy.sh
old mode 100644
new mode 100755
diff --git a/build/main.sh b/build/main.sh
new file mode 100755
index 0000000000..4e4dc52e52
--- /dev/null
+++ b/build/main.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+echo "running format validation..."
+./validate.rb ../README.md
+
+if ["$?" == 0]; then
+    echo "format validation PASSED"
+else
+    echo "format validation FAILED"
+fi
+
+if [ "$TRAVIS_BRANCH" == "master" ]; then
+    echo "running link validation..."
+    awesome_bot README.md --allow-ssl --allow 403,302
+fi
diff --git a/build/validate.rb b/build/validate.rb
new file mode 100755
index 0000000000..eecfa514ec
--- /dev/null
+++ b/build/validate.rb
@@ -0,0 +1,52 @@
+#!/usr/bin/env ruby
+auth_keys = ['apiKey', 'OAuth', 'X-Mashape-Key', 'No']
+https_keys = ['Yes', 'No']
+
+args = ARGV
+filename = args[0]
+fail_flag = false
+
+File.foreach(filename).with_index do |line, line_num|
+    line_num += 1
+    if line.start_with?('|')
+        # Skip table schema lines
+        if line.eql? "|---|---|---|---|---|\n"
+            next
+        end
+        values = line.split("|")
+
+        # Check Description to make sure first character is capitalized
+        desc_val = values[2].lstrip.chop
+        if !/[[:upper:]]/.match(desc_val[0])
+            puts "(#{line_num}) Invalid Description (first char not uppercase): #{desc_val}"
+            fail_flag = true
+        end
+
+        # Check Auth values to conform to valid options only
+        auth_val = values[3].lstrip.chop.tr('``', '')
+        if !auth_keys.include?(auth_val)
+            puts "(#{line_num}) Invalid Auth (not a valid option): #{auth_val}"
+            fail_flag = true
+        end
+
+        # Check HTTPS Support values to be either "Yes" or "No"
+        https_val = values[4].lstrip.chop
+        if !https_keys.include?(https_val)
+            puts "(#{line_num}) Invalid HTTPS: (must use \"Yes\" or \"No\"): #{https_val}"
+            fail_flag = true
+        end
+
+        # Check Link to ensure url is wrapped in "[Go!]" view
+        link_val = values[5].lstrip.chop
+        if !link_val.start_with?("[Go!](") || !link_val.end_with?(')')
+            puts "(#{line_num}) Invalid Link: (format should be \"[Go!](<LINK>)\"): #{link_val}"
+            fail_flag = true
+        end
+    end
+end
+
+if fail_flag
+    exit(1)
+else
+    exit(0)
+end

So, right now the CI for this project tests every link in the README to make sure that it's living. This is great for removing dead links over time, but can cause a real headache for users who open a pull request only to see their changes "break" the build, when 99.9% of the time it is someone else's link that is causing the failure.

Therefore, in the spirit of alleviating this headache, I have written a simple format validator that will run on pull requests. This validation checks for valid auth values, markdown link syntax, and a few other goodies.

I plan to add more checks to this soon, but my plan is to merge in the CI changes quickly to stop having pull requests fail for no good reason - and to give maintainers a break from having to point out simple fixes :)