From a95908289e7afb81e0078ff4ee0d5e412be14fab Mon Sep 17 00:00:00 2001 From: Adam Kariv Date: Wed, 30 Oct 2019 18:15:46 +0200 Subject: [PATCH] Adding dataset images --- .dockerignore | 2 + Dockerfile | 4 +- .../flows/dataset_assets.py | 29 ++ .../flows/node/.gitignore | 1 + .../flows/node/dataset.png | Bin 0 -> 30323 bytes .../flows/node/package-lock.json | 315 ++++++++++++++++++ .../flows/node/screenshot.js | 19 ++ pipeline-spec.yaml | 6 + requirements.txt | 2 +- 9 files changed, 376 insertions(+), 2 deletions(-) create mode 100644 datapackage_pipelines_migdar/flows/dataset_assets.py create mode 100644 datapackage_pipelines_migdar/flows/node/.gitignore create mode 100644 datapackage_pipelines_migdar/flows/node/dataset.png create mode 100644 datapackage_pipelines_migdar/flows/node/package-lock.json create mode 100644 datapackage_pipelines_migdar/flows/node/screenshot.js diff --git a/.dockerignore b/.dockerignore index 0616994..db470a6 100644 --- a/.dockerignore +++ b/.dockerignore @@ -22,3 +22,5 @@ LICENSE README.md tox.ini *.secret.env +./data/ +node_modules/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 6271c1e..4b4b312 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,8 @@ FROM frictionlessdata/datapackage-pipelines:2.1.8 -RUN apk --update --no-cache add bash wget +RUN apk --update --no-cache add bash wget nodejs npm +RUN npm install -g npm@latest +RUN cd /pipelines/ && npm install puppeteer COPY docker-dpp-run.sh /dpp/docker/run.sh diff --git a/datapackage_pipelines_migdar/flows/dataset_assets.py b/datapackage_pipelines_migdar/flows/dataset_assets.py new file mode 100644 index 0000000..9180fdd --- /dev/null +++ b/datapackage_pipelines_migdar/flows/dataset_assets.py @@ -0,0 +1,29 @@ +import os +import subprocess + +import dataflows as DF + +SCREENSHOT = os.path.join(os.path.dirname(__file__), 'node', 'screenshot.js') + + +def do_screenshot(): + def func(row): + doc_id = row['doc_id'] + url = f'https://yodaat.org/card/{doc_id}' + outpath = os.path.join('data', os.path.dirname(doc_id)) + os.makedirs(outpath, exist_ok=True) + outpath = os.path.join('data', doc_id + '.png') + print('running', doc_id) + subprocess.call(['node', SCREENSHOT, url, outpath, '.card']) + return func + + +def flow(*_, path='data/datasets_in_es'): + return DF.Flow( + DF.load('{}/datapackage.json'.format(path)), + do_screenshot() + ) + + +if __name__ == '__main__': + flow(path='https://api.yodaat.org/data/datasets_in_es').process() \ No newline at end of file diff --git a/datapackage_pipelines_migdar/flows/node/.gitignore b/datapackage_pipelines_migdar/flows/node/.gitignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/datapackage_pipelines_migdar/flows/node/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/datapackage_pipelines_migdar/flows/node/dataset.png b/datapackage_pipelines_migdar/flows/node/dataset.png new file mode 100644 index 0000000000000000000000000000000000000000..f73f17ed357ceb8ce271266471a70139ae5626d6 GIT binary patch literal 30323 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 literal 0 HcmV?d00001 diff --git a/datapackage_pipelines_migdar/flows/node/package-lock.json b/datapackage_pipelines_migdar/flows/node/package-lock.json new file mode 100644 index 0000000..0ac3b16 --- /dev/null +++ b/datapackage_pipelines_migdar/flows/node/package-lock.json @@ -0,0 +1,315 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "requires": { + "pend": "~1.2.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "glob": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "https-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", + "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=" + }, + "puppeteer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.0.0.tgz", + "integrity": "sha512-t3MmTWzQxPRP71teU6l0jX47PHXlc4Z52sQv4LJQSZLq1ttkKS2yGM3gaI57uQwZkNaoGd0+HPPMELZkcyhlqA==", + "requires": { + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^3.0.0", + "mime": "^2.0.3", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "requires": { + "fd-slicer": "~1.0.1" + } + } + } +} diff --git a/datapackage_pipelines_migdar/flows/node/screenshot.js b/datapackage_pipelines_migdar/flows/node/screenshot.js new file mode 100644 index 0000000..4518cff --- /dev/null +++ b/datapackage_pipelines_migdar/flows/node/screenshot.js @@ -0,0 +1,19 @@ +const puppeteer = require('puppeteer'); + +(async () => { + const [url, filename, selector] = process.argv.slice(2); + + const browser = await puppeteer.launch(); + const page = await browser.newPage(); + page.setViewport({width: 1300, height: 1200}); + await page.goto(url); + await page.waitForSelector(selector); + + const rect = await page.evaluate(selector => { + const element = document.querySelector(selector); + const {x, y, width, height} = element.getBoundingClientRect(); + return {x, y, width, height}; + }, selector); + await page.screenshot({path: filename, clip: rect}); + await browser.close(); +})(); \ No newline at end of file diff --git a/pipeline-spec.yaml b/pipeline-spec.yaml index a23e5ee..7254e82 100644 --- a/pipeline-spec.yaml +++ b/pipeline-spec.yaml @@ -75,6 +75,12 @@ datasets: pipeline: - flow: datapackage_pipelines_migdar.flows.datasets +dataset-assets: + dependencies: + - pipeline: ./datasets + pipeline: + - flow: datapackage_pipelines_migdar.flows.dataset_assets + zotero: schedule: diff --git a/requirements.txt b/requirements.txt index 9297c39..f53558a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,4 @@ datapackage-pipelines-elasticsearch dataflows>=0.0.57 gunicorn fuzzywuzzy[speedup] -google-api-python-client \ No newline at end of file +google-api-python-client