From 7fa31575f9cd1671302da0ad18333bbc6281e33a Mon Sep 17 00:00:00 2001 From: Armin Friedl Date: Fri, 6 Nov 2020 02:01:55 +0100 Subject: [PATCH] Add README, fix license, add querysheet --- LICENSE | 2 +- README.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++-- TODO.org | 25 +++++++++++----- package.json | 2 +- querysheet.http | 11 +++++++ snip/api.py | 2 +- snip_screen.png | Bin 0 -> 37100 bytes 7 files changed, 105 insertions(+), 13 deletions(-) create mode 100644 querysheet.http create mode 100644 snip_screen.png diff --git a/LICENSE b/LICENSE index 204b93d..327e069 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -MIT License Copyright (c) +MIT License Copyright (c) 2020 Armin Friedl Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 5ceb16b..955d1f1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,75 @@ -# snip +# Snip +[![Build Status](https://drone.friedl.net/api/badges/incubator/snip/status.svg)](https://drone.friedl.net/incubator/snip) -Self-hosted, url-based redirection service \ No newline at end of file +No-fuzz link shortener. + +![Snip Screenshot](snip_screen.png) + +## Getting started +Snip is a self-hosted link shortener. It provides an API and a web interface. +Dependencies are managed with [pipenv](https://pipenv.pypa.io/en/latest/) and +[npm](https://www.npmjs.com/). Snip runs on +[flask](https://flask.palletsprojects.com/) the frontend is assembled with +[webpack](https://webpack.js.org/). All this is rather simple in practice. + +### Run from docker +The simplest way to get started is to run snip from the regularily [published +docker containers](https://hub.docker.com/repository/docker/arminfriedl/snip). + +```shell +docker run -p5000 arminfriedl/snip:latest +``` + +Then navigate your browser to http://localhost:5000. Alternatively, you can also +query the REST API. For an example see the [querysheet.http](querysheet.http) in +this repository. If you want to run it manually you can also install snip and +its dependencies yourself. + +### Install Dependencies +To install the dependencies for snip, you need +[pipenv](https://pipenv.pypa.io/en/latest/) and [npm](https://www.npmjs.com/) +installed on your system. Then run: + +```shell +pipenv install --dev +npm install --dev +``` + +### Build Snip +The snip backend itself needs no separate build step. However, the frontend +needs to be assembled by webpack. + + +```shell +# Run a development build with continuous update +npm run watch + +# Run a production build +npm run publish +``` + +### Run Snip +From the repository root run: + +```shell +export FLASK_ENV=production # or development +export FLASK_APP=snip + +pipenv run flask run +``` + +Flask will tell you where you can reach snip, per default http://localhost:5000. + +# Contribute +If you want to contribute to `snip` feel free to send patches to +dev[at]friedl[dot]net. Alternatviely, you can issue a pull request on GitHub +which will be cherry picked into my tree. If you plan significant long-term +contributions drop me a mail for access to the incubator repository. + +# Github Users +If you are visiting this repository on GitHub, you are on a mirror of +https://git.friedl.net/incubator/snip. This mirror is regularily updated +with my other GitHub mirrors. + +Like with my other incubator projects, once I consider `snip` reasonable +stable the main tree will move to GitHub. diff --git a/TODO.org b/TODO.org index 38edeaf..be87676 100644 --- a/TODO.org +++ b/TODO.org @@ -1,19 +1,28 @@ #+TODO: TODO NEXT HOLD | DONE CANCELLED -* URL Shortener [22%] +* URL Shortener [57%] ** DONE Landing Page Endpoint CLOSED: [2020-10-25 Sun 04:50] ** DONE Snip Endpoint CLOSED: [2020-10-25 Sun 05:22] -** TODO Shorten URL -** TODO Save Shortened URLs -** TODO Unsnip Shortened URLs -** TODO Landing Page Template -** TODO Rediret +** DONE Shorten URL + CLOSED: [2020-11-06 Fri 00:48] +** DONE Save Shortened URLs + CLOSED: [2020-11-06 Fri 00:48] +** DONE Unsnip Shortened URLs + CLOSED: [2020-11-06 Fri 00:48] +** DONE Landing Page Template + CLOSED: [2020-11-06 Fri 00:48] +** DONE Redirect + CLOSED: [2020-11-06 Fri 00:48] ** TODO Stats Endpoint ** TODO Store Stats ** TODO Stats Template ** TODO Externalize config -** TODO Deploy script -** TODO Improvement: Pronouncable short urls +** DONE Deploy script + CLOSED: [2020-11-06 Fri 00:49] +** HOLD Improvement: Pronouncable short urls with markov chain? + see womblies + +** TODO Better persistence concept diff --git a/package.json b/package.json index da7af3b..6868351 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "build_scss": "node-sass --include-path node_modules/foundation-sites/scss --include-path node_modules/motion-ui/src -o snip/static snip/templates", "build_webpack": "webpack --config webpack.dev.js", "watch": "npm-watch", - "publish": "node-sass --include-path node_modules/foundation-sites/scss -o snip/static snip/templates && webpack --config webpack.prod.js" + "publish": "node-sass --include-path node_modules/foundation-sites/scss --include-path node_modules/motion-ui/src -o snip/static snip/templates && webpack --config webpack.prod.js" }, "repository": { "type": "git", diff --git a/querysheet.http b/querysheet.http new file mode 100644 index 0000000..d4c2570 --- /dev/null +++ b/querysheet.http @@ -0,0 +1,11 @@ +:host = http://localhost:5000 + +# Create a new shortlink +POST :host/api/snip +-> jq-set-var :snip .snip +{ + "url": "https://example.com" +} + +# Unsnip shortlink +GET :host/api/:snip \ No newline at end of file diff --git a/snip/api.py b/snip/api.py index 1e7312e..09cd55d 100644 --- a/snip/api.py +++ b/snip/api.py @@ -38,7 +38,7 @@ def snip(): return {"url": url, "snip": snip} -@app.route("/api/unsnip/", methods=['GET']) +@app.route("/api/", methods=['GET']) def unsnip(snip): url = snipper.unsnip(snip) if not url: diff --git a/snip_screen.png b/snip_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..fd09776c4c4a0fa2b1bca4597add3445753e7bbd GIT binary patch literal 37100 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 z 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