From 76ceac32d65e359d87aec3dbd52d942c99916a3b Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 25 Sep 2022 10:52:37 -0600 Subject: [PATCH 1/2] acceptance test --- acceptance/.env | 2 + acceptance/.gitignore | 567 ++++++++++++++++++++++++++++ acceptance/README.md | 69 ++++ acceptance/configuration.py | 22 ++ acceptance/facts/webhook.py | 18 + acceptance/features/webhook.feature | 8 + acceptance/interactions/request.py | 34 ++ acceptance/local.env | 2 + acceptance/questions/status.py | 5 + acceptance/requirements | 3 + acceptance/steps/response.py | 7 + acceptance/steps/status.py | 6 + acceptance/steps/webhook.py | 17 + acceptance/tasks/webhook.py | 11 + 14 files changed, 771 insertions(+) create mode 100644 acceptance/.env create mode 100644 acceptance/.gitignore create mode 100644 acceptance/README.md create mode 100644 acceptance/configuration.py create mode 100644 acceptance/facts/webhook.py create mode 100644 acceptance/features/webhook.feature create mode 100644 acceptance/interactions/request.py create mode 100644 acceptance/local.env create mode 100644 acceptance/questions/status.py create mode 100644 acceptance/requirements create mode 100644 acceptance/steps/response.py create mode 100644 acceptance/steps/status.py create mode 100644 acceptance/steps/webhook.py create mode 100644 acceptance/tasks/webhook.py diff --git a/acceptance/.env b/acceptance/.env new file mode 100644 index 0000000..42dc4da --- /dev/null +++ b/acceptance/.env @@ -0,0 +1,2 @@ +REQRES_URL="http://0.0.0.0:8000/api" +REQRES_API_VERSION="v1" \ No newline at end of file diff --git a/acceptance/.gitignore b/acceptance/.gitignore new file mode 100644 index 0000000..bea829a --- /dev/null +++ b/acceptance/.gitignore @@ -0,0 +1,567 @@ +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +#test files +test.py +request_test.py + +# Icon must end with two \r +Icon + +#test files +test.py +request_test.py + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +### VisualStudio ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Nuget personal access tokens and Credentials +nuget.config + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +.idea/ +*.sln.iml + +### VisualStudio Patch ### +# Additional files built by Visual Studio + +# End of https://www.toptal.com/developers/gitignore/api/python,visualstudio,macos \ No newline at end of file diff --git a/acceptance/README.md b/acceptance/README.md new file mode 100644 index 0000000..f6bec0a --- /dev/null +++ b/acceptance/README.md @@ -0,0 +1,69 @@ +# Requestbin-acceptance-test + +### Table of contents + +- [Requestbin-acceptance-test](#requestbin-acceptance-test) + - [Table of contents](#table-of-contents) + - [Description](#description) + - [File organization](#file-organization) + - [Prerequisites](#prerequisites) + - [How to use](#how-to-use) + - [Instalation](#instalation) + - [Run test cases](#run-test-cases) + - [References](#references) + +--- +## Description + +Acceptance testing with Behave and following the screenplay pattern. The base of framework is built with Python programming language and Gherkin + +### File organization + + | Path | Description | +| :--- | :---: | +|features | Features is the place where we will keep all our user stories written in Gherkins | +|steps | The step definitions is where we will put all our steps that are written in the Features section | +| data | It is where we will put all the data that we will need to execute the test cases such as payload, headers, etc. | +| models | It is where we model the request bodies | +| facts| It is where we will put all the classes that we will need to initialize the execute of the test cases, we can say that it is associated with Given step. Facts will consist of a series of interactions| +| task | It is where we will put all the classes related with the business goal, i mean, with the action that i will do in the execute of the test case, we can say that it is associated with When step. Tasks will consist of a series of interactions| +| questions | It is where we will put all the classes to check that the task was successful, we can say that it is associated with the Then step. Questions will consist of a series of interactions| +|interactions | It is where we will put all the classes related with the interactions with the SUT, such as navigating to websites, clicking buttons, entering values in form fields, or submitting HTTP requests to a REST API. This series of actions are composite a results in a facts, task or questions | + + +## Prerequisites + +You’ll need Python installed + +--- + +## How to use + +### Instalation +To install the framework, you must follow the following steps: + +1. ``` + git clone https://github.com/squella/Requestbin.git +2. ``` + python3 -m venv env +3. ``` + source env/bin/activate +4. ``` + pip install -r requirements.txt +5. ``` + behave + +### Run test cases + +Now, time to run your tests!, to do so, just run: + +``` + behave +``` + +--- + + +## References + +[Behave](https://behave.readthedocs.io/en/stable/) \ No newline at end of file diff --git a/acceptance/configuration.py b/acceptance/configuration.py new file mode 100644 index 0000000..5e287f7 --- /dev/null +++ b/acceptance/configuration.py @@ -0,0 +1,22 @@ +from os import environ, path +from dotenv import find_dotenv, load_dotenv + + +filename = '.env' +if "ENV" not in environ: + filename = 'local.env' +else: + filename = f'{environ.get("ENV")}.env' + + +basedir = path.abspath(path.dirname(__file__)) +dotenv_file = path.join(basedir, filename) +if find_dotenv(dotenv_file): + load_dotenv(dotenv_file) + + +class Configuration(object): + def __init__(self): + self.test_data_path = './data' + self.reqres_api_url = environ.get('REQRES_URL') + self.reqres_api_version = environ.get('REQRES_API_VERSION') diff --git a/acceptance/facts/webhook.py b/acceptance/facts/webhook.py new file mode 100644 index 0000000..18d09c4 --- /dev/null +++ b/acceptance/facts/webhook.py @@ -0,0 +1,18 @@ +from interactions.request import RequestClient + +class WebhookFacts(object): + _request = RequestClient() + _resource = "bins" + + @classmethod + def create_bin(cls, key): + data = {'key': f'{key}'} + status, header, body = cls._request.post(cls._resource, data) + + return status, header, body + + + + + + \ No newline at end of file diff --git a/acceptance/features/webhook.feature b/acceptance/features/webhook.feature new file mode 100644 index 0000000..1708651 --- /dev/null +++ b/acceptance/features/webhook.feature @@ -0,0 +1,8 @@ +Feature: Receive a webhook + + @test_01 + Scenario: receive a webhook + Given a requestbin user creates a bin with the key 'stuart' + When receive a webook with 'stuart' as key + Then the request succeeded + And the response body is as expected diff --git a/acceptance/interactions/request.py b/acceptance/interactions/request.py new file mode 100644 index 0000000..e44c594 --- /dev/null +++ b/acceptance/interactions/request.py @@ -0,0 +1,34 @@ +import requests +from configuration import Configuration + +class RequestClient(object): + + def __init__(self) -> None: + self._api_url = Configuration().reqres_api_url + self._version = Configuration().reqres_api_version + self._allow_redirect = False + + + def post(self, resource, payload): + + url = f"{self._api_url}/{self._version}/{resource}" + response = requests.post(url, data=payload, + allow_redirects=self._allow_redirect) + + status_code = response.status_code + headers = response.headers + body = response.json() + + return status_code, headers, body + + + def get(self, resource, param): + url = f"{self._api_url}/{self._version}/{resource}/{param}" + response = requests.get(url, + allow_redirects=self._allow_redirect) + + status_code = response.status_code + headers = response.headers + body = response.json() + + return status_code, headers, body diff --git a/acceptance/local.env b/acceptance/local.env new file mode 100644 index 0000000..42dc4da --- /dev/null +++ b/acceptance/local.env @@ -0,0 +1,2 @@ +REQRES_URL="http://0.0.0.0:8000/api" +REQRES_API_VERSION="v1" \ No newline at end of file diff --git a/acceptance/questions/status.py b/acceptance/questions/status.py new file mode 100644 index 0000000..29136e7 --- /dev/null +++ b/acceptance/questions/status.py @@ -0,0 +1,5 @@ + +class StatusQuestions(object): + @classmethod + def is_ok(cls, status) -> bool: + return status == 200 diff --git a/acceptance/requirements b/acceptance/requirements new file mode 100644 index 0000000..ec97fe5 --- /dev/null +++ b/acceptance/requirements @@ -0,0 +1,3 @@ +behave==1.2.6 +requests==2.26.0 +python-dotenv==0.19.1 \ No newline at end of file diff --git a/acceptance/steps/response.py b/acceptance/steps/response.py new file mode 100644 index 0000000..c4c51da --- /dev/null +++ b/acceptance/steps/response.py @@ -0,0 +1,7 @@ +from behave import then + +@then("the response body is as expected") +def step_impl(context): + assert context.body == context.expected_body + + diff --git a/acceptance/steps/status.py b/acceptance/steps/status.py new file mode 100644 index 0000000..2d59495 --- /dev/null +++ b/acceptance/steps/status.py @@ -0,0 +1,6 @@ +from behave import then +from questions.status import StatusQuestions + +@then("the request succeeded") +def step_impl(context): + assert(StatusQuestions.is_ok(context.status)) diff --git a/acceptance/steps/webhook.py b/acceptance/steps/webhook.py new file mode 100644 index 0000000..b29c5d8 --- /dev/null +++ b/acceptance/steps/webhook.py @@ -0,0 +1,17 @@ +from behave import given, when +from facts.webhook import WebhookFacts +from tasks.webhook import WebhookTask + + +@given("a requestbin user creates a bin with the key '{key}'") +def step_impl(context, key): + status, header, body = WebhookFacts.create_bin(key) + context.status = status + context.body = body + + +@when("receive a webook with '{key}' as key") +def step_impl(context, key): + status, header, body = WebhookTask.get_bin(key) + context.status = status + context.expected_body = body diff --git a/acceptance/tasks/webhook.py b/acceptance/tasks/webhook.py new file mode 100644 index 0000000..0eebca8 --- /dev/null +++ b/acceptance/tasks/webhook.py @@ -0,0 +1,11 @@ +from interactions.request import RequestClient + + +class WebhookTask(object): + _request = RequestClient() + _resource = "bins" + + @classmethod + def get_bin(cls, key): + status, header, body = cls._request.get(cls._resource, key) + return status, header, body From 07c82372acd0c10156aac6878a4292b345ee5c20 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 26 Sep 2022 10:08:09 -0600 Subject: [PATCH 2/2] create bins with a given key --- .env => app/.env | 0 .gitignore => app/.gitignore | 0 Dockerfile => app/Dockerfile | 0 Procfile => app/Procfile | 0 README.md => app/README.md | 0 app.json => app/app.json | 0 docker-compose.yml => app/docker-compose.yml | 0 {requestbin => app/requestbin}/__init__.py | 0 {requestbin => app/requestbin}/api.py | 3 ++- {requestbin => app/requestbin}/config.py | 0 {requestbin => app/requestbin}/db.py | 4 ++-- {requestbin => app/requestbin}/filters.py | 0 {requestbin => app/requestbin}/models.py | 4 ++-- .../requestbin}/static/css/bootstrap-responsive.css | 0 .../static/css/bootstrap-responsive.min.css | 0 .../requestbin}/static/css/bootstrap.css | 0 .../requestbin}/static/css/bootstrap.min.css | 0 .../requestbin}/static/css/font-awesome-ie7.css | 0 .../requestbin}/static/css/font-awesome-ie7.min.css | 0 .../requestbin}/static/css/font-awesome.css | 0 .../requestbin}/static/css/font-awesome.min.css | 0 .../requestbin}/static/css/prettify.css | 0 .../requestbin}/static/css/responsive.css | 0 .../requestbin}/static/css/styles.css | 0 {requestbin => app/requestbin}/static/favicon.ico | Bin .../requestbin}/static/font/FontAwesome.otf | Bin .../requestbin}/static/font/fontawesome-webfont.eot | Bin .../requestbin}/static/font/fontawesome-webfont.svg | 0 .../requestbin}/static/font/fontawesome-webfont.ttf | Bin .../static/font/fontawesome-webfont.woff | Bin .../requestbin}/static/img/bg-stripe.png | Bin .../static/img/glyphicons-halflings-white.png | Bin .../requestbin}/static/img/glyphicons-halflings.png | Bin {requestbin => app/requestbin}/static/img/ico-1.png | Bin {requestbin => app/requestbin}/static/img/ico-2.png | Bin {requestbin => app/requestbin}/static/img/ico-3.png | Bin {requestbin => app/requestbin}/static/img/ico-4.png | Bin .../requestbin}/static/img/logo-2x.png | Bin .../requestbin}/static/img/logo-runscope-1x.png | Bin .../requestbin}/static/img/logo-runscope-2x.png | Bin {requestbin => app/requestbin}/static/img/logo.png | Bin .../requestbin}/static/img/runscope-hero.png | Bin .../requestbin}/static/js/bootstrap.js | 0 .../requestbin}/static/js/bootstrap.min.js | 0 .../requestbin}/static/js/jquery.min.js | 0 .../requestbin}/static/js/prettify.js | 0 .../requestbin}/static/less/accordion.less | 0 .../requestbin}/static/less/alerts.less | 0 .../requestbin}/static/less/bootstrap.less | 0 .../requestbin}/static/less/breadcrumbs.less | 0 .../requestbin}/static/less/button-groups.less | 0 .../requestbin}/static/less/buttons.less | 0 .../requestbin}/static/less/carousel.less | 0 .../requestbin}/static/less/close.less | 0 .../requestbin}/static/less/code.less | 0 .../static/less/component-animations.less | 0 .../requestbin}/static/less/custom.less | 0 .../requestbin}/static/less/dropdowns.less | 0 .../requestbin}/static/less/forms.less | 0 .../requestbin}/static/less/grid.less | 0 .../requestbin}/static/less/hero-unit.less | 0 .../requestbin}/static/less/labels-badges.less | 0 .../requestbin}/static/less/layouts.less | 0 .../requestbin}/static/less/media.less | 0 .../requestbin}/static/less/mixins.less | 0 .../requestbin}/static/less/modals.less | 0 .../requestbin}/static/less/navbar.less | 0 .../requestbin}/static/less/navs.less | 0 .../requestbin}/static/less/pager.less | 0 .../requestbin}/static/less/pagination.less | 0 .../requestbin}/static/less/popovers.less | 0 .../requestbin}/static/less/progress-bars.less | 0 .../requestbin}/static/less/reset.less | 0 .../static/less/responsive-1200px-min.less | 0 .../static/less/responsive-767px-max.less | 0 .../static/less/responsive-768px-979px.less | 0 .../requestbin}/static/less/responsive-navbar.less | 0 .../static/less/responsive-utilities.less | 0 .../requestbin}/static/less/responsive.less | 0 .../requestbin}/static/less/scaffolding.less | 0 .../requestbin}/static/less/sprites.less | 0 .../requestbin}/static/less/styles.less | 0 .../requestbin}/static/less/tables.less | 0 .../requestbin}/static/less/thumbnails.less | 0 .../requestbin}/static/less/tooltip.less | 0 .../requestbin}/static/less/type.less | 0 .../requestbin}/static/less/utilities.less | 0 .../requestbin}/static/less/variables.less | 0 .../requestbin}/static/less/wells.less | 0 {requestbin => app/requestbin}/static/lock.png | Bin {requestbin => app/requestbin}/static/robots.txt | 0 {requestbin => app/requestbin}/storage/__init__.py | 0 {requestbin => app/requestbin}/storage/memory.py | 4 ++-- {requestbin => app/requestbin}/storage/redis.py | 4 ++-- {requestbin => app/requestbin}/templates/bin.html | 0 {requestbin => app/requestbin}/templates/doc.html | 0 {requestbin => app/requestbin}/templates/home.html | 0 .../requestbin}/templates/layout.html | 0 {requestbin => app/requestbin}/util.py | 0 {requestbin => app/requestbin}/views.py | 0 requirements.txt => app/requirements.txt | 0 runtime.txt => app/runtime.txt | 0 setup.py => app/setup.py | 0 web.py => app/web.py | 0 104 files changed, 10 insertions(+), 9 deletions(-) rename .env => app/.env (100%) rename .gitignore => app/.gitignore (100%) rename Dockerfile => app/Dockerfile (100%) rename Procfile => app/Procfile (100%) rename README.md => app/README.md (100%) rename app.json => app/app.json (100%) rename docker-compose.yml => app/docker-compose.yml (100%) rename {requestbin => app/requestbin}/__init__.py (100%) rename {requestbin => app/requestbin}/api.py (95%) rename {requestbin => app/requestbin}/config.py (100%) rename {requestbin => app/requestbin}/db.py (90%) rename {requestbin => app/requestbin}/filters.py (100%) rename {requestbin => app/requestbin}/models.py (97%) rename {requestbin => app/requestbin}/static/css/bootstrap-responsive.css (100%) rename {requestbin => app/requestbin}/static/css/bootstrap-responsive.min.css (100%) rename {requestbin => app/requestbin}/static/css/bootstrap.css (100%) rename {requestbin => app/requestbin}/static/css/bootstrap.min.css (100%) rename {requestbin => app/requestbin}/static/css/font-awesome-ie7.css (100%) rename {requestbin => app/requestbin}/static/css/font-awesome-ie7.min.css (100%) rename {requestbin => app/requestbin}/static/css/font-awesome.css (100%) rename {requestbin => app/requestbin}/static/css/font-awesome.min.css (100%) rename {requestbin => app/requestbin}/static/css/prettify.css (100%) rename {requestbin => app/requestbin}/static/css/responsive.css (100%) rename {requestbin => app/requestbin}/static/css/styles.css (100%) rename {requestbin => app/requestbin}/static/favicon.ico (100%) rename {requestbin => app/requestbin}/static/font/FontAwesome.otf (100%) rename {requestbin => app/requestbin}/static/font/fontawesome-webfont.eot (100%) rename {requestbin => app/requestbin}/static/font/fontawesome-webfont.svg (100%) rename {requestbin => app/requestbin}/static/font/fontawesome-webfont.ttf (100%) rename {requestbin => app/requestbin}/static/font/fontawesome-webfont.woff (100%) rename {requestbin => app/requestbin}/static/img/bg-stripe.png (100%) rename {requestbin => app/requestbin}/static/img/glyphicons-halflings-white.png (100%) rename {requestbin => app/requestbin}/static/img/glyphicons-halflings.png (100%) rename {requestbin => app/requestbin}/static/img/ico-1.png (100%) rename {requestbin => app/requestbin}/static/img/ico-2.png (100%) rename {requestbin => app/requestbin}/static/img/ico-3.png (100%) rename {requestbin => app/requestbin}/static/img/ico-4.png (100%) rename {requestbin => app/requestbin}/static/img/logo-2x.png (100%) rename {requestbin => app/requestbin}/static/img/logo-runscope-1x.png (100%) rename {requestbin => app/requestbin}/static/img/logo-runscope-2x.png (100%) rename {requestbin => app/requestbin}/static/img/logo.png (100%) rename {requestbin => app/requestbin}/static/img/runscope-hero.png (100%) rename {requestbin => app/requestbin}/static/js/bootstrap.js (100%) rename {requestbin => app/requestbin}/static/js/bootstrap.min.js (100%) rename {requestbin => app/requestbin}/static/js/jquery.min.js (100%) rename {requestbin => app/requestbin}/static/js/prettify.js (100%) rename {requestbin => app/requestbin}/static/less/accordion.less (100%) rename {requestbin => app/requestbin}/static/less/alerts.less (100%) rename {requestbin => app/requestbin}/static/less/bootstrap.less (100%) rename {requestbin => app/requestbin}/static/less/breadcrumbs.less (100%) rename {requestbin => app/requestbin}/static/less/button-groups.less (100%) rename {requestbin => app/requestbin}/static/less/buttons.less (100%) rename {requestbin => app/requestbin}/static/less/carousel.less (100%) rename {requestbin => app/requestbin}/static/less/close.less (100%) rename {requestbin => app/requestbin}/static/less/code.less (100%) rename {requestbin => app/requestbin}/static/less/component-animations.less (100%) rename {requestbin => app/requestbin}/static/less/custom.less (100%) rename {requestbin => app/requestbin}/static/less/dropdowns.less (100%) rename {requestbin => app/requestbin}/static/less/forms.less (100%) rename {requestbin => app/requestbin}/static/less/grid.less (100%) rename {requestbin => app/requestbin}/static/less/hero-unit.less (100%) rename {requestbin => app/requestbin}/static/less/labels-badges.less (100%) rename {requestbin => app/requestbin}/static/less/layouts.less (100%) rename {requestbin => app/requestbin}/static/less/media.less (100%) rename {requestbin => app/requestbin}/static/less/mixins.less (100%) rename {requestbin => app/requestbin}/static/less/modals.less (100%) rename {requestbin => app/requestbin}/static/less/navbar.less (100%) rename {requestbin => app/requestbin}/static/less/navs.less (100%) rename {requestbin => app/requestbin}/static/less/pager.less (100%) rename {requestbin => app/requestbin}/static/less/pagination.less (100%) rename {requestbin => app/requestbin}/static/less/popovers.less (100%) rename {requestbin => app/requestbin}/static/less/progress-bars.less (100%) rename {requestbin => app/requestbin}/static/less/reset.less (100%) rename {requestbin => app/requestbin}/static/less/responsive-1200px-min.less (100%) rename {requestbin => app/requestbin}/static/less/responsive-767px-max.less (100%) rename {requestbin => app/requestbin}/static/less/responsive-768px-979px.less (100%) rename {requestbin => app/requestbin}/static/less/responsive-navbar.less (100%) rename {requestbin => app/requestbin}/static/less/responsive-utilities.less (100%) rename {requestbin => app/requestbin}/static/less/responsive.less (100%) rename {requestbin => app/requestbin}/static/less/scaffolding.less (100%) rename {requestbin => app/requestbin}/static/less/sprites.less (100%) rename {requestbin => app/requestbin}/static/less/styles.less (100%) rename {requestbin => app/requestbin}/static/less/tables.less (100%) rename {requestbin => app/requestbin}/static/less/thumbnails.less (100%) rename {requestbin => app/requestbin}/static/less/tooltip.less (100%) rename {requestbin => app/requestbin}/static/less/type.less (100%) rename {requestbin => app/requestbin}/static/less/utilities.less (100%) rename {requestbin => app/requestbin}/static/less/variables.less (100%) rename {requestbin => app/requestbin}/static/less/wells.less (100%) rename {requestbin => app/requestbin}/static/lock.png (100%) rename {requestbin => app/requestbin}/static/robots.txt (100%) rename {requestbin => app/requestbin}/storage/__init__.py (100%) rename {requestbin => app/requestbin}/storage/memory.py (92%) rename {requestbin => app/requestbin}/storage/redis.py (95%) rename {requestbin => app/requestbin}/templates/bin.html (100%) rename {requestbin => app/requestbin}/templates/doc.html (100%) rename {requestbin => app/requestbin}/templates/home.html (100%) rename {requestbin => app/requestbin}/templates/layout.html (100%) rename {requestbin => app/requestbin}/util.py (100%) rename {requestbin => app/requestbin}/views.py (100%) rename requirements.txt => app/requirements.txt (100%) rename runtime.txt => app/runtime.txt (100%) rename setup.py => app/setup.py (100%) rename web.py => app/web.py (100%) diff --git a/.env b/app/.env similarity index 100% rename from .env rename to app/.env diff --git a/.gitignore b/app/.gitignore similarity index 100% rename from .gitignore rename to app/.gitignore diff --git a/Dockerfile b/app/Dockerfile similarity index 100% rename from Dockerfile rename to app/Dockerfile diff --git a/Procfile b/app/Procfile similarity index 100% rename from Procfile rename to app/Procfile diff --git a/README.md b/app/README.md similarity index 100% rename from README.md rename to app/README.md diff --git a/app.json b/app/app.json similarity index 100% rename from app.json rename to app/app.json diff --git a/docker-compose.yml b/app/docker-compose.yml similarity index 100% rename from docker-compose.yml rename to app/docker-compose.yml diff --git a/requestbin/__init__.py b/app/requestbin/__init__.py similarity index 100% rename from requestbin/__init__.py rename to app/requestbin/__init__.py diff --git a/requestbin/api.py b/app/requestbin/api.py similarity index 95% rename from requestbin/api.py rename to app/requestbin/api.py index 2a83065..2062400 100644 --- a/requestbin/api.py +++ b/app/requestbin/api.py @@ -19,7 +19,8 @@ def _response(object, code=200): @app.endpoint('api.bins') def bins(): private = request.form.get('private') in ['true', 'on'] - bin = db.create_bin(private) + key = request.form.get('key', '') + bin = db.create_bin(private, key) if bin.private: session[bin.name] = bin.secret_key return _response(bin.to_dict()) diff --git a/requestbin/config.py b/app/requestbin/config.py similarity index 100% rename from requestbin/config.py rename to app/requestbin/config.py diff --git a/requestbin/db.py b/app/requestbin/db.py similarity index 90% rename from requestbin/db.py rename to app/requestbin/db.py index e1ca0be..8880c4f 100644 --- a/requestbin/db.py +++ b/app/requestbin/db.py @@ -15,8 +15,8 @@ db = klass(bin_ttl) -def create_bin(private=False): - return db.create_bin(private) +def create_bin(private=False, key = ''): + return db.create_bin(private, key) def create_request(bin, request): return db.create_request(bin, request) diff --git a/requestbin/filters.py b/app/requestbin/filters.py similarity index 100% rename from requestbin/filters.py rename to app/requestbin/filters.py diff --git a/requestbin/models.py b/app/requestbin/models.py similarity index 97% rename from requestbin/models.py rename to app/requestbin/models.py index 8b3ba03..8a95de1 100644 --- a/requestbin/models.py +++ b/app/requestbin/models.py @@ -16,11 +16,11 @@ class Bin(object): max_requests = config.MAX_REQUESTS - def __init__(self, private=False): + def __init__(self, private=False, key = ''): self.created = time.time() self.private = private self.color = random_color() - self.name = tinyid(8) + self.name = key if len(key) > 0 else tinyid(8) self.favicon_uri = solid16x16gif_datauri(*self.color) self.requests = [] self.secret_key = os.urandom(24) if self.private else None diff --git a/requestbin/static/css/bootstrap-responsive.css b/app/requestbin/static/css/bootstrap-responsive.css similarity index 100% rename from requestbin/static/css/bootstrap-responsive.css rename to app/requestbin/static/css/bootstrap-responsive.css diff --git a/requestbin/static/css/bootstrap-responsive.min.css b/app/requestbin/static/css/bootstrap-responsive.min.css similarity index 100% rename from requestbin/static/css/bootstrap-responsive.min.css rename to app/requestbin/static/css/bootstrap-responsive.min.css diff --git a/requestbin/static/css/bootstrap.css b/app/requestbin/static/css/bootstrap.css similarity index 100% rename from requestbin/static/css/bootstrap.css rename to app/requestbin/static/css/bootstrap.css diff --git a/requestbin/static/css/bootstrap.min.css b/app/requestbin/static/css/bootstrap.min.css similarity index 100% rename from requestbin/static/css/bootstrap.min.css rename to app/requestbin/static/css/bootstrap.min.css diff --git a/requestbin/static/css/font-awesome-ie7.css b/app/requestbin/static/css/font-awesome-ie7.css similarity index 100% rename from requestbin/static/css/font-awesome-ie7.css rename to app/requestbin/static/css/font-awesome-ie7.css diff --git a/requestbin/static/css/font-awesome-ie7.min.css b/app/requestbin/static/css/font-awesome-ie7.min.css similarity index 100% rename from requestbin/static/css/font-awesome-ie7.min.css rename to app/requestbin/static/css/font-awesome-ie7.min.css diff --git a/requestbin/static/css/font-awesome.css b/app/requestbin/static/css/font-awesome.css similarity index 100% rename from requestbin/static/css/font-awesome.css rename to app/requestbin/static/css/font-awesome.css diff --git a/requestbin/static/css/font-awesome.min.css b/app/requestbin/static/css/font-awesome.min.css similarity index 100% rename from requestbin/static/css/font-awesome.min.css rename to app/requestbin/static/css/font-awesome.min.css diff --git a/requestbin/static/css/prettify.css b/app/requestbin/static/css/prettify.css similarity index 100% rename from requestbin/static/css/prettify.css rename to app/requestbin/static/css/prettify.css diff --git a/requestbin/static/css/responsive.css b/app/requestbin/static/css/responsive.css similarity index 100% rename from requestbin/static/css/responsive.css rename to app/requestbin/static/css/responsive.css diff --git a/requestbin/static/css/styles.css b/app/requestbin/static/css/styles.css similarity index 100% rename from requestbin/static/css/styles.css rename to app/requestbin/static/css/styles.css diff --git a/requestbin/static/favicon.ico b/app/requestbin/static/favicon.ico similarity index 100% rename from requestbin/static/favicon.ico rename to app/requestbin/static/favicon.ico diff --git a/requestbin/static/font/FontAwesome.otf b/app/requestbin/static/font/FontAwesome.otf similarity index 100% rename from requestbin/static/font/FontAwesome.otf rename to app/requestbin/static/font/FontAwesome.otf diff --git a/requestbin/static/font/fontawesome-webfont.eot b/app/requestbin/static/font/fontawesome-webfont.eot similarity index 100% rename from requestbin/static/font/fontawesome-webfont.eot rename to app/requestbin/static/font/fontawesome-webfont.eot diff --git a/requestbin/static/font/fontawesome-webfont.svg b/app/requestbin/static/font/fontawesome-webfont.svg similarity index 100% rename from requestbin/static/font/fontawesome-webfont.svg rename to app/requestbin/static/font/fontawesome-webfont.svg diff --git a/requestbin/static/font/fontawesome-webfont.ttf b/app/requestbin/static/font/fontawesome-webfont.ttf similarity index 100% rename from requestbin/static/font/fontawesome-webfont.ttf rename to app/requestbin/static/font/fontawesome-webfont.ttf diff --git a/requestbin/static/font/fontawesome-webfont.woff b/app/requestbin/static/font/fontawesome-webfont.woff similarity index 100% rename from requestbin/static/font/fontawesome-webfont.woff rename to app/requestbin/static/font/fontawesome-webfont.woff diff --git a/requestbin/static/img/bg-stripe.png b/app/requestbin/static/img/bg-stripe.png similarity index 100% rename from requestbin/static/img/bg-stripe.png rename to app/requestbin/static/img/bg-stripe.png diff --git a/requestbin/static/img/glyphicons-halflings-white.png b/app/requestbin/static/img/glyphicons-halflings-white.png similarity index 100% rename from requestbin/static/img/glyphicons-halflings-white.png rename to app/requestbin/static/img/glyphicons-halflings-white.png diff --git a/requestbin/static/img/glyphicons-halflings.png b/app/requestbin/static/img/glyphicons-halflings.png similarity index 100% rename from requestbin/static/img/glyphicons-halflings.png rename to app/requestbin/static/img/glyphicons-halflings.png diff --git a/requestbin/static/img/ico-1.png b/app/requestbin/static/img/ico-1.png similarity index 100% rename from requestbin/static/img/ico-1.png rename to app/requestbin/static/img/ico-1.png diff --git a/requestbin/static/img/ico-2.png b/app/requestbin/static/img/ico-2.png similarity index 100% rename from requestbin/static/img/ico-2.png rename to app/requestbin/static/img/ico-2.png diff --git a/requestbin/static/img/ico-3.png b/app/requestbin/static/img/ico-3.png similarity index 100% rename from requestbin/static/img/ico-3.png rename to app/requestbin/static/img/ico-3.png diff --git a/requestbin/static/img/ico-4.png b/app/requestbin/static/img/ico-4.png similarity index 100% rename from requestbin/static/img/ico-4.png rename to app/requestbin/static/img/ico-4.png diff --git a/requestbin/static/img/logo-2x.png b/app/requestbin/static/img/logo-2x.png similarity index 100% rename from requestbin/static/img/logo-2x.png rename to app/requestbin/static/img/logo-2x.png diff --git a/requestbin/static/img/logo-runscope-1x.png b/app/requestbin/static/img/logo-runscope-1x.png similarity index 100% rename from requestbin/static/img/logo-runscope-1x.png rename to app/requestbin/static/img/logo-runscope-1x.png diff --git a/requestbin/static/img/logo-runscope-2x.png b/app/requestbin/static/img/logo-runscope-2x.png similarity index 100% rename from requestbin/static/img/logo-runscope-2x.png rename to app/requestbin/static/img/logo-runscope-2x.png diff --git a/requestbin/static/img/logo.png b/app/requestbin/static/img/logo.png similarity index 100% rename from requestbin/static/img/logo.png rename to app/requestbin/static/img/logo.png diff --git a/requestbin/static/img/runscope-hero.png b/app/requestbin/static/img/runscope-hero.png similarity index 100% rename from requestbin/static/img/runscope-hero.png rename to app/requestbin/static/img/runscope-hero.png diff --git a/requestbin/static/js/bootstrap.js b/app/requestbin/static/js/bootstrap.js similarity index 100% rename from requestbin/static/js/bootstrap.js rename to app/requestbin/static/js/bootstrap.js diff --git a/requestbin/static/js/bootstrap.min.js b/app/requestbin/static/js/bootstrap.min.js similarity index 100% rename from requestbin/static/js/bootstrap.min.js rename to app/requestbin/static/js/bootstrap.min.js diff --git a/requestbin/static/js/jquery.min.js b/app/requestbin/static/js/jquery.min.js similarity index 100% rename from requestbin/static/js/jquery.min.js rename to app/requestbin/static/js/jquery.min.js diff --git a/requestbin/static/js/prettify.js b/app/requestbin/static/js/prettify.js similarity index 100% rename from requestbin/static/js/prettify.js rename to app/requestbin/static/js/prettify.js diff --git a/requestbin/static/less/accordion.less b/app/requestbin/static/less/accordion.less similarity index 100% rename from requestbin/static/less/accordion.less rename to app/requestbin/static/less/accordion.less diff --git a/requestbin/static/less/alerts.less b/app/requestbin/static/less/alerts.less similarity index 100% rename from requestbin/static/less/alerts.less rename to app/requestbin/static/less/alerts.less diff --git a/requestbin/static/less/bootstrap.less b/app/requestbin/static/less/bootstrap.less similarity index 100% rename from requestbin/static/less/bootstrap.less rename to app/requestbin/static/less/bootstrap.less diff --git a/requestbin/static/less/breadcrumbs.less b/app/requestbin/static/less/breadcrumbs.less similarity index 100% rename from requestbin/static/less/breadcrumbs.less rename to app/requestbin/static/less/breadcrumbs.less diff --git a/requestbin/static/less/button-groups.less b/app/requestbin/static/less/button-groups.less similarity index 100% rename from requestbin/static/less/button-groups.less rename to app/requestbin/static/less/button-groups.less diff --git a/requestbin/static/less/buttons.less b/app/requestbin/static/less/buttons.less similarity index 100% rename from requestbin/static/less/buttons.less rename to app/requestbin/static/less/buttons.less diff --git a/requestbin/static/less/carousel.less b/app/requestbin/static/less/carousel.less similarity index 100% rename from requestbin/static/less/carousel.less rename to app/requestbin/static/less/carousel.less diff --git a/requestbin/static/less/close.less b/app/requestbin/static/less/close.less similarity index 100% rename from requestbin/static/less/close.less rename to app/requestbin/static/less/close.less diff --git a/requestbin/static/less/code.less b/app/requestbin/static/less/code.less similarity index 100% rename from requestbin/static/less/code.less rename to app/requestbin/static/less/code.less diff --git a/requestbin/static/less/component-animations.less b/app/requestbin/static/less/component-animations.less similarity index 100% rename from requestbin/static/less/component-animations.less rename to app/requestbin/static/less/component-animations.less diff --git a/requestbin/static/less/custom.less b/app/requestbin/static/less/custom.less similarity index 100% rename from requestbin/static/less/custom.less rename to app/requestbin/static/less/custom.less diff --git a/requestbin/static/less/dropdowns.less b/app/requestbin/static/less/dropdowns.less similarity index 100% rename from requestbin/static/less/dropdowns.less rename to app/requestbin/static/less/dropdowns.less diff --git a/requestbin/static/less/forms.less b/app/requestbin/static/less/forms.less similarity index 100% rename from requestbin/static/less/forms.less rename to app/requestbin/static/less/forms.less diff --git a/requestbin/static/less/grid.less b/app/requestbin/static/less/grid.less similarity index 100% rename from requestbin/static/less/grid.less rename to app/requestbin/static/less/grid.less diff --git a/requestbin/static/less/hero-unit.less b/app/requestbin/static/less/hero-unit.less similarity index 100% rename from requestbin/static/less/hero-unit.less rename to app/requestbin/static/less/hero-unit.less diff --git a/requestbin/static/less/labels-badges.less b/app/requestbin/static/less/labels-badges.less similarity index 100% rename from requestbin/static/less/labels-badges.less rename to app/requestbin/static/less/labels-badges.less diff --git a/requestbin/static/less/layouts.less b/app/requestbin/static/less/layouts.less similarity index 100% rename from requestbin/static/less/layouts.less rename to app/requestbin/static/less/layouts.less diff --git a/requestbin/static/less/media.less b/app/requestbin/static/less/media.less similarity index 100% rename from requestbin/static/less/media.less rename to app/requestbin/static/less/media.less diff --git a/requestbin/static/less/mixins.less b/app/requestbin/static/less/mixins.less similarity index 100% rename from requestbin/static/less/mixins.less rename to app/requestbin/static/less/mixins.less diff --git a/requestbin/static/less/modals.less b/app/requestbin/static/less/modals.less similarity index 100% rename from requestbin/static/less/modals.less rename to app/requestbin/static/less/modals.less diff --git a/requestbin/static/less/navbar.less b/app/requestbin/static/less/navbar.less similarity index 100% rename from requestbin/static/less/navbar.less rename to app/requestbin/static/less/navbar.less diff --git a/requestbin/static/less/navs.less b/app/requestbin/static/less/navs.less similarity index 100% rename from requestbin/static/less/navs.less rename to app/requestbin/static/less/navs.less diff --git a/requestbin/static/less/pager.less b/app/requestbin/static/less/pager.less similarity index 100% rename from requestbin/static/less/pager.less rename to app/requestbin/static/less/pager.less diff --git a/requestbin/static/less/pagination.less b/app/requestbin/static/less/pagination.less similarity index 100% rename from requestbin/static/less/pagination.less rename to app/requestbin/static/less/pagination.less diff --git a/requestbin/static/less/popovers.less b/app/requestbin/static/less/popovers.less similarity index 100% rename from requestbin/static/less/popovers.less rename to app/requestbin/static/less/popovers.less diff --git a/requestbin/static/less/progress-bars.less b/app/requestbin/static/less/progress-bars.less similarity index 100% rename from requestbin/static/less/progress-bars.less rename to app/requestbin/static/less/progress-bars.less diff --git a/requestbin/static/less/reset.less b/app/requestbin/static/less/reset.less similarity index 100% rename from requestbin/static/less/reset.less rename to app/requestbin/static/less/reset.less diff --git a/requestbin/static/less/responsive-1200px-min.less b/app/requestbin/static/less/responsive-1200px-min.less similarity index 100% rename from requestbin/static/less/responsive-1200px-min.less rename to app/requestbin/static/less/responsive-1200px-min.less diff --git a/requestbin/static/less/responsive-767px-max.less b/app/requestbin/static/less/responsive-767px-max.less similarity index 100% rename from requestbin/static/less/responsive-767px-max.less rename to app/requestbin/static/less/responsive-767px-max.less diff --git a/requestbin/static/less/responsive-768px-979px.less b/app/requestbin/static/less/responsive-768px-979px.less similarity index 100% rename from requestbin/static/less/responsive-768px-979px.less rename to app/requestbin/static/less/responsive-768px-979px.less diff --git a/requestbin/static/less/responsive-navbar.less b/app/requestbin/static/less/responsive-navbar.less similarity index 100% rename from requestbin/static/less/responsive-navbar.less rename to app/requestbin/static/less/responsive-navbar.less diff --git a/requestbin/static/less/responsive-utilities.less b/app/requestbin/static/less/responsive-utilities.less similarity index 100% rename from requestbin/static/less/responsive-utilities.less rename to app/requestbin/static/less/responsive-utilities.less diff --git a/requestbin/static/less/responsive.less b/app/requestbin/static/less/responsive.less similarity index 100% rename from requestbin/static/less/responsive.less rename to app/requestbin/static/less/responsive.less diff --git a/requestbin/static/less/scaffolding.less b/app/requestbin/static/less/scaffolding.less similarity index 100% rename from requestbin/static/less/scaffolding.less rename to app/requestbin/static/less/scaffolding.less diff --git a/requestbin/static/less/sprites.less b/app/requestbin/static/less/sprites.less similarity index 100% rename from requestbin/static/less/sprites.less rename to app/requestbin/static/less/sprites.less diff --git a/requestbin/static/less/styles.less b/app/requestbin/static/less/styles.less similarity index 100% rename from requestbin/static/less/styles.less rename to app/requestbin/static/less/styles.less diff --git a/requestbin/static/less/tables.less b/app/requestbin/static/less/tables.less similarity index 100% rename from requestbin/static/less/tables.less rename to app/requestbin/static/less/tables.less diff --git a/requestbin/static/less/thumbnails.less b/app/requestbin/static/less/thumbnails.less similarity index 100% rename from requestbin/static/less/thumbnails.less rename to app/requestbin/static/less/thumbnails.less diff --git a/requestbin/static/less/tooltip.less b/app/requestbin/static/less/tooltip.less similarity index 100% rename from requestbin/static/less/tooltip.less rename to app/requestbin/static/less/tooltip.less diff --git a/requestbin/static/less/type.less b/app/requestbin/static/less/type.less similarity index 100% rename from requestbin/static/less/type.less rename to app/requestbin/static/less/type.less diff --git a/requestbin/static/less/utilities.less b/app/requestbin/static/less/utilities.less similarity index 100% rename from requestbin/static/less/utilities.less rename to app/requestbin/static/less/utilities.less diff --git a/requestbin/static/less/variables.less b/app/requestbin/static/less/variables.less similarity index 100% rename from requestbin/static/less/variables.less rename to app/requestbin/static/less/variables.less diff --git a/requestbin/static/less/wells.less b/app/requestbin/static/less/wells.less similarity index 100% rename from requestbin/static/less/wells.less rename to app/requestbin/static/less/wells.less diff --git a/requestbin/static/lock.png b/app/requestbin/static/lock.png similarity index 100% rename from requestbin/static/lock.png rename to app/requestbin/static/lock.png diff --git a/requestbin/static/robots.txt b/app/requestbin/static/robots.txt similarity index 100% rename from requestbin/static/robots.txt rename to app/requestbin/static/robots.txt diff --git a/requestbin/storage/__init__.py b/app/requestbin/storage/__init__.py similarity index 100% rename from requestbin/storage/__init__.py rename to app/requestbin/storage/__init__.py diff --git a/requestbin/storage/memory.py b/app/requestbin/storage/memory.py similarity index 92% rename from requestbin/storage/memory.py rename to app/requestbin/storage/memory.py index 8e8f54b..b99636b 100644 --- a/requestbin/storage/memory.py +++ b/app/requestbin/storage/memory.py @@ -27,8 +27,8 @@ def _expire_bins(self): if bin.created < expiry: self.bins.pop(name) - def create_bin(self, private=False): - bin = Bin(private) + def create_bin(self, private=False, key = ''): + bin = Bin(private, key) self.bins[bin.name] = bin return self.bins[bin.name] diff --git a/requestbin/storage/redis.py b/app/requestbin/storage/redis.py similarity index 95% rename from requestbin/storage/redis.py rename to app/requestbin/storage/redis.py index ae0df9a..c1cb266 100644 --- a/requestbin/storage/redis.py +++ b/app/requestbin/storage/redis.py @@ -22,8 +22,8 @@ def _key(self, name): def _request_count_key(self): return '{}-requests'.format(self.prefix) - def create_bin(self, private=False): - bin = Bin(private) + def create_bin(self, private=False, key = ''): + bin = Bin(private, key) key = self._key(bin.name) self.redis.set(key, bin.dump()) self.redis.expireat(key, int(bin.created+self.bin_ttl)) diff --git a/requestbin/templates/bin.html b/app/requestbin/templates/bin.html similarity index 100% rename from requestbin/templates/bin.html rename to app/requestbin/templates/bin.html diff --git a/requestbin/templates/doc.html b/app/requestbin/templates/doc.html similarity index 100% rename from requestbin/templates/doc.html rename to app/requestbin/templates/doc.html diff --git a/requestbin/templates/home.html b/app/requestbin/templates/home.html similarity index 100% rename from requestbin/templates/home.html rename to app/requestbin/templates/home.html diff --git a/requestbin/templates/layout.html b/app/requestbin/templates/layout.html similarity index 100% rename from requestbin/templates/layout.html rename to app/requestbin/templates/layout.html diff --git a/requestbin/util.py b/app/requestbin/util.py similarity index 100% rename from requestbin/util.py rename to app/requestbin/util.py diff --git a/requestbin/views.py b/app/requestbin/views.py similarity index 100% rename from requestbin/views.py rename to app/requestbin/views.py diff --git a/requirements.txt b/app/requirements.txt similarity index 100% rename from requirements.txt rename to app/requirements.txt diff --git a/runtime.txt b/app/runtime.txt similarity index 100% rename from runtime.txt rename to app/runtime.txt diff --git a/setup.py b/app/setup.py similarity index 100% rename from setup.py rename to app/setup.py diff --git a/web.py b/app/web.py similarity index 100% rename from web.py rename to app/web.py