(noun)
Pronunciation: /ˈpɑːrli/
Definition: A formal discussion or negotiation between parties, especially enemies, typically to resolve a conflict or dispute peacefully. It often implies a temporary truce or cessation of hostilities to facilitate dialogue.
Example Sentence: The warring factions agreed to a parley at the neutral ground to seek a diplomatic solution to their long-standing conflict.
The motivation behind this software is simple: to develop a completely static
HTML Form that can be deployed anywhere (including on GitHub Pages), to allow
for simple configuration (i.e. no need to edit the web source directly) using
a JSON file (config.json
), and for the software to be RIGOROUSLY tested
(using pytest
) to prove the features work. That is what Parley
is about: a
"once for all" solution for those who need a simple, testable, and stable
form solution now.
Here we will attempt to list all the features that are available and tested in the software:
-
configuration through JSON: the website is meant to be configured/customized through the
config.json
file (see below). -
HTML in configurable text: all text meant to be configured through the
config.json
file work with HTML tags (includinginstructions
, andquestion
labels):{ "instructions": "<i>All</i> work and <b>NO</b> play make Jack a dull boy.", }
-
multiline strings with arrays: all text meant to be configured through the
config.json
file can be of type string or type array (i.e.instructions
, andquestion
labels):{ "questions": [ { "label": [ "This is a very long question that could span multiple lines and easily", "extend off the page. It can also have an", "<a href='https://developer.mozilla.org/en-US/docs/Web/HTML'>HTML Link</a>", "embedded into it as mentioned in the previous feature explanation.", "You can easily write LONG LONG questions and style or add links to the", "questions using <b>HTML syntax</b>." ], "name": "message", "type": "textarea", "required": true } ] }
-
custom usage instructions: the instructions for using the form have been made configurable through the
config.json
file, allowing for a custom usage message to be supplied to the client. -
email in usage instructions by adding HTML tag with the
class
property set toemail-placeholder
placeholder, your email will be extracted from theconfig.json
file and rendered into the text:Send form to: <strong class='email-placeholder'>[Email Address]</strong>.
Here we outline the Parley
software's intended use. Specifically we will go over
the config.json
schema and what is supported vs. disallowed.
Below is a minimal configuration of the Parley
software:
{
"instructions": "Your custom form usage instructions",
"subject": "Your Form Subject",
"title": "Your Custom Title",
"send_button_text": "Custom Submit Text",
"download_button_text": "Custom Download Text",
"missing_field_message": "Custom Missing Field Alert Message",
"enable_form_download": true,
"form_backend_url": null,
"ignore_file_upload": false,
"email": "[email protected]",
"questions": [
{
"label": "Message",
"name": "message",
"type": "textarea",
"required": true
}
]
}
The above example config file is written in JSON, and each attribute will be explained below in more detail (NOTE: attributes with a * mark are required):
instructions
: The (optional) custom form usage instructions.subject
(*): The email subject that will be submitted by the form.title
(*): The text that will be set in the title element.send_button_text
: Set custom text for send button (optional).download_button_text
: Set custom text for download buttin (optional).missing_field_message
: Set custom missing field alert text (optional).enable_form_download
: Allow form to be downloaded (optional).form_backend_url
: The (optional) form backend URL for submitting forms to.ignore_file_upload
: When true files will not be uploaded (optional).email
: The (optional) email used by the mailto attribute and used in the instructions above the form.questions
(*): The questions used to dynamically populate the form.label
(*): The actual question text placed above the form input field.name
(*): The variable name used as the "key" in the form submission query string.type
(*): The type of input to expect from the user (discussed below).required
(*): Questions with this value set to true must be answered before form will submit.
As discussed above, there are a few different input types currently available. These are listed below:
date
datetime-local
email
file
number
selectbox
tel
text
textarea
time
url
Information describing these types can be found in the MDN Input Element Docs,1
except for selectbox
and textarea
which are custom input types.
While setting the input type to textarea
simply allows you to use a
textarea element (as opposed to an input element of type text
), setting the
input type to selectbox
is a little more interesting:
{
"subject": "Your Form Subject",
"title": "Your Custom Title",
"form_backend_url": null,
"email": "[email protected]",
"questions": [
{
"label": "Select your country",
"name": "country",
"type": "selectbox",
"required": true,
"options": [
{"label": "--Select--", "value": "", "selected": true, "disabled": true},
{"label": "USA", "value": "USA"},
{"label": "Canada", "value": "CAN"},
{"label": "United Kingdom", "value": "UK"},
{"label": "Australia", "value": "AUS"}
],
"custom": {
"multiple": true
}
}
]
}
When using the selectbox
input type, you now have access to the options
attribute,
where you can set the different options that will be "selectable" by the user. Each
option has 4 possible attributes (NOTE: attributes with a * mark are
required):
label
(*): The text displayed to the user in the selectbox.value
(*): The text sent upon form submission in the "query string".selected
: A boolean value that initializes this option as selected by default.disabled
: A boolean value that prohibits the user from selecting this option.
While you can set the options
attribute in the config.json
file for a question
without setting the type to selectbox
, nothing will happen but the website should
function normally.
You will notice in the above section the presence of a custom
attribute:
{
"custom": {
"multiple": true
}
}
The role of this attribute is to configure ANY additional attributes related to the form input element you are using for your "question." In this case we are setting the multiple attribute to true for the select element (so that the user can select multiple options in the selectbox).
Here we introduce the various tools related to developing the Parley
software.
A Makefile
is available in the project root, and implements several commands to
make the development process easier. All commands are executed by the following
format: make [COMMAND]
. To see the contents of a command that will be executed upon
invocation of the command, simply run make -n [COMMAND]
(NOTE: this serves as a
good way to test a command and see what exactly will be executed before running the
command). Below is the list of the commands and their short descriptions:
build
: Build the Docker imageserve
: Serve the websiteserver-container
: Build server containerpause
: Pause 1 second (to pause between commands)address
: Get Docker container address/portstop-server
: Stop the running web serverrestart-server
: Restart the running web serverlint
: Run linterstest
: Run full testing suitepytest
: Run pytest in Docker containerisort
: Run isort in Docker containerblack
: Run black in Docker containerflake8
: Run flake8 in Docker containermypy
: Run mypy in Docker containershell
: Create interactive shell in Docker container
Here we will show some common use cases for the Makefile
:
-
serve the website locally: running the
make serve
will serve the website and print out the host/address to your terminal. -
test the website locally: running the
make pytest
will run ONLY the Python tests (written with pytest) on the current website. -
build docker image: running
make build
will build theghcr.io/diogenesanalytics/parley:master
Docker image locally. -
stop the web server: running
make stop-server
will stop any currently running server deployed bymake serve
. -
get local server address: running
make address
will get the host/port for the server deployed previously bymake serve
(if any exist). -
run specific tests: running
make shell
will allow start up a bash instance inside theghcr.io/diogenesanalytics/parley:master
Docker image, from which you can then run a specific subset of tests (e.g.pytest -m website
).