diff --git a/autotune.gemspec b/autotune.gemspec index 1f32e93c..8e8158f0 100644 --- a/autotune.gemspec +++ b/autotune.gemspec @@ -34,4 +34,6 @@ Gem::Specification.new do |s| s.add_development_dependency 'sqlite3' s.add_development_dependency 'pry-rails' + s.add_development_dependency 'vcr', '~> 3.0.3' + s.add_development_dependency 'webmock', '~> 3.0.1' end diff --git a/cassettes/autotune/get_spreadsheet.yml b/cassettes/autotune/get_spreadsheet.yml new file mode 100644 index 00000000..05bafaeb --- /dev/null +++ b/cassettes/autotune/get_spreadsheet.yml @@ -0,0 +1,509 @@ +--- +http_interactions: +- request: + method: get + uri: https://www.googleapis.com/discovery/v1/apis/drive/v2/rest + body: + encoding: UTF-8 + string: '' + headers: + User-Agent: + - |- + google-api-ruby-client/0.8.7 Mac OS X/10.12.4 + (gzip) + Accept-Encoding: + - gzip + Content-Type: + - '' + response: + status: + code: 200 + message: + headers: + expires: + - Wed, 21 Jun 2017 20:18:08 GMT + date: + - Wed, 21 Jun 2017 20:13:08 GMT + etag: + - '"YWOzh2SDasdU84ArJnpYek-OMdg/5mEjmliQ5Utj9-WHZkREXdHpbhQ"' + vary: + - Origin, X-Origin + content-type: + - application/json; charset=UTF-8 + content-encoding: + - gzip + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-xss-protection: + - 1; mode=block + content-length: + - '20284' + server: + - GSE + age: + - '144' + cache-control: + - public, max-age=300, must-revalidate, no-transform + alt-svc: + - quic=":443"; ma=2592000; v="38,37,36,35" + connection: + - close + body: + encoding: ASCII-8BIT + string: !binary |- + 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 + l999p367gTl6dcL6fJRleYQcRwy+oL9iIRg5iCkkje5CqiE/zfLUdPnS+IpV + QdUF1mDIQkS+v8E3Ta12sPBjYnpAaSZK6yMx3XPBSquoveRuoTO89LmW1QjX + 8reHfC23SK+m3kvBgnXr7qT6TuuVuEWg+t6JT1quUOZRSys6jGmvaKKvail2 + Tdze7PTI+pjP0SrNSgJuPUB9HdsBHnkYRUc3cRLlQ7sr2VFyzpKmrBaBuMPD + U+iDrMwUe5ZaQywY4IhEJS37vNbnu4W1ytpzFWRSBuK1K+UQ922si0c2ZrzO + h5ctVltZz2LVcyXHlDZaE21HXBQnptZWExyWoGIvuCp8Zt5yoqRRqQfJHGU6 + KixLtCfnmFLZtImqO2K1zjjVlqK1m5au0G3sVnlZ+13DmyjeBoAKGLZxJd6F + oCFhi1SHVH56okgPliTpSXpOwxQo+CmnLGyJNKqEiDozwcCQXMwzzjWd4z8N + fYpzymrwr/tchJE22G9h3ZjVUDGxaGVdVVnqfMjntMUtgoI8Qw0IJLn0BYXz + iqNqxNVx5D6dGXZaGbSwbdJVucJOq6mUPhxtDVwHsdch+QTBaZZk+fnsapBN + hz72CAMYcg9LPP/xNYiun6VNiqqSe+wP4ToLhDJAiEKWBjQ2iFFjHNwt6NxD + 8uyVTixEtSK1zyKztTiJ0rV5+Ux55hVnDZvlJDfKfKaIOV3KRnfAhF24SXd1 + PU725UToU0Zvaf2SYHWtM7ACfRiXOHKham/lAhYlbpVFWkEhFSnen4lSZ/1I + QxeBns7P8cNtNfsnRIUyYq1wzqXGsTxz2mN7iOQ+w97z9Ya9JgOeQnkkGx4L + 3RoLrMeD5j4b4kKzqne2puRs6uKqz1Mf1fibLl002prDqayfXytWfwmPk3Ny + PgCxA68kXJigq07gcJKyBQOt8lwrPJS02CpY7g/TjItFEq4GxWAdYo8q5Jq4 + WzkQVU52CzFYHWK3X8qmyteKQ7tmfSXEbYjHn8s1ssWkwH3KVgue2vh4Anc3 + 0rKlODIFQYXR9picW6K+hgpL3VpNB0Z4Egp7XYbsqQiMiJrUMu+Iq+V/Ciu4 + vRb7NMW84N4mLGtyXYyDh1pnqFraUcmNm/WBPMYhE1dYZDEZNDGzpzK7Zvgt + zZE1CXhCx/BU15OR63pKeKzJwhxAMLMqkD4FPmudF1ONCh82ZxCSC0YOqX69 + KcvFKQ2Lz358c9l0zD8KabiNa2SmJl+HSZbOODCMCdDh2YlqqVpYC1L+OvtS + 4nSaLCNxsbzC6a826F2N5eeTKcZcqDgw0zctR9qRGr8p1g2dmCIdWJuflqGL + v5OeoOgLG0YXIpUue1nLXtYCZr+eoJDoa5B+KdWd/EPLtJSxP2ZWIhDcjJIn + 4diPlRo0y6trkA1R9EKsViKcY895ZrpRC7UQ33eOSpMDrDluPUkyThLBRxQt + V1fJ5uFntp+eREe4oUEYpHLD2i8EN0KH5l/7S6/tnmO3e22JXOtqU4P2c6TW + THH4OBwvXMfK31XBsX3nG+7sibPBp0oS98loVNHqaeUDal6LWKlqEhCZKH44 + OLi7u9ufUUBauIiL/Wk2P0CedxDZClXH17FjLnVE6fkZ4kHfb+aq+8rA73Rj + 374DcLe4wZ/r7/iz//ZJjth4eBCLwIbFXg4BDw5+hf+eRL8NZBShyUbB1slr + aD5NNQjxXN3XnipwimtQbwUv5tCmGxBHr/Y9tjCz8YFXLC+lE54tFo8Ly5x2 + 1l81ivpxTEqliaWu+/AnsVVOG4H6Iw6qpYWsvrFHTqEyBFk5oj7lHVDobZzA + r28+lyJtNtOvl23RMxg+LwTOU5Jj2jS7AFlDjc5yC/ZLJznvmiYnM+VhknBr + dXwgNYBZjM21sK0fB+Fze3RTkJ8GQqlHYjK/X51S2aqkcKaLKhlT08l1oE/i + VObIuE2WUT25E0kyUV9iQ2WyCy3T2HSuKu8yKxgHF47nUDSIUf3kjfoKR74q + neBzL7dkzdbvggyoPrQbSkAQW4YzcZRFft/D+rtRQ6AAjzMmaO6PQBeA3cG6 + Ytl9/vXRWfDdv034eqjtj41iKDp+SGP8ECjCu+PTdyrd8hmSFUnalvzGfpbP + DnKBSZnFQZl/+/3BN/uji4uLhbGebczKKkymRcaR0a1DxBwVGOuTdOSzg1+n + UvofQd7hodbR6+km6oYr9VQmHCT4GF2ICyQWptvTYP1b+97cxq66n6iaymtV + drGX1Oh+KOztsNzzjO2mZ67HQapqit7lolzmqZWE0QffmqVMDSQ9BE1WRXey + 5sOUNbeiDk40CfQnYjQTRF9uhoc8Fv7X+tsOnSSGy1oOgywtrlMZ2knojlR5 + 2YFNtMj3oGhWr8NX0bggathO/THoXRv1uvAk0eyo2O+JirUo3IoueHVuJSEO + VLsNUy8qRTC9gc9trosjakhJQWhhsiFNUkuSmYDKK1HeyJwcHSQX2416Cxl5 + Gk6x1yh54mQkPLtn2IFAxRl0ZqMquIoaHVmrZak6dFVyvJuVe6gUTbU89Flw + eKuiEGkGBCW39oBh93lsl/K2En1HIKLyaI6rHWwGcQLj/1E7jNOImAF5krB4 + HwXuUtsOmQLafkQTWbsnxAxfvA2KGiZ1FvVD9l/zfY3mqhnPlbYtr5g6ppQ7 + vOPYheMMWyTLot0b9sUcYXK9Wvo4qZaN73/C1SbLJkDXTvi2jSs67XcsNJqH + n895TO9W1rY6r3v21AbKTIoNDYt9+eJFk9vr21fWk3mc4gxVD2CHvS3qgnFP + KcsE+GDBkzhdcoof1laJs6VMC1dBHlnqhgHJGDRzkRIbKBtK1Tbcc0KR9gw9 + 0XMo8QmBQ36tf9Jv12T7gC0m3QQ2Yw3Anp1jWyd5UFw7zbofXOimDKbGerBH + PH9vEuyBXHUM0spbwuM9Ii17LIHs9d3ONhy9lQRsugN/WtkQ1/ROx1lnjlHn + XtNN0NZsIk4tqw31AtZvX1M40q2o609/ojRn+jCbX5HF1loCRjphmKmGCA7a + jlXtgXx05YiBb0T7604xetiKkb5eiZpSklNIgTKLozvdheXUSrP3Kk/8TpOl + x33q6lBn7y8alSgtY1LMTk2P2mlOO81ppzntNCfndHea005z2mlOO81ppznt + NKdRNCe6nCbFKRXJU4ueSSlUpjzpxIuqYrVOHcNRd7rYThezdLEnQTVwCYCk + JXKpKLNFi86GH+/TOz6dDZ8eOE976GyYhk0KX8ztxjn1KDBVlinh1kGd7WDZ + DmW+SpTx44NblaOOD1xOpxEj+PN9+VYVJ0j4P/iVNZeT6LcD9QGG+MFfzRF+ + x2/evbl804QrXFIE4/xoGJXzzvOsj/WjmQdzbzvUL04cSXSDSD91RiMsq3IM + g9ZVIQnNQXF63ZPq+VYp9f1QFcJwB+KlNa4tJFVCsS8mdTgI9wpSRSgGwi1g + 4GmHaNUdBH8BCG6XPuGTc3WBj4uj7piiJBGyr/MaKiHf6kwoBsiCJ6qFsyr1 + axkA1xGHB4aGX40FoD89qZGPFlm9jXp81XTHh4etQYcSC71Rh31xsEP6H4+1 + V+jyco8V/7ZhEDdFX8e2iL/ohJN6cxki4Wt/JdQNDLzYUO+TWHFngjiiv9mo + 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 + 0nfEhuR5q727jt+4oEJaICJzqzyKFoI7xjRIrs9Fs9Bo2EKLNXb0pDnjsPas + r3SZVj3DbBgByU3ktzLGPsT9gJa5EHmcsWEE7zE4831alBR5hu676ziNUZnF + olAkB0dRjOcWJvQWqo1kBcBYKG7+WvFaG3c1lkFCB1QYJ+hRC26yu8q8OT6E + 5WDhKDbisAT7F5EsgiM4T7fE/Ea9ZHeRFV9FZIWLlV8whoK7UW9fXOR5+irH + riix8ekXsuqbIvuBiZikBO8luQMi9/kuXqWu6+/iVe4l0NcOU+HoXhLEYFSG + XK7jRwWQi+J6mSQrfk9lE1Rz6jbiPI85BKdi6NkVDuj32eOwOzF4FV6zT5kt + 15h9+I12s8+B+1KP1rOS8cj8I1WHk1SMitpBwm/uqiv3VQVgVMvEY+d2G9OM + HREYgwh4sXltlYKypUCBweaWSgVt2HwqW+PasfVfe4EQ3t+OMuwow7YCPR0M + X6brcVy9swbLq691x/NzQRYljeq6wreLDPfGndMdEu6Q8D6RsK10sp10OtBb + ur5EcquvdOcF3XlB5Rs7Lyg/2HlBd17QnRd05wXdeUHXQMvOC7rzgu68oDsv + 6M4L2rSmnRd05wWlf+28oI/ZC6pP9+tOnze2JvXFveTRe6atINsTay1P79Ym + H9x16evnvtTDC83J/Ffc7IeUcJLl2by9zpy2q4K5q4JJQz22tMVdFcwHJjjv + qmAG44pfuKNUJBbHVWNLFQBZIHUv6iOkqVEflZz2e0509Mp6262u+UT+h6Dj + 6cI1oNS7R7b2+5Ffd+v4cyDfPviV/xjaBOicLDLo4lfRNujkDzsV7HyIvS/U + aYywKh5qs3X1pXn1fVRh+wu3E24uXq/Ad335+u6wu76ivRQmpgp8qWSTSKc7 + 4H2AwNvGbdn4fK6ub8d1HwvXdchDa5lpRSHaCk3XiMQAPf8wimyGRkVKpB/x + sbK1x677bE/2X0M3vm6S40PBlpKUCgGbi1J2Rb+1VSp1rxk15+NBuo1hdR3E + Pb7aOzv+9iRwFD0MkisKacIbpOyZEboqfOYLEJz1P4Yqfse646sZy1b+Aifr + Yvvo69iL/XNvKFxbRzbGQs14Ox6vUWSYumDfTIWaPmB918LgLjpvX/Rdr/ta + iNupkdsOSTdf4A5JPUjaKvLo776QyLOTXQwpO4neZvmbeRgn3Yia9X6VvNnw + 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 + http_version: + recorded_at: Wed, 21 Jun 2017 20:15:32 GMT +recorded_with: VCR 3.0.3 diff --git a/lib/autotune/google_docs.rb b/lib/autotune/google_docs.rb index f69518da..96d150b0 100644 --- a/lib/autotune/google_docs.rb +++ b/lib/autotune/google_docs.rb @@ -24,7 +24,7 @@ def auth @client.authorization end - def initialize(options) + def initialize(options = {}) @client = Google::APIClient.new @client.authorization.update!({ @@ -236,20 +236,40 @@ def prepare_spreadsheet(filename) data = {} xls.worksheets.each do |sheet| title = sheet.sheet_name + sheet_data = extract_data(sheet) + # if the sheet is called microcopy, copy or ends with copy, we assume # the first column contains keys and the second contains values. # Like tarbell. if %w(microcopy copy).include?(title.downcase) || title.downcase =~ /[ -_]copy$/ - data[title] = load_microcopy(sheet.extract_data) + data[title] = load_microcopy(sheet_data) else # otherwise parse the sheet into a hash - data[title] = load_table(sheet.extract_data) + data[title] = load_table(sheet_data) end end data end + # Extract the data from a spreadsheet + # Takes the spreadsheet object and returns the table data as an array + # + # @param sheet [Object] the spreadsheet object + # @return [Array] spreadsheet contents + def extract_data(sheet) + data = [] + sheet.each do |row| + data_row = [] + row && row.cells.each do |cell| + data_cell = cell && cell.value + data_row << data_cell + end + data << data_row + end + return data + end + # Take a two-dimensional array from a spreadsheet and create a hash. The first # column is used as the key, and the second column is the value. If the key # occurs more than once, the value becomes an array to hold all the values diff --git a/test/autotune_test_helper.rb b/test/autotune_test_helper.rb index e7ce0568..1d51aa96 100644 --- a/test/autotune_test_helper.rb +++ b/test/autotune_test_helper.rb @@ -1,5 +1,6 @@ require 'tmpdir' require 'fileutils' +require 'vcr' # put omniauth into test mode OmniAuth.config.test_mode = true @@ -77,9 +78,10 @@ RESET_THEME_DATA end -# Display work_dir commands -# require 'work_dir' -# WorkDir.logger.level = Logger::DEBUG +VCR.configure do |config| + config.cassette_library_dir = "cassettes/autotune" + config.hook_into :faraday +end # Add more helper methods to be used by all tests here... class ActiveSupport::TestCase diff --git a/test/unit/autotune/google_docs_test.rb b/test/unit/autotune/google_docs_test.rb new file mode 100644 index 00000000..6ac4a073 --- /dev/null +++ b/test/unit/autotune/google_docs_test.rb @@ -0,0 +1,15 @@ +require 'test_helper' +require 'autotune/google_docs' + +# Test the WorkDir classes; Repo and Snapshot +module Autotune + class GoogleDocsTest < ActiveSupport::TestCase + test 'get public doc contents' do + VCR.use_cassette('get_spreadsheet') do + client = GoogleDocs.new + + puts client.get_doc_contents('https://docs.google.com/spreadsheets/d/1jEpEjCcGkcJrMrnuXecnwiojpY0KSklUSBB183BSjmM') + end + end + end +end