From ca359925febd231e4a805874ce31c43e8d643b3b Mon Sep 17 00:00:00 2001 From: Felix Lohmeier Date: Mon, 3 Aug 2020 19:09:39 +0200 Subject: [PATCH] tests for commands --- .gitignore | 2 + tests.sh | 31 +- tests/apply-utf8.sh | 57 + tests/apply.sh | 57 + tests/cli_bash.ipynb | 819 ----- tests/cli_python2.ipynb | 2824 ----------------- tests/create-csv.sh | 12 +- tests/create-utf8.sh | 36 + tests/data/duplicates.csv | 22 +- tests/data/duplicates.json | 92 - tests/data/duplicates.ods | Bin 13949 -> 0 bytes tests/data/duplicates.tsv | 11 - tests/data/duplicates.txt | 11 - tests/data/duplicates.xls | Bin 7680 -> 0 bytes tests/data/duplicates.xlsx | Bin 5672 -> 0 bytes tests/data/duplicates.xml | 93 - tests/data/duplicates.zip | Bin 1082 -> 0 bytes tests/data/duplicates1.xml | 10 - tests/data/duplicates2.ods | Bin 12139 -> 0 bytes tests/data/duplicates2.xls | Bin 10752 -> 0 bytes tests/data/duplicates2.xlsx | Bin 7802 -> 0 bytes tests/data/duplicates_old.csv | 11 - ...dữ liệu biểu tượng cảm xúc.txt | 1315 -------- tests/data/evil-fruits.tsv | 6 - tests/delete-utf8.sh | 35 + tests/delete.sh | 35 + tests/download.sh | 21 + tests/export-filename-utf8.sh | 36 + tests/export-filename.sh | 36 + tests/export-utf8.sh | 44 + tests/export.sh | 36 + tests/help.sh | 169 + tests/info-utf8.sh | 39 + tests/info.sh | 35 + tests/list.sh | 35 + tests/template | 23 +- tests/templating-filter-utf8.sh | 54 + tests/templating-filter.sh | 59 + tests/templating-split-id-utf8.sh | 52 + tests/templating-split-id.sh | 58 + tests/templating-split-utf8.sh | 51 + tests/templating-split.sh | 57 + tests/templating-utf8.sh | 54 + tests/templating.sh | 64 + tests/usage.sh | 28 + 45 files changed, 1202 insertions(+), 5228 deletions(-) create mode 100755 tests/apply-utf8.sh create mode 100755 tests/apply.sh delete mode 100644 tests/cli_bash.ipynb delete mode 100644 tests/cli_python2.ipynb create mode 100755 tests/create-utf8.sh delete mode 100644 tests/data/duplicates.json delete mode 100644 tests/data/duplicates.ods delete mode 100644 tests/data/duplicates.tsv delete mode 100644 tests/data/duplicates.txt delete mode 100644 tests/data/duplicates.xls delete mode 100644 tests/data/duplicates.xlsx delete mode 100644 tests/data/duplicates.xml delete mode 100644 tests/data/duplicates.zip delete mode 100644 tests/data/duplicates1.xml delete mode 100644 tests/data/duplicates2.ods delete mode 100644 tests/data/duplicates2.xls delete mode 100644 tests/data/duplicates2.xlsx delete mode 100644 tests/data/duplicates_old.csv delete mode 100644 tests/data/dữ liệu biểu tượng cảm xúc.txt delete mode 100644 tests/data/evil-fruits.tsv create mode 100755 tests/delete-utf8.sh create mode 100755 tests/delete.sh create mode 100755 tests/download.sh create mode 100755 tests/export-filename-utf8.sh create mode 100755 tests/export-filename.sh create mode 100755 tests/export-utf8.sh create mode 100755 tests/export.sh create mode 100755 tests/help.sh create mode 100755 tests/info-utf8.sh create mode 100755 tests/info.sh create mode 100755 tests/list.sh create mode 100755 tests/templating-filter-utf8.sh create mode 100755 tests/templating-filter.sh create mode 100755 tests/templating-split-id-utf8.sh create mode 100755 tests/templating-split-id.sh create mode 100755 tests/templating-split-utf8.sh create mode 100755 tests/templating-split.sh create mode 100755 tests/templating-utf8.sh create mode 100755 tests/templating.sh create mode 100755 tests/usage.sh diff --git a/.gitignore b/.gitignore index 6e6d7a1..5be8612 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,7 @@ dist .* openrefine_client.egg-info refine.spec +openrefine-2.* openrefine-3.* +openrefine-client_* tests.log diff --git a/tests.sh b/tests.sh index cd7047f..34b6491 100755 --- a/tests.sh +++ b/tests.sh @@ -20,14 +20,22 @@ cd "${BASH_SOURCE%/*}/" || exit 1 +port=3334 + if [[ ${1} ]]; then version="${1}" else version="3.2" fi - refine="openrefine-${version}/refine" +if [[ ${2} ]]; then + client="$(readlink -e "${2}")" +else + client="python3 $(readlink -e refine.py)" +fi +cmd="${client} -H localhost -P ${port}" + # =============================== REQUIREMENTS =============================== # # check existence of java and cURL @@ -66,7 +74,7 @@ mkdir -p "${dir}" rm -f tests.log echo "start OpenRefine server..." -${refine} -v warn -p 3334 -d "${dir}" &>> tests.log & +${refine} -v warn -p ${port} -d "${dir}" &>> tests.log & pid_server=${!} timeout 30s bash -c "until curl -s 'http://localhost:3334' \ | cat | grep -q -o 'OpenRefine' ; do sleep 1; done" \ @@ -81,16 +89,23 @@ results=() for t in tests/*.sh; do tests+=("${t}") echo "========================= ${t} =========================" &>> tests.log - ${t} ${version} >> tests.log + ${t} "${cmd}" "${version}" &>> tests.log results+=(${?}) done echo +# ================================= TEARDOWN ================================= # + +echo "cleanup..." +{ kill -9 "${pid_server}" && wait "${pid_server}"; } 2>/dev/null +rm -rf "${dir}" +echo + # ================================= SUMMARY ================================== # +printf "%s\t%s\n" "code" "test" +printf "%s\t%s\n" "----" "----------------" for i in "${!tests[@]}"; do - printf "%s\t%s\n" "code" "test" - printf "%s\t%s\n" "----" "----------------" printf "%s\t%s\n" "${results[$i]}" "${tests[$i]}" done echo @@ -99,9 +114,3 @@ if [[ " ${results[*]} " =~ [1-9] ]]; then else echo "all tests passed!"; echo fi - -# ================================= TEARDOWN ================================= # - -echo "cleanup..." -{ kill -9 "${pid_server}" && wait "${pid_server}"; } 2>/dev/null -rm -rf "${dir}" diff --git a/tests/apply-utf8.sh b/tests/apply-utf8.sh new file mode 100755 index 0000000..750dff9 --- /dev/null +++ b/tests/apply-utf8.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +a,b,c +1,2,3 +0,0,0 +$,\,' +DATA + +cat << "DATA" > "tmp/${t}/${t}.transform" +[ + { + "op": "core/column-addition", + "engineConfig": { + "mode": "row-based" + }, + "newColumnName": "apply", + "columnInsertIndex": 2, + "baseColumnName": "b", + "expression": "grel:value.replace('2','٩(͡๏̯͡๏)۶')", + "onError": "set-to-blank" + } +] +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +a b apply c +1 2 ٩(͡๏̯͡๏)۶ 3 +0 0 0 0 +$ \ \ ' +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --apply "tmp/${t}/${t}.transform" "${t}" +${cmd} --export "${t}" --output "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/apply.sh b/tests/apply.sh new file mode 100755 index 0000000..dfdb73a --- /dev/null +++ b/tests/apply.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +a,b,c +1,2,3 +0,0,0 +$,\,' +DATA + +cat << "DATA" > "tmp/${t}/${t}.transform" +[ + { + "op": "core/column-addition", + "engineConfig": { + "mode": "row-based" + }, + "newColumnName": "apply", + "columnInsertIndex": 2, + "baseColumnName": "b", + "expression": "grel:value.replace('2','TEST')", + "onError": "set-to-blank" + } +] +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +a b apply c +1 2 TEST 3 +0 0 0 0 +$ \ \ ' +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --apply "tmp/${t}/${t}.transform" "${t}" +${cmd} --export "${t}" --output "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/cli_bash.ipynb b/tests/cli_bash.ipynb deleted file mode 100644 index 5e4ca86..0000000 --- a/tests/cli_bash.ipynb +++ /dev/null @@ -1,819 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test executable in a Linux Bash environment" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Install\n", - "\n", - "This notebook requires a [Bash kernel](https://github.com/takluyver/bash_kernel) environment and an OpenRefine server running at http://127.0.0.1:3333." - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/tmp/20190822_013937\n" - ] - } - ], - "source": [ - "workspace=$(date +%Y%m%d_%H%M%S)\n", - "mkdir -p /tmp/$workspace\n", - "cp -r data /tmp/$workspace\n", - "cd /tmp/$workspace && pwd" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "https://github.com/opencultureconsulting/openrefine-client/releases/download/v0.3.8/openrefine-client_0-3-8_linux:\n", - "2019-08-22 01:39:40 ERROR 404: Not Found.\n" - ] - } - ], - "source": [ - "wget -nv https://github.com/opencultureconsulting/openrefine-client/releases/download/v0.3.8/openrefine-client_0-3-8_linux -O openrefine-client\n", - "chmod +x openrefine-client" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## README.MD" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Download" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Download to file duplicates.csv complete\n" - ] - } - ], - "source": [ - "./openrefine-client --download \"https://git.io/fj5hF\" --output=duplicates.csv" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2334935475634\n", - "rows: 10\n" - ] - } - ], - "source": [ - "./openrefine-client --create duplicates.csv" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### List" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 2334935475634: duplicates\n" - ] - } - ], - "source": [ - "./openrefine-client --list" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Info" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " id: 2334935475634\n", - " url: http://127.0.0.1:3333/project?project=2334935475634\n", - " name: duplicates\n", - " modified: 2019-08-21T23:40:30Z\n", - " created: 2019-08-21T23:40:30Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'duplicates.csv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: email\n", - " column 002: name\n", - " column 003: state\n", - " column 004: gender\n", - " column 005: purchase\n" - ] - } - ], - "source": [ - "./openrefine-client --info \"duplicates\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Export" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "email\tname\tstate\tgender\tpurchase\n", - "danny.baron@example1.com\tDanny Baron\tCA\tM\tTV\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\tiPhone\n", - "danny.baron@example1.com\tD. Baron\tCA\tM\tWinter jacket\n", - "ben.tyler@example3.org\tBen Tyler\tNV\tM\tFlashlight\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tDining table\n", - "danny.baron@example1.com\tDaniel Baron\tCA\tM\tBike\n", - "jean.griffith@example5.org\tJean Griffith\tWA\tF\tPower drill\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\tiPad\n", - "ben.morisson@example6.org\tBen Morisson\tFL\tM\tAmplifier\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tNight table\n" - ] - } - ], - "source": [ - "./openrefine-client --export \"duplicates\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Apply" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Download to file duplicates-deletion.json complete\n" - ] - } - ], - "source": [ - "./openrefine-client --download \"https://git.io/fj5ju\" --output=duplicates-deletion.json" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File duplicates-deletion.json has been successfully applied to project 2334935475634\n" - ] - } - ], - "source": [ - "./openrefine-client --apply duplicates-deletion.json \"duplicates\"" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "email\tcount\tname\tstate\tgender\tpurchase\n", - "arthur.duff@example4.com\t2\tArthur Duff\tOR\tM\tDining table\n", - "ben.morisson@example6.org\t1\tBen Morisson\tFL\tM\tAmplifier\n", - "ben.tyler@example3.org\t1\tBen Tyler\tNV\tM\tFlashlight\n", - "danny.baron@example1.com\t3\tDanny Baron\tCA\tM\tTV\n", - "jean.griffith@example5.org\t1\tJean Griffith\tWA\tF\tPower drill\n", - "melanie.white@example2.edu\t2\tMelanie White\tNC\tF\tiPhone\n" - ] - } - ], - "source": [ - "./openrefine-client --export \"duplicates\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Export XLS" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Export to file deduped.xls complete\n" - ] - } - ], - "source": [ - "./openrefine-client --export \"duplicates\" --output deduped.xls" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Delete" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Project 2334935475634 has been successfully deleted\n" - ] - } - ], - "source": [ - "./openrefine-client --delete \"duplicates\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Templating" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1633409429491\n", - "rows: 10\n" - ] - } - ], - "source": [ - "./openrefine-client --create duplicates.csv --projectName=advanced" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{ \"events\" : [\n", - " { \"name\" : \"Melanie White\", \"purchase\" : \"iPhone\" },\n", - " { \"name\" : \"Jean Griffith\", \"purchase\" : \"Power drill\" },\n", - " { \"name\" : \"Melanie White\", \"purchase\" : \"iPad\" }\n", - "] }" - ] - } - ], - "source": [ - "./openrefine-client --export \"advanced\" \\\n", - "--prefix='{ \"events\" : [\n", - "' \\\n", - "--template=' { \"name\" : {{jsonize(cells[\"name\"].value)}}, \"purchase\" : {{jsonize(cells[\"purchase\"].value)}} }' \\\n", - "--rowSeparator=',\n", - "' \\\n", - "--suffix='\n", - "] }' \\\n", - "--filterQuery='^F$' \\\n", - "--filterColumn='gender'" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Export to files complete. Last file: advanced_3.json\n" - ] - } - ], - "source": [ - "./openrefine-client --export \"advanced\" \\\n", - "--prefix='{ \"events\" : [\n", - "' \\\n", - "--template=' { \"name\" : {{jsonize(cells[\"name\"].value)}}, \"purchase\" : {{jsonize(cells[\"purchase\"].value)}} }' \\\n", - "--rowSeparator=',\n", - "' \\\n", - "--suffix='\n", - "] }' \\\n", - "--filterQuery='^F$' \\\n", - "--filterColumn='gender' \\\n", - "--output=advanced.json \\\n", - "--splitToFiles=true" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Export to files complete. Last file: advanced_melanie.white@example2.edu.json\n" - ] - } - ], - "source": [ - "./openrefine-client --export \"advanced\" \\\n", - "--prefix='{ \"events\" : [\n", - "' \\\n", - "--template=' { \"name\" : {{jsonize(cells[\"name\"].value)}}, \"purchase\" : {{jsonize(cells[\"purchase\"].value)}} }' \\\n", - "--rowSeparator=',\n", - "' \\\n", - "--suffix='\n", - "] }' \\\n", - "--filterQuery='^F$' \\\n", - "--filterColumn='gender' \\\n", - "--output=advanced.json \\\n", - "--splitToFiles=true \\\n", - "--suffixById=true" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "advanced_1.json \u001b[0m\u001b[38;5;33mdata\u001b[0m\n", - "advanced_2.json deduped.xls\n", - "advanced_3.json duplicates.csv\n", - "advanced_jean.griffith@example5.org.json duplicates-deletion.json\n", - "advanced_melanie.white@example2.edu.json \u001b[38;5;40mopenrefine-client\u001b[0m\n" - ] - } - ], - "source": [ - "ls" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Delete" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Project 1633409429491 has been successfully deleted\n" - ] - } - ], - "source": [ - "./openrefine-client --delete \"advanced\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Unicode" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### fruits" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2280962953279\n", - "rows: 5\n", - " id: 2280962953279\n", - " url: http://127.0.0.1:3333/project?project=2280962953279\n", - " name: evil-fruits\n", - " modified: 2019-08-21T23:40:43Z\n", - " created: 2019-08-21T23:40:43Z\n", - " rowCount: 5\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/evil-fruits.tsv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'evil-fruits', u'processQuotes': True, u'limit': -1, u'trimStrings': False, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: 🔣\n", - " column 002: code\n", - " column 003: meaning\n", - "🔣\tcode\tmeaning\n", - "🍇\t1F347\tGRAPES\n", - "🍉\t1F349\tWATERMELON\n", - "🍒\t1F352\tCHERRIES\n", - "🍓\t1F353\tSTRAWBERRY\n", - "🍍\t1F34D\tPINEAPPLE\n" - ] - } - ], - "source": [ - "./openrefine-client --create data/cli/evil-fruits.tsv\n", - "./openrefine-client --info \"evil-fruits\"\n", - "./openrefine-client --export \"evil-fruits\"" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Export to file emojis.csv complete\n", - "🔣,code,meaning\n", - "🍇,1F347,GRAPES\n", - "🍉,1F349,WATERMELON\n", - "🍒,1F352,CHERRIES\n", - "🍓,1F353,STRAWBERRY\n", - "🍍,1F34D,PINEAPPLE\n" - ] - } - ], - "source": [ - "./openrefine-client --export \"evil-fruits\" --output emojis.csv\n", - "cat emojis.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{ \"emojis\" : [\n", - " { \"symbol\" : \"🍇\", \"meaning\" : \"GRAPES\" },\n", - " { \"symbol\" : \"🍉\", \"meaning\" : \"WATERMELON\" },\n", - " { \"symbol\" : \"🍍\", \"meaning\" : \"PINEAPPLE\" }\n", - "] }" - ] - } - ], - "source": [ - "./openrefine-client --export \"evil-fruits\" \\\n", - "--prefix='{ \"emojis\" : [\n", - "' \\\n", - "--template=' { \"symbol\" : {{jsonize(with(row.columnNames[0],cn,cells[cn].value))}}, \"meaning\" : {{jsonize(cells[\"meaning\"].value)}} }' \\\n", - "--rowSeparator=',\n", - "' \\\n", - "--suffix='\n", - "] }' \\\n", - "--filterQuery='^1F34' \\\n", - "--filterColumn='code'" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Export to files complete. Last file: trái cây_3.json\n" - ] - } - ], - "source": [ - "./openrefine-client --export \"evil-fruits\" \\\n", - "--prefix='{ \"emojis\" : [\n", - "' \\\n", - "--template=' { \"symbol\" : {{jsonize(with(row.columnNames[0],cn,cells[cn].value))}}, \"meaning\" : {{jsonize(cells[\"meaning\"].value)}} }' \\\n", - "--rowSeparator=',\n", - "' \\\n", - "--suffix='\n", - "] }' \\\n", - "--filterQuery='^1F34' \\\n", - "--filterColumn='code' \\\n", - "--output='trái cây.json' \\\n", - "--splitToFiles=true" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Export to files complete. Last file: trái cây_🍍.json\n" - ] - } - ], - "source": [ - "./openrefine-client --export \"evil-fruits\" \\\n", - "--prefix='{ \"emojis\" : [\n", - "' \\\n", - "--template=' { \"symbol\" : {{jsonize(with(row.columnNames[0],cn,cells[cn].value))}}, \"meaning\" : {{jsonize(cells[\"meaning\"].value)}} }' \\\n", - "--rowSeparator=',\n", - "' \\\n", - "--suffix='\n", - "] }' \\\n", - "--filterQuery='^1F34' \\\n", - "--filterColumn='code' \\\n", - "--output='trái cây.json' \\\n", - "--splitToFiles=true \\\n", - "--suffixById=true" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " advanced_1.json emojis.csv\n", - " advanced_2.json \u001b[0m\u001b[38;5;40mopenrefine-client\u001b[0m\n", - " advanced_3.json 'trái cây_1.json'\n", - " advanced_jean.griffith@example5.org.json 'trái cây_2.json'\n", - " advanced_melanie.white@example2.edu.json 'trái cây_3.json'\n", - " \u001b[38;5;33mdata\u001b[0m 'trái cây_🍇.json'\n", - " deduped.xls 'trái cây_🍉.json'\n", - " duplicates.csv 'trái cây_🍍.json'\n", - " duplicates-deletion.json\n" - ] - } - ], - "source": [ - "ls" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Project 2280962953279 has been successfully deleted\n" - ] - } - ], - "source": [ - "./openrefine-client --delete \"evil-fruits\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### emoji-data" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2019865211741\n", - "rows: 20\n", - " id: 2019865211741\n", - " url: http://127.0.0.1:3333/project?project=2019865211741\n", - " name: dữ liệu biểu tượng cảm xúc\n", - " modified: 2019-08-21T23:41:06Z\n", - " created: 2019-08-21T23:41:06Z\n", - " rowCount: 20\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/d\\u1eef li\\u1ec7u bi\\u1ec3u t\\u01b0\\u1ee3ng c\\u1ea3m x\\xfac.txt', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'd\\u1eef li\\u1ec7u bi\\u1ec3u t\\u01b0\\u1ee3ng c\\u1ea3m x\\xfac', u'processQuotes': True, u'skipDataLines': 34, u'limit': 20, u'trimStrings': False, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False, u'headerLines': 0}]\n", - " column 001: Column 1\n", - " column 002: Column 2\n", - " column 003: Column 3\n", - " column 004: Column 4\n", - " column 005: Column 5\n", - " column 006: Column 6\n", - "Column 1\tColumn 2\tColumn 3\tColumn 4\tColumn 5\tColumn 6\n", - "00A9 ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (©) COPYRIGHT SIGN\n", - "00AE ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (®) REGISTERED SIGN\n", - "203C ;\ttext ;\tL1 ;\tnone ;\ta j\t# V1.1 (‼) DOUBLE EXCLAMATION MARK\n", - "2049 ;\ttext ;\tL1 ;\tnone ;\ta j\t# V3.0 (⁉) EXCLAMATION QUESTION MARK\n", - "2122 ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (™) TRADE MARK SIGN\n", - "2139 ;\ttext ;\tL1 ;\tnone ;\tj\t# V3.0 (ℹ) INFORMATION SOURCE\n", - "2194 ;\ttext ;\tL1 ;\tnone ;\tz j\t# V1.1 (↔) LEFT RIGHT ARROW\n", - "2195 ;\ttext ;\tL1 ;\tnone ;\tz j\t# V1.1 (↕) UP DOWN ARROW\n", - "2196 ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (↖) NORTH WEST ARROW\n", - "2197 ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (↗) NORTH EAST ARROW\n", - "2198 ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (↘) SOUTH EAST ARROW\n", - "2199 ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (↙) SOUTH WEST ARROW\n", - "21A9 ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (↩) LEFTWARDS ARROW WITH HOOK\n", - "21AA ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (↪) RIGHTWARDS ARROW WITH HOOK\n", - "231A ;\temoji ;\tL1 ;\tnone ;\tj\t# V1.1 (⌚) WATCH\n", - "231B ;\temoji ;\tL1 ;\tnone ;\tj\t# V1.1 (⌛) HOURGLASS\n", - "2328 ;\ttext ;\tL2 ;\tnone ;\tx\t# V1.1 (⌨) KEYBOARD\n", - "23CF ;\ttext ;\tL2 ;\tnone ;\tx\t# V4.0 (⏏) EJECT SYMBOL\n", - "23E9 ;\temoji ;\tL1 ;\tnone ;\tj w\t# V6.0 (⏩) BLACK RIGHT-POINTING DOUBLE TRIANGLE\n", - "23EA ;\temoji ;\tL1 ;\tnone ;\tj w\t# V6.0 (⏪) BLACK LEFT-POINTING DOUBLE TRIANGLE\n" - ] - } - ], - "source": [ - "./openrefine-client --create \"data/cli/dữ liệu biểu tượng cảm xúc.txt\" \\\n", - "--format=tsv \\\n", - "--headerLines=0 \\\n", - "--skipDataLines=34 \\\n", - "--limit=20\n", - "./openrefine-client --info \"dữ liệu biểu tượng cảm xúc\"\n", - "./openrefine-client --export \"dữ liệu biểu tượng cảm xúc\"" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 2019865211741: dữ liệu biểu tượng cảm xúc\n" - ] - } - ], - "source": [ - "./openrefine-client --list" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Delete" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Project 2019865211741 has been successfully deleted\n" - ] - } - ], - "source": [ - "./openrefine-client --delete \"dữ liệu biểu tượng cảm xúc\"" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Bash", - "language": "bash", - "name": "bash" - }, - "language_info": { - "codemirror_mode": "shell", - "file_extension": ".sh", - "mimetype": "text/x-sh", - "name": "bash" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tests/cli_python2.ipynb b/tests/cli_python2.ipynb deleted file mode 100644 index 933ea3c..0000000 --- a/tests/cli_python2.ipynb +++ /dev/null @@ -1,2824 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test module cli in a Python 2 environment" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Install\n", - "\n", - "This notebook requires a Python 2.7 environment and an OpenRefine server running at http://127.0.0.1:3333." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33mDEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support\u001b[0m\n", - "Processing /home/felix/git/openrefine-client\n", - "Requirement already satisfied, skipping upgrade: urllib2_file in /home/felix/.local/lib/python2.7/site-packages (from openrefine-client==0.3.7) (0.2.1)\n", - "Installing collected packages: openrefine-client\n", - " Found existing installation: openrefine-client 0.3.7\n", - " Uninstalling openrefine-client-0.3.7:\n", - " Successfully uninstalled openrefine-client-0.3.7\n", - " Running setup.py install for openrefine-client ... \u001b[?25ldone\n", - "\u001b[?25hSuccessfully installed openrefine-client-0.3.7\n" - ] - } - ], - "source": [ - "import sys\n", - "!{sys.executable} -m pip install .. --user --upgrade" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/tmp/tmp24HyYg\n" - ] - } - ], - "source": [ - "import tempfile\n", - "import shutil\n", - "import os\n", - "dirpath = tempfile.mkdtemp()\n", - "shutil.copytree('data',dirpath + '/data')\n", - "print(dirpath)\n", - "os.chdir(dirpath)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from google.refine import cli" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## README.md" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Download" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Download to file duplicates.csv complete\n" - ] - } - ], - "source": [ - "cli.download('https://git.io/fj5hF','duplicates.csv')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2019539621291\n", - "rows: 10\n" - ] - } - ], - "source": [ - "p1 = cli.create('duplicates.csv')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### List" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 2019539621291: duplicates\n" - ] - } - ], - "source": [ - "cli.ls()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Info" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " id: 2019539621291\n", - " url: http://127.0.0.1:3333/project?project=2019539621291\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:03Z\n", - " created: 2019-08-21T23:31:02Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'duplicates.csv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: email\n", - " column 002: name\n", - " column 003: state\n", - " column 004: gender\n", - " column 005: purchase\n" - ] - } - ], - "source": [ - "cli.info(p1.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Export" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "email\tname\tstate\tgender\tpurchase\n", - "danny.baron@example1.com\tDanny Baron\tCA\tM\tTV\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\tiPhone\n", - "danny.baron@example1.com\tD. Baron\tCA\tM\tWinter jacket\n", - "ben.tyler@example3.org\tBen Tyler\tNV\tM\tFlashlight\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tDining table\n", - "danny.baron@example1.com\tDaniel Baron\tCA\tM\tBike\n", - "jean.griffith@example5.org\tJean Griffith\tWA\tF\tPower drill\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\tiPad\n", - "ben.morisson@example6.org\tBen Morisson\tFL\tM\tAmplifier\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tNight table\n" - ] - } - ], - "source": [ - "cli.export(p1.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Apply" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Download to file duplicates-deletion.json complete\n" - ] - } - ], - "source": [ - "cli.download('https://git.io/fj5ju','duplicates-deletion.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File duplicates-deletion.json has been successfully applied to project 2019539621291\n" - ] - } - ], - "source": [ - "cli.apply(p1.project_id, 'duplicates-deletion.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "email\tcount\tname\tstate\tgender\tpurchase\n", - "arthur.duff@example4.com\t2\tArthur Duff\tOR\tM\tDining table\n", - "ben.morisson@example6.org\t1\tBen Morisson\tFL\tM\tAmplifier\n", - "ben.tyler@example3.org\t1\tBen Tyler\tNV\tM\tFlashlight\n", - "danny.baron@example1.com\t3\tDanny Baron\tCA\tM\tTV\n", - "jean.griffith@example5.org\t1\tJean Griffith\tWA\tF\tPower drill\n", - "melanie.white@example2.edu\t2\tMelanie White\tNC\tF\tiPhone\n" - ] - } - ], - "source": [ - "cli.export(p1.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Export XLS" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "email\tcount\tname\tstate\tgender\tpurchase\n", - "arthur.duff@example4.com\t2\tArthur Duff\tOR\tM\tDining table\n", - "ben.morisson@example6.org\t1\tBen Morisson\tFL\tM\tAmplifier\n", - "ben.tyler@example3.org\t1\tBen Tyler\tNV\tM\tFlashlight\n", - "danny.baron@example1.com\t3\tDanny Baron\tCA\tM\tTV\n", - "jean.griffith@example5.org\t1\tJean Griffith\tWA\tF\tPower drill\n", - "melanie.white@example2.edu\t2\tMelanie White\tNC\tF\tiPhone\n" - ] - } - ], - "source": [ - "cli.export(p1.project_id, 'deduped.xls')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Delete" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Project 2019539621291 has been successfully deleted\n" - ] - } - ], - "source": [ - "cli.delete(p1.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Templating" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1716843473792\n", - "rows: 10\n" - ] - } - ], - "source": [ - "p2 = cli.create('duplicates.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{ \"events\" : [\n", - " { \"name\" : \"Melanie White\", \"purchase\" : \"iPhone\" },\n", - " { \"name\" : \"Jean Griffith\", \"purchase\" : \"Power drill\" },\n", - " { \"name\" : \"Melanie White\", \"purchase\" : \"iPad\" }\n", - "] }" - ] - } - ], - "source": [ - "cli.templating(p2.project_id,\n", - "prefix='''{ \"events\" : [\n", - "''',\n", - "template=' { \"name\" : {{jsonize(cells[\"name\"].value)}}, \"purchase\" : {{jsonize(cells[\"purchase\"].value)}} }',\n", - "rowSeparator=''',\n", - "''',\n", - "suffix='''\n", - "] }''',\n", - "filterQuery='^F$',\n", - "filterColumn='gender')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Export to files complete. Last file: advanced_3.json\n" - ] - } - ], - "source": [ - "cli.templating(p2.project_id,\n", - "prefix='''{ \"events\" : [\n", - "''',\n", - "template=' { \"name\" : {{jsonize(cells[\"name\"].value)}}, \"purchase\" : {{jsonize(cells[\"purchase\"].value)}} }',\n", - "rowSeparator=''',\n", - "''',\n", - "suffix='''\n", - "] }''',\n", - "filterQuery='^F$',\n", - "filterColumn='gender',\n", - "output_file='advanced.json',\n", - "splitToFiles=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Export to files complete. Last file: advanced_melanie.white@example2.edu.json\n" - ] - } - ], - "source": [ - "cli.templating(p2.project_id,\n", - "prefix='''{ \"events\" : [\n", - "''',\n", - "template=' { \"name\" : {{jsonize(cells[\"name\"].value)}}, \"purchase\" : {{jsonize(cells[\"purchase\"].value)}} }',\n", - "rowSeparator=''',\n", - "''',\n", - "suffix='''\n", - "] }''',\n", - "filterQuery='^F$',\n", - "filterColumn='gender',\n", - "output_file='advanced.json',\n", - "splitToFiles=True,\n", - "suffixById=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['advanced_jean.griffith@example5.org.json',\n", - " 'advanced_melanie.white@example2.edu.json',\n", - " 'advanced_3.json',\n", - " 'advanced_2.json',\n", - " 'advanced_1.json',\n", - " 'duplicates-deletion.json',\n", - " 'duplicates.csv',\n", - " 'data']" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "os.listdir(os.getcwd())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Delete" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Project 1716843473792 has been successfully deleted\n" - ] - } - ], - "source": [ - "cli.delete(p2.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Unicode" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### fruits" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1929957235590\n", - "rows: 5\n", - " id: 1929957235590\n", - " url: http://127.0.0.1:3333/project?project=1929957235590\n", - " name: evil-fruits\n", - " modified: 2019-08-21T23:35:47Z\n", - " created: 2019-08-21T23:35:47Z\n", - " rowCount: 5\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/evil-fruits.tsv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'evil-fruits', u'processQuotes': True, u'limit': -1, u'trimStrings': False, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: 🔣\n", - " column 002: code\n", - " column 003: meaning\n", - "🔣\tcode\tmeaning\n", - "🍇\t1F347\tGRAPES\n", - "🍉\t1F349\tWATERMELON\n", - "🍒\t1F352\tCHERRIES\n", - "🍓\t1F353\tSTRAWBERRY\n", - "🍍\t1F34D\tPINEAPPLE\n" - ] - } - ], - "source": [ - "p1 = cli.create('data/cli/evil-fruits.tsv')\n", - "cli.info(p1.project_id)\n", - "cli.export(p1.project_id)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Export to file emojis.csv complete\n", - "🔣,code,meaning\n", - "🍇,1F347,GRAPES\n", - "🍉,1F349,WATERMELON\n", - "🍒,1F352,CHERRIES\n", - "🍓,1F353,STRAWBERRY\n", - "🍍,1F34D,PINEAPPLE\n", - "\n" - ] - } - ], - "source": [ - "cli.export(p1.project_id, output_file='emojis.csv')\n", - "with open('emojis.csv', 'r') as f:\n", - " print(f.read())" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{ \"emojis\" : [\n", - " { \"symbol\" : \"🍇\", \"meaning\" : \"GRAPES\" },\n", - " { \"symbol\" : \"🍉\", \"meaning\" : \"WATERMELON\" },\n", - " { \"symbol\" : \"🍍\", \"meaning\" : \"PINEAPPLE\" }\n", - "] }" - ] - } - ], - "source": [ - "cli.templating(p1.project_id,\n", - "prefix='''{ \"emojis\" : [\n", - "''',\n", - "template=' { \"symbol\" : {{jsonize(with(row.columnNames[0],cn,cells[cn].value))}}, \"meaning\" : {{jsonize(cells[\"meaning\"].value)}} }',\n", - "rowSeparator=''',\n", - "''',\n", - "suffix='''\n", - "] }''',\n", - "filterQuery='^1F34',\n", - "filterColumn='code')" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Export to files complete. Last file: trái cây_3.json\n" - ] - } - ], - "source": [ - "cli.templating(p1.project_id,\n", - "prefix='''{ \"emojis\" : [\n", - "''',\n", - "template=' { \"symbol\" : {{jsonize(with(row.columnNames[0],cn,cells[cn].value))}}, \"meaning\" : {{jsonize(cells[\"meaning\"].value)}} }',\n", - "rowSeparator=''',\n", - "''',\n", - "suffix='''\n", - "] }''',\n", - "filterQuery='^1F34',\n", - "filterColumn='code',\n", - "output_file='trái cây.json',\n", - "splitToFiles=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Export to files complete. Last file: trái cây_🍍.json\n" - ] - } - ], - "source": [ - "cli.templating(p1.project_id,\n", - "prefix='''{ \"emojis\" : [\n", - "''',\n", - "template=' { \"symbol\" : {{jsonize(with(row.columnNames[0],cn,cells[cn].value))}}, \"meaning\" : {{jsonize(cells[\"meaning\"].value)}} }',\n", - "rowSeparator=''',\n", - "''',\n", - "suffix='''\n", - "] }''',\n", - "filterQuery='^1F34',\n", - "filterColumn='code',\n", - "output_file='trái cây.json',\n", - "splitToFiles=True,\n", - "suffixById=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['tr\\xc3\\xa1i c\\xc3\\xa2y_\\xf0\\x9f\\x8d\\x8d.json',\n", - " 'tr\\xc3\\xa1i c\\xc3\\xa2y_\\xf0\\x9f\\x8d\\x89.json',\n", - " 'tr\\xc3\\xa1i c\\xc3\\xa2y_\\xf0\\x9f\\x8d\\x87.json',\n", - " 'tr\\xc3\\xa1i c\\xc3\\xa2y_3.json',\n", - " 'tr\\xc3\\xa1i c\\xc3\\xa2y_2.json',\n", - " 'tr\\xc3\\xa1i c\\xc3\\xa2y_1.json',\n", - " 'emojis.csv',\n", - " 'advanced_jean.griffith@example5.org.json',\n", - " 'advanced_melanie.white@example2.edu.json',\n", - " 'advanced_3.json',\n", - " 'advanced_2.json',\n", - " 'advanced_1.json',\n", - " 'duplicates-deletion.json',\n", - " 'duplicates.csv',\n", - " 'data']" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "os.listdir(os.getcwd())" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Project 2401578251107 has been successfully deleted\n" - ] - } - ], - "source": [ - "cli.delete(p1.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### emoji data" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2314250240290\n", - "rows: 20\n", - " id: 2314250240290\n", - " url: http://127.0.0.1:3333/project?project=2314250240290\n", - " name: dữ liệu biểu tượng cảm xúc\n", - " modified: 2019-08-21T23:36:05Z\n", - " created: 2019-08-21T23:36:05Z\n", - " rowCount: 20\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/d\\u1eef li\\u1ec7u bi\\u1ec3u t\\u01b0\\u1ee3ng c\\u1ea3m x\\xfac.txt', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'd\\u1eef li\\u1ec7u bi\\u1ec3u t\\u01b0\\u1ee3ng c\\u1ea3m x\\xfac', u'processQuotes': True, u'skipDataLines': 34, u'limit': 20, u'trimStrings': False, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False, u'headerLines': 0}]\n", - " column 001: Column 1\n", - " column 002: Column 2\n", - " column 003: Column 3\n", - " column 004: Column 4\n", - " column 005: Column 5\n", - " column 006: Column 6\n", - "Column 1\tColumn 2\tColumn 3\tColumn 4\tColumn 5\tColumn 6\n", - "00A9 ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (©) COPYRIGHT SIGN\n", - "00AE ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (®) REGISTERED SIGN\n", - "203C ;\ttext ;\tL1 ;\tnone ;\ta j\t# V1.1 (‼) DOUBLE EXCLAMATION MARK\n", - "2049 ;\ttext ;\tL1 ;\tnone ;\ta j\t# V3.0 (⁉) EXCLAMATION QUESTION MARK\n", - "2122 ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (™) TRADE MARK SIGN\n", - "2139 ;\ttext ;\tL1 ;\tnone ;\tj\t# V3.0 (ℹ) INFORMATION SOURCE\n", - "2194 ;\ttext ;\tL1 ;\tnone ;\tz j\t# V1.1 (↔) LEFT RIGHT ARROW\n", - "2195 ;\ttext ;\tL1 ;\tnone ;\tz j\t# V1.1 (↕) UP DOWN ARROW\n", - "2196 ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (↖) NORTH WEST ARROW\n", - "2197 ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (↗) NORTH EAST ARROW\n", - "2198 ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (↘) SOUTH EAST ARROW\n", - "2199 ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (↙) SOUTH WEST ARROW\n", - "21A9 ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (↩) LEFTWARDS ARROW WITH HOOK\n", - "21AA ;\ttext ;\tL1 ;\tnone ;\tj\t# V1.1 (↪) RIGHTWARDS ARROW WITH HOOK\n", - "231A ;\temoji ;\tL1 ;\tnone ;\tj\t# V1.1 (⌚) WATCH\n", - "231B ;\temoji ;\tL1 ;\tnone ;\tj\t# V1.1 (⌛) HOURGLASS\n", - "2328 ;\ttext ;\tL2 ;\tnone ;\tx\t# V1.1 (⌨) KEYBOARD\n", - "23CF ;\ttext ;\tL2 ;\tnone ;\tx\t# V4.0 (⏏) EJECT SYMBOL\n", - "23E9 ;\temoji ;\tL1 ;\tnone ;\tj w\t# V6.0 (⏩) BLACK RIGHT-POINTING DOUBLE TRIANGLE\n", - "23EA ;\temoji ;\tL1 ;\tnone ;\tj w\t# V6.0 (⏪) BLACK LEFT-POINTING DOUBLE TRIANGLE\n" - ] - } - ], - "source": [ - "p1 = cli.create('data/cli/dữ liệu biểu tượng cảm xúc.txt',\n", - " project_format='tsv',\n", - " headerLines=0,\n", - " skipDataLines=34,\n", - " limit=20)\n", - "cli.info(p1.project_id)\n", - "cli.export(p1.project_id)" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 2314250240290: dữ liệu biểu tượng cảm xúc\n", - " 1929957235590: evil-fruits\n" - ] - } - ], - "source": [ - "cli.ls()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Delete" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Project 1602939526221 has been successfully deleted\n" - ] - } - ], - "source": [ - "cli.delete(p1.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CSV" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### default" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1675776970201\n", - "rows: 10\n", - " id: 1675776970201\n", - " url: http://127.0.0.1:3333/project?project=1675776970201\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:05Z\n", - " created: 2019-08-21T23:31:05Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.csv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: email\n", - " column 002: name\n", - " column 003: state\n", - " column 004: gender\n", - " column 005: purchase\n", - " column 006: count\n", - " column 007: date\n", - "email\tname\tstate\tgender\tpurchase\tcount\tdate\n", - "danny.baron@example1.com\tDanny Baron\tCA\tM\tTV (UTF-8: 📺)\t1\tWed, 4 Jul 2001\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t\t1\t2001-07-04T12:08:56\n", - "danny.baron@example1.com\t\" D.\t(\"\"Tab\"\") Baron\"\tCA\tM\tWinter jacket\t1\t2001-07-04\n", - "ben.tyler@example3.org\tBen Tyler\tNV\tM\tFlashlight\t1\t2001/07/04\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tDining table\t1\t2001-07\n", - "danny.baron@example1.com\tDaniel Baron\t\t\tBike\t1\t2001\n", - "jean.griffith@example5.org\tJean Griffith\tWA\tF\tPower drill\t1\t2000\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t'iPad'\t1\t1999\n", - "ben.morisson@example6.org\tBen Morisson\tFL\tM\tAmplifier\t1\t1998\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tNight table\t1\t1997\n", - "Project 1675776970201 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.csv')\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### encoding\n", - "\n", - "check TV symbol in line 1" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2268199900543\n", - "rows: 10\n", - "email\tname\tstate\tgender\tpurchase\tcount\tdate\n", - "danny.baron@example1.com\tDanny Baron\tCA\tM\tTV (UTF-8: 📺)\t1\tWed, 4 Jul 2001\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t\t1\t2001-07-04T12:08:56\n", - "danny.baron@example1.com\t\" D.\t(\"\"Tab\"\") Baron\"\tCA\tM\tWinter jacket\t1\t2001-07-04\n", - "ben.tyler@example3.org\tBen Tyler\tNV\tM\tFlashlight\t1\t2001/07/04\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tDining table\t1\t2001-07\n", - "danny.baron@example1.com\tDaniel Baron\t\t\tBike\t1\t2001\n", - "jean.griffith@example5.org\tJean Griffith\tWA\tF\tPower drill\t1\t2000\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t'iPad'\t1\t1999\n", - "ben.morisson@example6.org\tBen Morisson\tFL\tM\tAmplifier\t1\t1998\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tNight table\t1\t1997\n", - "Project 2268199900543 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.csv', encoding='ISO-8859-1')\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1798292162864\n", - "rows: 10\n", - "email\tname\tstate\tgender\tpurchase\tcount\tdate\n", - "danny.baron@example1.com\tDanny Baron\tCA\tM\tTV (UTF-8: 📺)\t1\tWed, 4 Jul 2001\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t\t1\t2001-07-04T12:08:56\n", - "danny.baron@example1.com\t\" D.\t(\"\"Tab\"\") Baron\"\tCA\tM\tWinter jacket\t1\t2001-07-04\n", - "ben.tyler@example3.org\tBen Tyler\tNV\tM\tFlashlight\t1\t2001/07/04\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tDining table\t1\t2001-07\n", - "danny.baron@example1.com\tDaniel Baron\t\t\tBike\t1\t2001\n", - "jean.griffith@example5.org\tJean Griffith\tWA\tF\tPower drill\t1\t2000\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t'iPad'\t1\t1999\n", - "ben.morisson@example6.org\tBen Morisson\tFL\tM\tAmplifier\t1\t1998\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tNight table\t1\t1997\n", - "Project 1798292162864 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.csv', encoding='UTF-8')\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### guessCellValueTypes\n", - "\n", - "check OpenRefine GUI at url below: numbers should be green" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2351526371150\n", - "rows: 10\n", - " id: 2351526371150\n", - " url: http://127.0.0.1:3333/project?project=2351526371150\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:05Z\n", - " created: 2019-08-21T23:31:05Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.csv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': True, u'includeFileSources': False}]\n", - " column 001: email\n", - " column 002: name\n", - " column 003: state\n", - " column 004: gender\n", - " column 005: purchase\n", - " column 006: count\n", - " column 007: date\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.csv', guessCellValueTypes=True)\n", - "cli.info(p.project_id)" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Project 2351526371150 has been successfully deleted\n" - ] - } - ], - "source": [ - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### headerLines\n", - "\n", - "check column names, should be Column 1..." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1753036694840\n", - "rows: 11\n", - "Column 1\tColumn 2\tColumn 3\tColumn 4\tColumn 5\tColumn 6\tColumn 7\n", - "email\tname\tstate\tgender\tpurchase\tcount\tdate\n", - "danny.baron@example1.com\tDanny Baron\tCA\tM\tTV (UTF-8: 📺)\t1\tWed, 4 Jul 2001\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t\t1\t2001-07-04T12:08:56\n", - "danny.baron@example1.com\t\" D.\t(\"\"Tab\"\") Baron\"\tCA\tM\tWinter jacket\t1\t2001-07-04\n", - "ben.tyler@example3.org\tBen Tyler\tNV\tM\tFlashlight\t1\t2001/07/04\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tDining table\t1\t2001-07\n", - "danny.baron@example1.com\tDaniel Baron\t\t\tBike\t1\t2001\n", - "jean.griffith@example5.org\tJean Griffith\tWA\tF\tPower drill\t1\t2000\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t'iPad'\t1\t1999\n", - "ben.morisson@example6.org\tBen Morisson\tFL\tM\tAmplifier\t1\t1998\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tNight table\t1\t1997\n", - "Project 1753036694840 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.csv', headerLines=0)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ignoreLines\n", - "\n", - "check column names, should start with arthur.duff as header" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1567779238383\n", - "rows: 5\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tDining table\t1\t2001-07\n", - "danny.baron@example1.com\tDaniel Baron\t\t\tBike\t1\t2001\n", - "jean.griffith@example5.org\tJean Griffith\tWA\tF\tPower drill\t1\t2000\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t'iPad'\t1\t1999\n", - "ben.morisson@example6.org\tBen Morisson\tFL\tM\tAmplifier\t1\t1998\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tNight table\t1\t1997\n", - "Project 1567779238383 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.csv', ignoreLines=5)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### limit\n", - "\n", - "should contain 5 rows" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2236287775552\n", - "rows: 5\n", - "email\tname\tstate\tgender\tpurchase\tcount\tdate\n", - "danny.baron@example1.com\tDanny Baron\tCA\tM\tTV (UTF-8: 📺)\t1\tWed, 4 Jul 2001\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t\t1\t2001-07-04T12:08:56\n", - "danny.baron@example1.com\t\" D.\t(\"\"Tab\"\") Baron\"\tCA\tM\tWinter jacket\t1\t2001-07-04\n", - "ben.tyler@example3.org\tBen Tyler\tNV\tM\tFlashlight\t1\t2001/07/04\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tDining table\t1\t2001-07\n", - "Project 2236287775552 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.csv', limit=5)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### separator and processQuotes\n", - "\n", - "should contain 10 rows and 2 columns (Column 2)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2493837924937\n", - "rows: 10\n", - "email,name,state,gender,purchase,count,date\tColumn 2\n", - "\"danny.baron@example1.com,Danny Baron,CA,M,TV (UTF-8: 📺),1,\"\"Wed, 4 Jul 2001\"\t\n", - "melanie.white@example2.edu,Melanie White,NC,F,,1,2001-07-04T12:08:56\t\n", - "danny.baron@example1.com, D.\t\"(\"\"Tab\"\") Baron,CA,M,Winter jacket,1,2001-07-04\"\n", - "ben.tyler@example3.org,Ben Tyler,NV,M,Flashlight,1,2001/07/04\t\n", - "arthur.duff@example4.com,Arthur Duff,OR,M,Dining table,1,2001-07\t\n", - "danny.baron@example1.com,Daniel Baron,,,Bike,1,2001\t\n", - "jean.griffith@example5.org,Jean Griffith,WA,F,Power drill,1,2000\t\n", - "melanie.white@example2.edu,Melanie White,NC,F,'iPad',1,1999\t\n", - "ben.morisson@example6.org,Ben Morisson,FL,M,Amplifier,1,1998\t\n", - "arthur.duff@example4.com,Arthur Duff,OR,M,Night table,1,1997\t\n", - "Project 2493837924937 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.csv', separator=' ', processQuotes=False)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### projectName" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1568868311685\n", - "rows: 10\n", - " id: 1568868311685\n", - " url: http://127.0.0.1:3333/project?project=1568868311685\n", - " name: foo\n", - " modified: 2019-08-21T23:31:06Z\n", - " created: 2019-08-21T23:31:06Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.csv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'foo', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: email\n", - " column 002: name\n", - " column 003: state\n", - " column 004: gender\n", - " column 005: purchase\n", - " column 006: count\n", - " column 007: date\n", - "Project 1568868311685 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.csv', projectName='foo')\n", - "cli.info(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### projectTags (introduced in OpenRefine 2.8)\n", - "\n", - "check manually at http://127.0.0.1:3333 > Open Project if tags where stored" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1889306695897\n", - "rows: 10\n", - " id: 1889306695897\n", - " url: http://127.0.0.1:3333/project?project=1889306695897\n", - " name: duplicates\n", - " tags: [u'client1', u'beta']\n", - " modified: 2019-08-21T23:31:06Z\n", - " created: 2019-08-21T23:31:06Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.csv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'duplicates', u'projectTags': [u'client1', u'beta'], u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: email\n", - " column 002: name\n", - " column 003: state\n", - " column 004: gender\n", - " column 005: purchase\n", - " column 006: count\n", - " column 007: date\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.csv', projectTags=['client1', 'beta'])\n", - "cli.info(p.project_id)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Project 1889306695897 has been successfully deleted\n" - ] - } - ], - "source": [ - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### skipDataLines\n", - "\n", - "should contain 5 rows" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1906416549071\n", - "rows: 5\n", - "email\tname\tstate\tgender\tpurchase\tcount\tdate\n", - "danny.baron@example1.com\tDaniel Baron\t\t\tBike\t1\t2001\n", - "jean.griffith@example5.org\tJean Griffith\tWA\tF\tPower drill\t1\t2000\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t'iPad'\t1\t1999\n", - "ben.morisson@example6.org\tBen Morisson\tFL\tM\tAmplifier\t1\t1998\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tNight table\t1\t1997\n", - "Project 1906416549071 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.csv', skipDataLines=5)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### storeBlankCellsAsNulls\n", - "\n", - "check OpenRefine GUI at url below:\n", - "* All > View > Show/Hide 'null' values in cells\n", - "* row 6 should contain null values in columns state and gender" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1641203332364\n", - "rows: 10\n", - " id: 1641203332364\n", - " url: http://127.0.0.1:3333/project?project=1641203332364\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:06Z\n", - " created: 2019-08-21T23:31:06Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.csv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': True, u'includeFileSources': False}]\n", - " column 001: email\n", - " column 002: name\n", - " column 003: state\n", - " column 004: gender\n", - " column 005: purchase\n", - " column 006: count\n", - " column 007: date\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.csv', guessCellValueTypes=True)\n", - "cli.info(p.project_id)" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Project 1641203332364 has been successfully deleted\n" - ] - } - ], - "source": [ - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TSV" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### default" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2332414205165\n", - "rows: 10\n", - " id: 2332414205165\n", - " url: http://127.0.0.1:3333/project?project=2332414205165\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:06Z\n", - " created: 2019-08-21T23:31:06Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.tsv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'duplicates', u'processQuotes': True, u'limit': -1, u'trimStrings': False, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: email\n", - " column 002: name\n", - " column 003: state\n", - " column 004: gender\n", - " column 005: purchase\n", - " column 006: count\n", - " column 007: date\n", - "email\tname\tstate\tgender\tpurchase\tcount\tdate\n", - "danny.baron@example1.com\tDanny Baron\tCA\tM\tTV (UTF-8: 📺)\t1\tWed, 4 Jul 2001\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t\t1\t2001-07-04T12:08:56\n", - "danny.baron@example1.com\t\"D.\t(\"\"Tab\"\") Baron\"\tCA\tM\tWinter jacket\t1\t2001-07-04\n", - "ben.tyler@example3.org\tBen Tyler\tNV\tM\tFlashlight\t1\t2001/07/04\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tDining table\t1\t2001-07\n", - "danny.baron@example1.com\tDaniel Baron\t\t\tBike\t1\t2001\n", - "jean.griffith@example5.org\tJean Griffith\tWA\tF\tPower drill\t1\t2000\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t'iPad'\t1\t1999\n", - "ben.morisson@example6.org\tBen Morisson\tFL\tM\tAmplifier\t1\t1998\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tNight table\t1\t1997\n", - "Project 2332414205165 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.tsv')\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## JSON" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### default" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1978993820770\n", - "rows: 10\n", - " id: 1978993820770\n", - " url: http://127.0.0.1:3333/project?project=1978993820770\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:06Z\n", - " created: 2019-08-21T23:31:06Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.json', u'storeBlankRows': True, u'encoding': u'', u'recordPath': [u'_', u'_'], u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: _ - name\n", - " column 002: _ - date\n", - " column 003: _ - email\n", - " column 004: _ - state\n", - " column 005: _ - count\n", - " column 006: _ - gender\n", - " column 007: _ - purchase\n", - "_ - name\t_ - date\t_ - email\t_ - state\t_ - count\t_ - gender\t_ - purchase\n", - "Danny Baron\tWed, 4 Jul 2001\tdanny.baron@example1.com\tCA\t1\tM\tTV (UTF-8: 📺)\n", - "Melanie White\t2001-07-04T12:08:56\tmelanie.white@example2.edu\tNC\t1\tF\t\n", - "\" D.\t(\"\"Tab\"\") Baron\"\t2001-07-04\tdanny.baron@example1.com\tCA\t1\tM\tWinter jacket\n", - "Ben Tyler\t2001/07/04\tben.tyler@example3.org\tNV\t1\tM\tFlashlight\n", - "Arthur Duff\t2001-07\tarthur.duff@example4.com\tOR\t1\tM\tDining table\n", - "Daniel Baron\t2001\tdanny.baron@example1.com\t\t1\t\tBike\n", - "Jean Griffith\t2000\tjean.griffith@example5.org\tWA\t1\tF\tPower drill\n", - "Melanie White\t1999\tmelanie.white@example2.edu\tNC\t1\tF\t'iPad'\n", - "Ben Morisson\t1998\tben.morisson@example6.org\tFL\t1\tM\tAmplifier\n", - "Arthur Duff\t1997\tarthur.duff@example4.com\tOR\t1\tM\tNight table\n", - "Project 1978993820770 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.json')\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### trimStrings (broken, does not work in the GUI either)\n", - "\n", - "check row 3 if spaces before `D.` are deleted" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1892692171021\n", - "rows: 10\n", - " id: 1892692171021\n", - " url: http://127.0.0.1:3333/project?project=1892692171021\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:07Z\n", - " created: 2019-08-21T23:31:06Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.json', u'storeBlankRows': True, u'encoding': u'', u'recordPath': [u'_', u'_'], u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': True, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: _ - name\n", - " column 002: _ - date\n", - " column 003: _ - email\n", - " column 004: _ - state\n", - " column 005: _ - count\n", - " column 006: _ - gender\n", - " column 007: _ - purchase\n", - "_ - name\t_ - date\t_ - email\t_ - state\t_ - count\t_ - gender\t_ - purchase\n", - "Danny Baron\tWed, 4 Jul 2001\tdanny.baron@example1.com\tCA\t1\tM\tTV (UTF-8: 📺)\n", - "Melanie White\t2001-07-04T12:08:56\tmelanie.white@example2.edu\tNC\t1\tF\t\n", - "\" D.\t(\"\"Tab\"\") Baron\"\t2001-07-04\tdanny.baron@example1.com\tCA\t1\tM\tWinter jacket\n", - "Ben Tyler\t2001/07/04\tben.tyler@example3.org\tNV\t1\tM\tFlashlight\n", - "Arthur Duff\t2001-07\tarthur.duff@example4.com\tOR\t1\tM\tDining table\n", - "Daniel Baron\t2001\tdanny.baron@example1.com\t\t1\t\tBike\n", - "Jean Griffith\t2000\tjean.griffith@example5.org\tWA\t1\tF\tPower drill\n", - "Melanie White\t1999\tmelanie.white@example2.edu\tNC\t1\tF\t'iPad'\n", - "Ben Morisson\t1998\tben.morisson@example6.org\tFL\t1\tM\tAmplifier\n", - "Arthur Duff\t1997\tarthur.duff@example4.com\tOR\t1\tM\tNight table\n", - "Project 1892692171021 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.json', trimStrings=True)\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### recordPath" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1945894618034\n", - "rows: 10\n", - " id: 1945894618034\n", - " url: http://127.0.0.1:3333/project?project=1945894618034\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:07Z\n", - " created: 2019-08-21T23:31:07Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.json', u'storeBlankRows': True, u'encoding': u'', u'recordPath': [u'_', u'_', u'purchase'], u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: purchase\n", - "purchase\n", - "TV (UTF-8: 📺)\n", - "\n", - "Winter jacket\n", - "Flashlight\n", - "Dining table\n", - "Bike\n", - "Power drill\n", - "'iPad'\n", - "Amplifier\n", - "Night table\n", - "Project 1945894618034 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.json', recordPath=['_', '_', 'purchase'])\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### storeEmptyStrings\n", - "\n", - "default: True; set to False for null values\n", - "\n", - "check OpenRefine GUI at url below:\n", - "* All > View > Show/Hide 'null' values in cells\n", - "* row 6 should contain null values in columns state and gender" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2551263767214\n", - "rows: 10\n", - " id: 2551263767214\n", - " url: http://127.0.0.1:3333/project?project=2551263767214\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:07Z\n", - " created: 2019-08-21T23:31:07Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': False, u'fileSource': u'data/cli/duplicates.json', u'storeBlankRows': True, u'encoding': u'', u'recordPath': [u'_', u'_'], u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: _ - name\n", - " column 002: _ - date\n", - " column 003: _ - email\n", - " column 004: _ - count\n", - " column 005: _ - purchase\n", - " column 006: _ - state\n", - " column 007: _ - gender\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.json', storeEmptyStrings=False)\n", - "cli.info(p.project_id)" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Project 2551263767214 has been successfully deleted\n" - ] - } - ], - "source": [ - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## XML" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### default" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1926835461545\n", - "rows: 80\n", - " id: 1926835461545\n", - " url: http://127.0.0.1:3333/project?project=1926835461545\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:07Z\n", - " created: 2019-08-21T23:31:07Z\n", - " rowCount: 80\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.xml', u'storeBlankRows': True, u'encoding': u'', u'recordPath': [u'root'], u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: root\n", - " column 002: root - record\n", - " column 003: root - record - name\n", - " column 004: root - record - date\n", - " column 005: root - record - email\n", - " column 006: root - record - count\n", - " column 007: root - record - purchase\n", - " column 008: root - record - state\n", - " column 009: root - record - gender\n", - "root\troot - record\troot - record - name\troot - record - date\troot - record - email\troot - record - count\troot - record - purchase\troot - record - state\troot - record - gender\n", - "\"\n", - " \"\t\"\n", - " \"\tDanny Baron\tWed, 4 Jul 2001\tdanny.baron@example1.com\t1\tTV (UTF-8: 📺)\tCA\tM\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - " \"\t\"\n", - " \"\tMelanie White\t2001-07-04T12:08:56\tmelanie.white@example2.edu\t1\t\tNC\tF\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - "\"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\" D.\t(\"\"Tab\"\") Baron\"\t2001-07-04\tdanny.baron@example1.com\t1\tWinter jacket\tCA\tM\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\tBen Tyler\t2001/07/04\tben.tyler@example3.org\t1\tFlashlight\tNV\tM\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\tArthur Duff\t2001-07\tarthur.duff@example4.com\t1\tDining table\tOR\tM\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\tDaniel Baron\t2001\tdanny.baron@example1.com\t1\tBike\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\tJean Griffith\t2000\tjean.griffith@example5.org\t1\tPower drill\tWA\tF\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\tMelanie White\t1999\tmelanie.white@example2.edu\t1\t'iPad'\tNC\tF\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\tBen Morisson\t1998\tben.morisson@example6.org\t1\tAmplifier\tFL\tM\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\tArthur Duff\t1997\tarthur.duff@example4.com\t1\tNight table\tOR\tM\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "Project 1926835461545 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.xml')\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### trimStrings (broken, does not work in the GUI either)\n", - "\n", - "check if spaces before `D.` are deleted" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1615744471501\n", - "rows: 80\n", - " id: 1615744471501\n", - " url: http://127.0.0.1:3333/project?project=1615744471501\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:07Z\n", - " created: 2019-08-21T23:31:07Z\n", - " rowCount: 80\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.xml', u'storeBlankRows': True, u'encoding': u'', u'recordPath': [u'root'], u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': True, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: root\n", - " column 002: root - record\n", - " column 003: root - record - name\n", - " column 004: root - record - date\n", - " column 005: root - record - email\n", - " column 006: root - record - count\n", - " column 007: root - record - purchase\n", - " column 008: root - record - state\n", - " column 009: root - record - gender\n", - "root\troot - record\troot - record - name\troot - record - date\troot - record - email\troot - record - count\troot - record - purchase\troot - record - state\troot - record - gender\n", - "\"\n", - " \"\t\"\n", - " \"\tDanny Baron\tWed, 4 Jul 2001\tdanny.baron@example1.com\t1\tTV (UTF-8: 📺)\tCA\tM\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - " \"\t\"\n", - " \"\tMelanie White\t2001-07-04T12:08:56\tmelanie.white@example2.edu\t1\t\tNC\tF\n", - "\"\n", - " \"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\"\n", - "\"\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\" D.\t(\"\"Tab\"\") Baron\"\t2001-07-04\tdanny.baron@example1.com\t1\tWinter jacket\tCA\tM\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\tBen Tyler\t2001/07/04\tben.tyler@example3.org\t1\tFlashlight\tNV\tM\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\tArthur Duff\t2001-07\tarthur.duff@example4.com\t1\tDining table\tOR\tM\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\tDaniel Baron\t2001\tdanny.baron@example1.com\t1\tBike\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\tJean Griffith\t2000\tjean.griffith@example5.org\t1\tPower drill\tWA\tF\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\tMelanie White\t1999\tmelanie.white@example2.edu\t1\t'iPad'\tNC\tF\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\tBen Morisson\t1998\tben.morisson@example6.org\t1\tAmplifier\tFL\tM\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\tArthur Duff\t1997\tarthur.duff@example4.com\t1\tNight table\tOR\tM\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "\t\"\n", - " \"\t\t\t\t\t\t\t\n", - "Project 1615744471501 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.xml', trimStrings=True)\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### recordPath" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1843370951454\n", - "rows: 10\n", - " id: 1843370951454\n", - " url: http://127.0.0.1:3333/project?project=1843370951454\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:07Z\n", - " created: 2019-08-21T23:31:07Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.xml', u'storeBlankRows': True, u'encoding': u'', u'recordPath': [u'root', u'record', u'purchase'], u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: purchase\n", - "purchase\n", - "TV (UTF-8: 📺)\n", - "\n", - "Winter jacket\n", - "Flashlight\n", - "Dining table\n", - "Bike\n", - "Power drill\n", - "'iPad'\n", - "Amplifier\n", - "Night table\n", - "Project 1843370951454 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.xml', recordPath=['root', 'record', 'purchase'])\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### storeEmptyStrings\n", - "\n", - "default: True; set to False for null values\n", - "\n", - "check OpenRefine GUI at url below:\n", - "* All > View > Show/Hide 'null' values in cells\n", - "* row 6 should contain null values in columns state and gender" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2549624481101\n", - "rows: 10\n", - " id: 2549624481101\n", - " url: http://127.0.0.1:3333/project?project=2549624481101\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:07Z\n", - " created: 2019-08-21T23:31:07Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': False, u'fileSource': u'data/cli/duplicates.csv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: email\n", - " column 002: name\n", - " column 003: state\n", - " column 004: gender\n", - " column 005: purchase\n", - " column 006: count\n", - " column 007: date\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.csv', storeEmptyStrings=False)\n", - "cli.info(p.project_id)" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Project 2549624481101 has been successfully deleted\n" - ] - } - ], - "source": [ - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TXT" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### default (line-based)" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2029778313736\n", - "rows: 11\n", - " id: 2029778313736\n", - " url: http://127.0.0.1:3333/project?project=2029778313736\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:07Z\n", - " created: 2019-08-21T23:31:07Z\n", - " rowCount: 11\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.txt', u'storeBlankRows': True, u'encoding': u'', u'ignoreLines': -1, u'projectName': u'duplicates', u'processQuotes': True, u'skipDataLines': -1, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False, u'headerLines': 0}]\n", - " column 001: Column 1\n", - "Column 1\n", - "email name state gender purchase count date \n", - "danny.baron@example1.com Danny Baron CA M TV (UTF-8: 📺) 1 Wed, 4 Jul 2001 \n", - "melanie.white@example2.edu Melanie White NC F 1 2001-07-04T12:08:5\n", - "\"danny.baron@example1.com D.\t(\"\"Tab\"\") Baron CA M Winter jacket 1 2001-07-04 \"\n", - "ben.tyler@example3.org Ben Tyler NV M Flashlight 1 2001/07/04 \n", - "arthur.duff@example4.com Arthur Duff OR M Dining table 1 2001-07 \n", - "danny.baron@example1.com Daniel Baron Bike 1 2001 \n", - "jean.griffith@example5.org Jean Griffith WA F Power drill 1 2000 \n", - "melanie.white@example2.edu Melanie White NC F 'iPad' 1 1999 \n", - "ben.morisson@example6.org Ben Morisson FL M Amplifier 1 1998 \n", - "arthur.duff@example4.com Arthur Duff OR M Night table 1 1997 \n", - "Project 2029778313736 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.txt')\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### linesPerRow\n", - "\n", - "should return 6 rows in 2 columns" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1614710460265\n", - "rows: 6\n", - " id: 1614710460265\n", - " url: http://127.0.0.1:3333/project?project=1614710460265\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:08Z\n", - " created: 2019-08-21T23:31:08Z\n", - " rowCount: 6\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.txt', u'storeBlankRows': True, u'encoding': u'', u'ignoreLines': -1, u'projectName': u'duplicates', u'processQuotes': True, u'limit': -1, u'skipDataLines': -1, u'separator': u',', u'trimStrings': False, u'linesPerRow': 2, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False, u'headerLines': 0}]\n", - " column 001: Column 1\n", - " column 002: Column 2\n", - "Column 1\tColumn 2\n", - "email name state gender purchase count date \tdanny.baron@example1.com Danny Baron CA M TV (UTF-8: 📺) 1 Wed, 4 Jul 2001 \n", - "melanie.white@example2.edu Melanie White NC F 1 2001-07-04T12:08:5\t\"danny.baron@example1.com D.\t(\"\"Tab\"\") Baron CA M Winter jacket 1 2001-07-04 \"\n", - "ben.tyler@example3.org Ben Tyler NV M Flashlight 1 2001/07/04 \tarthur.duff@example4.com Arthur Duff OR M Dining table 1 2001-07 \n", - "danny.baron@example1.com Daniel Baron Bike 1 2001 \tjean.griffith@example5.org Jean Griffith WA F Power drill 1 2000 \n", - "melanie.white@example2.edu Melanie White NC F 'iPad' 1 1999 \tben.morisson@example6.org Ben Morisson FL M Amplifier 1 1998 \n", - "arthur.duff@example4.com Arthur Duff OR M Night table 1 1997 \t\n", - "Project 1614710460265 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.txt', linesPerRow=2)\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### fixed-width: columnWidths and headerLines" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 1729341878534\n", - "rows: 10\n", - " id: 1729341878534\n", - " url: http://127.0.0.1:3333/project?project=1729341878534\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:08Z\n", - " created: 2019-08-21T23:31:08Z\n", - " rowCount: 10\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'data/cli/duplicates.txt', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'duplicates', u'processQuotes': True, u'limit': -1, u'separator': u',', u'trimStrings': False, u'columnWidths': [27, 21, 6, 7, 15, 6, 1000], u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False, u'headerLines': 1}]\n", - " column 001: email\n", - " column 002: name\n", - " column 003: state\n", - " column 004: gender\n", - " column 005: purchase\n", - " column 006: count\n", - " column 007: date\n", - "email\tname\tstate\tgender\tpurchase\tcount\tdate\n", - "danny.baron@example1.com \tDanny Baron \tCA \tM \tTV (UTF-8: 📺) \t1 \tWed, 4 Jul 2001 \n", - "melanie.white@example2.edu \tMelanie White \tNC \tF \t \t1 \t2001-07-04T12:08:5\n", - "danny.baron@example1.com \t\" D.\t(\"\"Tab\"\") Baron \"\tCA \tM \tWinter jacket \t1 \t2001-07-04 \n", - "ben.tyler@example3.org \tBen Tyler \tNV \tM \tFlashlight \t1 \t2001/07/04 \n", - "arthur.duff@example4.com \tArthur Duff \tOR \tM \tDining table \t1 \t2001-07 \n", - "danny.baron@example1.com \tDaniel Baron \t \t \tBike \t1 \t2001 \n", - "jean.griffith@example5.org \tJean Griffith \tWA \tF \tPower drill \t1 \t2000 \n", - "melanie.white@example2.edu \tMelanie White \tNC \tF \t'iPad' \t1 \t1999 \n", - "ben.morisson@example6.org \tBen Morisson \tFL \tM \tAmplifier \t1 \t1998 \n", - "arthur.duff@example4.com \tArthur Duff \tOR \tM \tNight table \t1 \t1997 \n", - "Project 1729341878534 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.txt', columnWidths=[27, 21, 6, 7, 15, 6, 1000], headerLines=1)\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ZIP" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### default\n", - "\n", - "should contain 16 rows" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2279718038457\n", - "rows: 16\n", - " id: 2279718038457\n", - " url: http://127.0.0.1:3333/project?project=2279718038457\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:08Z\n", - " created: 2019-08-21T23:31:08Z\n", - " rowCount: 16\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'duplicates2.csv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}, {u'storeEmptyStrings': True, u'fileSource': u'duplicates2.csv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': False}]\n", - " column 001: email\n", - " column 002: name\n", - " column 003: state\n", - " column 004: gender\n", - " column 005: purchase\n", - " column 006: count\n", - " column 007: date\n", - "email\tname\tstate\tgender\tpurchase\tcount\tdate\n", - "danny.baron@example1.com\tDanny Baron\tCA\tM\tTV (UTF-8: 📺)\t1\tWed, 4 Jul 2001\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t\t1\t2001-07-04T12:08:56\n", - "danny.baron@example1.com\t\" D.\t(\"\"Tab\"\") Baron\"\tCA\tM\tWinter jacket\t1\t2001-07-04\n", - "ben.tyler@example3.org\tBen Tyler\tNV\tM\tFlashlight\t1\t2001/07/04\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tDining table\t1\t2001-07\n", - "danny.baron@example1.com\tDaniel Baron\t\t\tBike\t1\t2001\n", - "jean.griffith@example5.org\tJean Griffith\tWA\tF\tPower drill\t1\t2000\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t'iPad'\t1\t1999\n", - "ben.morisson@example6.org\tBen Morisson\tFL\tM\tAmplifier\t1\t1998\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tNight table\t1\t1997\n", - "danny.baron@example1.com\tDanny Baron\tCA\tM\tTV (UTF-8: 📺), Winter jacket, bike\t3\tWed, 4 Jul 2001, 2001-07-04, 2001\n", - "melanie.white@example2.edu\tMelanie White\tNC\tF\t, 'iPad'\t2\t2001-07-04T12:08:56, 1999\n", - "ben.tyler@example3.org\tBen Tyler\tNV\tM\tFlashlight\t1\t2001/07/04\n", - "arthur.duff@example4.com\tArthur Duff\tOR\tM\tDining table, Night table\t2\t2001-07, 1997\n", - "jean.griffith@example5.org\tJean Griffith\tWA\tF\tPower drill\t1\t2000\n", - "ben.morisson@example6.org\tBen Morisson\tFL\tM\tAmplifier\t1\t1998\n", - "Project 2279718038457 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.zip')\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### includeFileSources\n", - "\n", - "should contain column File" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id: 2100283089198\n", - "rows: 16\n", - " id: 2100283089198\n", - " url: http://127.0.0.1:3333/project?project=2100283089198\n", - " name: duplicates\n", - " modified: 2019-08-21T23:31:08Z\n", - " created: 2019-08-21T23:31:08Z\n", - " rowCount: 16\n", - "importOptionMetadata: [{u'storeEmptyStrings': True, u'fileSource': u'duplicates2.csv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': True}, {u'storeEmptyStrings': True, u'fileSource': u'duplicates2.csv', u'storeBlankRows': True, u'encoding': u'', u'projectName': u'duplicates', u'processQuotes': True, u'separator': u',', u'trimStrings': False, u'limit': -1, u'storeBlankCellsAsNulls': True, u'guessCellValueTypes': False, u'includeFileSources': True}]\n", - " column 001: File\n", - " column 002: email\n", - " column 003: name\n", - " column 004: state\n", - " column 005: gender\n", - " column 006: purchase\n", - " column 007: count\n", - " column 008: date\n", - "File\temail\tname\tstate\tgender\tpurchase\tcount\tdate\n", - "duplicates.csv\tdanny.baron@example1.com\tDanny Baron\tCA\tM\tTV (UTF-8: 📺)\t1\tWed, 4 Jul 2001\n", - "duplicates.csv\tmelanie.white@example2.edu\tMelanie White\tNC\tF\t\t1\t2001-07-04T12:08:56\n", - "duplicates.csv\tdanny.baron@example1.com\t\" D.\t(\"\"Tab\"\") Baron\"\tCA\tM\tWinter jacket\t1\t2001-07-04\n", - "duplicates.csv\tben.tyler@example3.org\tBen Tyler\tNV\tM\tFlashlight\t1\t2001/07/04\n", - "duplicates.csv\tarthur.duff@example4.com\tArthur Duff\tOR\tM\tDining table\t1\t2001-07\n", - "duplicates.csv\tdanny.baron@example1.com\tDaniel Baron\t\t\tBike\t1\t2001\n", - "duplicates.csv\tjean.griffith@example5.org\tJean Griffith\tWA\tF\tPower drill\t1\t2000\n", - "duplicates.csv\tmelanie.white@example2.edu\tMelanie White\tNC\tF\t'iPad'\t1\t1999\n", - "duplicates.csv\tben.morisson@example6.org\tBen Morisson\tFL\tM\tAmplifier\t1\t1998\n", - "duplicates.csv\tarthur.duff@example4.com\tArthur Duff\tOR\tM\tNight table\t1\t1997\n", - "duplicates2.csv\tdanny.baron@example1.com\tDanny Baron\tCA\tM\tTV (UTF-8: 📺), Winter jacket, bike\t3\tWed, 4 Jul 2001, 2001-07-04, 2001\n", - "duplicates2.csv\tmelanie.white@example2.edu\tMelanie White\tNC\tF\t, 'iPad'\t2\t2001-07-04T12:08:56, 1999\n", - "duplicates2.csv\tben.tyler@example3.org\tBen Tyler\tNV\tM\tFlashlight\t1\t2001/07/04\n", - "duplicates2.csv\tarthur.duff@example4.com\tArthur Duff\tOR\tM\tDining table, Night table\t2\t2001-07, 1997\n", - "duplicates2.csv\tjean.griffith@example5.org\tJean Griffith\tWA\tF\tPower drill\t1\t2000\n", - "duplicates2.csv\tben.morisson@example6.org\tBen Morisson\tFL\tM\tAmplifier\t1\t1998\n", - "Project 2100283089198 has been successfully deleted\n" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.zip', includeFileSources=True)\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ODS (broken in OpenRefine >=2.8)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### default\n", - "\n", - "many blank columns and rows in OpenRefine <=2.7 (also with manual import via GUI)" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "ename": "Exception", - "evalue": "Project not created", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcli\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcreate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'data/cli/duplicates.ods'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mcli\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mproject_id\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mcli\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexport\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mproject_id\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mcli\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelete\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mproject_id\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/home/felix/.local/lib/python2.7/site-packages/google/refine/cli.pyc\u001b[0m in \u001b[0;36mcreate\u001b[0;34m(project_file, project_format, columnWidths, encoding, guessCellValueTypes, headerLines, ignoreLines, includeFileSources, limit, linesPerRow, processQuotes, projectName, projectTags, recordPath, separator, sheets, skipDataLines, storeBlankCellsAsNulls, storeBlankRows, storeEmptyStrings, trimStrings)\u001b[0m\n\u001b[1;32m 125\u001b[0m \u001b[0mstore_blank_cells_as_nulls\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstoreBlankCellsAsNulls\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 126\u001b[0m \u001b[0minclude_file_sources\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mincludeFileSources\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 127\u001b[0;31m **kwargs)\n\u001b[0m\u001b[1;32m 128\u001b[0m \u001b[0mrows\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mproject\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdo_json\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'get-rows'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'total'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 129\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrows\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/home/felix/.local/lib/python2.7/site-packages/google/refine/refine.pyc\u001b[0m in \u001b[0;36mnew_project\u001b[0;34m(self, project_file, project_url, project_name, project_format, encoding, separator, ignore_lines, header_lines, skip_data_lines, limit, store_blank_rows, guess_cell_value_types, process_quotes, store_blank_cells_as_nulls, include_file_sources, **opts)\u001b[0m\n\u001b[1;32m 279\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mRefineProject\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mserver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mproject_id\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 280\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 281\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Project not created'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 282\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 283\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mException\u001b[0m: Project not created" - ] - } - ], - "source": [ - "p = cli.create('data/cli/duplicates.ods')\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### sheets" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "first sheet from file with 2 sheets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p = cli.create('data/cli/duplicates2.ods', sheets=[0])\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "both sheets from file with 2 sheets: should contain 16 rows" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "p = cli.create('data/cli/duplicates2.ods', sheets=[0, 1])\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## XLS (broken in OpenRefine >=2.8)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### default" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p = cli.create('data/cli/duplicates.xls')\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### sheets" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "first sheet from file with 2 sheets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p = cli.create('data/cli/duplicates2.xls', sheets=[0])\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "both sheets from file with 2 sheets: should contain 16 rows" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "p = cli.create('data/cli/duplicates2.xls', sheets=[0, 1])\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## XLSX (broken in OpenRefine >=2.8)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### default" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p = cli.create('data/cli/duplicates.xlsx')\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### sheets" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "first sheet from file with 2 sheets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p = cli.create('data/cli/duplicates2.xlsx', sheets=[0])\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "both sheets from file with 2 sheets: should contain 16 rows" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "p = cli.create('data/cli/duplicates2.xlsx', sheets=[0, 1])\n", - "cli.info(p.project_id)\n", - "cli.export(p.project_id)\n", - "cli.delete(p.project_id)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.16" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tests/create-csv.sh b/tests/create-csv.sh index 04c9dac..db81d9c 100755 --- a/tests/create-csv.sh +++ b/tests/create-csv.sh @@ -2,10 +2,14 @@ # =============================== ENVIRONMENT ================================ # -t="create-csv" +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi +t="$(basename "${BASH_SOURCE[0]}" .sh)" cd "${BASH_SOURCE%/*}/" || exit 1 -client="python3 ../refine.py -H localhost -P 3334" mkdir -p "tmp/${t}" # =================================== DATA =================================== # @@ -28,8 +32,8 @@ DATA # ================================== ACTION ================================== # -${client} --create "tmp/${t}/${t}.csv" -${client} --export "${t}" --output "tmp/${t}/${t}.output" +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --export "${t}" --output "tmp/${t}/${t}.output" # =================================== TEST =================================== # diff --git a/tests/create-utf8.sh b/tests/create-utf8.sh new file mode 100755 index 0000000..0fd14e4 --- /dev/null +++ b/tests/create-utf8.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +a,b,c +🍉,🍒,🍓 +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +a b c +🍉 🍒 🍓 +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" --projectName "${t} biểu tượng cảm xúc 🍉" +${cmd} --export "${t} biểu tượng cảm xúc 🍉" --output "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/data/duplicates.csv b/tests/data/duplicates.csv index 7a79dfe..8fcb581 100644 --- a/tests/data/duplicates.csv +++ b/tests/data/duplicates.csv @@ -1,11 +1,11 @@ -email,name,state,gender,purchase,count,date -danny.baron@example1.com,Danny Baron,CA,M,TV (UTF-8: 📺),1,"Wed, 4 Jul 2001" -melanie.white@example2.edu,Melanie White,NC,F,,1,2001-07-04T12:08:56 -danny.baron@example1.com, D. ("Tab") Baron,CA,M,Winter jacket,1,2001-07-04 -ben.tyler@example3.org,Ben Tyler,NV,M,Flashlight,1,2001/07/04 -arthur.duff@example4.com,Arthur Duff,OR,M,Dining table,1,2001-07 -danny.baron@example1.com,Daniel Baron,,,Bike,1,2001 -jean.griffith@example5.org,Jean Griffith,WA,F,Power drill,1,2000 -melanie.white@example2.edu,Melanie White,NC,F,'iPad',1,1999 -ben.morisson@example6.org,Ben Morisson,FL,M,Amplifier,1,1998 -arthur.duff@example4.com,Arthur Duff,OR,M,Night table,1,1997 +email,name,state,gender,purchase +danny.baron@example1.com,Danny Baron,CA,M,TV +melanie.white@example2.edu,Melanie White,NC,F,iPhone +danny.baron@example1.com,D. Baron,CA,M,Winter jacket +ben.tyler@example3.org,Ben Tyler,NV,M,Flashlight +arthur.duff@example4.com,Arthur Duff,OR,M,Dining table +danny.baron@example1.com,Daniel Baron,CA,M,Bike +jean.griffith@example5.org,Jean Griffith,WA,F,Power drill +melanie.white@example2.edu,Melanie White,NC,F,iPad +ben.morisson@example6.org,Ben Morisson,FL,M,Amplifier +arthur.duff@example4.com,Arthur Duff,OR,M,Night table \ No newline at end of file diff --git a/tests/data/duplicates.json b/tests/data/duplicates.json deleted file mode 100644 index d94ebea..0000000 --- a/tests/data/duplicates.json +++ /dev/null @@ -1,92 +0,0 @@ -[ - { - "email": "danny.baron@example1.com", - "name": "Danny Baron", - "state": "CA", - "gender": "M", - "purchase": "TV (UTF-8: 📺)", - "count": 1, - "date": "Wed, 4 Jul 2001" - }, - { - "email": "melanie.white@example2.edu", - "name": "Melanie White", - "state": "NC", - "gender": "F", - "purchase": "", - "count": 1, - "date": "2001-07-04T12:08:56" - }, - { - "email": "danny.baron@example1.com", - "name": " D.\t(\"Tab\") Baron", - "state": "CA", - "gender": "M", - "purchase": "Winter jacket", - "count": 1, - "date": "2001-07-04" - }, - { - "email": "ben.tyler@example3.org", - "name": "Ben Tyler", - "state": "NV", - "gender": "M", - "purchase": "Flashlight", - "count": 1, - "date": "2001/07/04" - }, - { - "email": "arthur.duff@example4.com", - "name": "Arthur Duff", - "state": "OR", - "gender": "M", - "purchase": "Dining table", - "count": 1, - "date": "2001-07" - }, - { - "email": "danny.baron@example1.com", - "name": "Daniel Baron", - "state": "", - "gender": "", - "purchase": "Bike", - "count": 1, - "date": 2001 - }, - { - "email": "jean.griffith@example5.org", - "name": "Jean Griffith", - "state": "WA", - "gender": "F", - "purchase": "Power drill", - "count": 1, - "date": 2000 - }, - { - "email": "melanie.white@example2.edu", - "name": "Melanie White", - "state": "NC", - "gender": "F", - "purchase": "'iPad'", - "count": 1, - "date": 1999 - }, - { - "email": "ben.morisson@example6.org", - "name": "Ben Morisson", - "state": "FL", - "gender": "M", - "purchase": "Amplifier", - "count": 1, - "date": 1998 - }, - { - "email": "arthur.duff@example4.com", - "name": "Arthur Duff", - "state": "OR", - "gender": "M", - "purchase": "Night table", - "count": 1, - "date": 1997 - } -] diff --git a/tests/data/duplicates.ods b/tests/data/duplicates.ods deleted file mode 100644 index 375a0afab8c9129622f58933438db65f5c264c6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13949 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 diff --git a/tests/data/duplicates.tsv b/tests/data/duplicates.tsv deleted file mode 100644 index 5a9767d..0000000 --- a/tests/data/duplicates.tsv +++ /dev/null @@ -1,11 +0,0 @@ -email name state gender purchase count date -danny.baron@example1.com Danny Baron CA M TV (UTF-8: 📺) 1 Wed, 4 Jul 2001 -melanie.white@example2.edu Melanie White NC F 1 2001-07-04T12:08:56 -danny.baron@example1.com "D. (""Tab"") Baron" CA M Winter jacket 1 2001-07-04 -ben.tyler@example3.org Ben Tyler NV M Flashlight 1 2001/07/04 -arthur.duff@example4.com Arthur Duff OR M Dining table 1 2001-07 -danny.baron@example1.com Daniel Baron Bike 1 2001 -jean.griffith@example5.org Jean Griffith WA F Power drill 1 2000 -melanie.white@example2.edu Melanie White NC F 'iPad' 1 1999 -ben.morisson@example6.org Ben Morisson FL M Amplifier 1 1998 -arthur.duff@example4.com Arthur Duff OR M Night table 1 1997 diff --git a/tests/data/duplicates.txt b/tests/data/duplicates.txt deleted file mode 100644 index 3d76a12..0000000 --- a/tests/data/duplicates.txt +++ /dev/null @@ -1,11 +0,0 @@ -email name state gender purchase count date -danny.baron@example1.com Danny Baron CA M TV (UTF-8: 📺) 1 Wed, 4 Jul 2001 -melanie.white@example2.edu Melanie White NC F 1 2001-07-04T12:08:5 -danny.baron@example1.com D. ("Tab") Baron CA M Winter jacket 1 2001-07-04 -ben.tyler@example3.org Ben Tyler NV M Flashlight 1 2001/07/04 -arthur.duff@example4.com Arthur Duff OR M Dining table 1 2001-07 -danny.baron@example1.com Daniel Baron Bike 1 2001 -jean.griffith@example5.org Jean Griffith WA F Power drill 1 2000 -melanie.white@example2.edu Melanie White NC F 'iPad' 1 1999 -ben.morisson@example6.org Ben Morisson FL M Amplifier 1 1998 -arthur.duff@example4.com Arthur Duff OR M Night table 1 1997 diff --git a/tests/data/duplicates.xls b/tests/data/duplicates.xls deleted file mode 100644 index cbc29160b6c7dd851aa6841c6e4035f8ed4eb295..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7680 zcmeHMU2I%O6+Uf-BKZ(6r|0HqUCRzW~{ZXA*#>5h;M6Y+R*EhMl z8?AShO)_Gpdvh=N(F=j4}fr95D!Hlq(}iFl<-!;!xj~xR!zjw|_m&#nEE2*u zd7myXFW1=kd{90^9=Pe*$~lZ+5~Bd;ya9*gGr%@mz4vEmh!0G?jR&Trh`+L! z^0XB2F3EY!@W#tdL`+cpMtTPG#YWoSsm%lZz6b8)E7k}7&-~3i9tQ5T{+au^{+oaV zfGt2;fL34|upQU|>;ygsd>(iR*abWcd;xd_*bO`in7|&O4R{QA9M}uA106so&;{%R z_5;jldAwoo?R)V5>#H%2S&T*H zXItN6%2&Dn1|s5zkt-@L{sP{Ma)z-nYPlKn-&IDG4VJ;!Ttbi@!IvSIz-^KrDDKbI z^N5N*G)jxf`R0k_LnEzhe_cJ>)UydsLw>6I{84dw5tqM4`{l2_0r_M_jbY?JM=Ws> zSF38#;C|Kaj%<<3++Uxu3wFtJcSmCKJ=iAc>uLpEmVYdp&{r!PVG_u}u05eG!3UpM5h@@3}t>XgzKt1^!>0WfwLhe7nq<|_05FL7Fo%PR)Xi}59_ zKZ&Ph_Xji@J4PHkM;tps{GS-dCz1(01wOMmPMdb#a$E>6Sa}=dLK#-!0GhK4S-XT2 z=$T3>GjA=hE>o-&%4nKJ6WEls3Wf8@S*uhmr0sK7{)}t)CNsr6j;dpGAKi!k6iosPhA}FjGgT^2h8UyuGyDL^-=1cD7Ahvu$14OvsyY3T3-wp0YBh?J~~XeqU^;vvwg_KJVJ4nic)YVkrl2kJtrs zniaI*B)W~e*228&s>&Qg737?l!i0@E z1*ecR%hs%GBWyftSV5P#+HB0mh;!P8t4`TgA(<;Vb8}94z9#-4jl|HNN2U3UR|y3( z!U>Fnc%sF-m zB9C*}+T>+iTe{_C7>It7iSGdL;T0ZJSVC}^=smD`)gHJ7(Vj(6aMx&2k>8B?{^a`~ z{C;9~^4M1te^K3#lpNX1HHoG13Tm!I_NgBG)$@XCyB(*SJviEowzo|?d3(V;Zl5)$ zig~NhJ!R)Au2pJl@9k?J-hmSj&Odi(H)-W;vwiYarQo7^w!@fyRo*|=5%})J_p3eE zF7#Zh9_tExzb$RJ++{I5{#}r6quZ$Uue}Ydln`2d)w}k8>mfQs6wO}SntVEhnzy1p z9mbLJIDz#%WSv`h2v+d+uF{Ksx3pup)yqS?-oj%D2HV|K7jAvT7SWV} zP^3alg;ZeHs4yswN7qF_aU`0Gg5nr76$3@j=!2Ccd^khO^Xf#C)yxM4r8n`)XDyV_c zo=}$`YKW}T5P^n-x)iY=XD6YqN1CDrUX(ON4ZJdGDySi#(?ah71>-3{;Y8w__M~C^=FOo|rFM`JuNaX|rl6^VG_4ufMQ2t9ia6fg>9v~Qme-1CW4s~PsT_3M#(~OyeWFCnjzV)Dzi^#^4W|Mv zHug#V91rs!%SL)Vfkw}H4GrjZ#okD_HQR8r(VF#h%|><1CqeVKT9&AMQ7RaJ9>03= zxButxUw}C^C*+jzYgiGS^-HIxpBv3a$IsjUd!ERsj6p+2*xK-`@@gZD80G<26e R{rBT_xBd_Q{{ElV|1ZAGtziHF diff --git a/tests/data/duplicates.xlsx b/tests/data/duplicates.xlsx deleted file mode 100644 index 30418c57dbffdeffd7923588b957151f275d978e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5672 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 diff --git a/tests/data/duplicates.xml b/tests/data/duplicates.xml deleted file mode 100644 index 2402358..0000000 --- a/tests/data/duplicates.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - danny.baron@example1.com - Danny Baron - CA - M - TV (UTF-8: 📺) - 1 - Wed, 4 Jul 2001 - - - melanie.white@example2.edu - Melanie White - NC - F - <iPhone> - 1 - 2001-07-04T12:08:56 - - - danny.baron@example1.com - D. ("Tab") Baron - CA - M - Winter jacket - 1 - 2001-07-04 - - - ben.tyler@example3.org - Ben Tyler - NV - M - Flashlight - 1 - 2001/07/04 - - - arthur.duff@example4.com - Arthur Duff - OR - M - Dining table - 1 - 2001-07 - - - danny.baron@example1.com - Daniel Baron - - - Bike - 1 - 2001 - - - jean.griffith@example5.org - Jean Griffith - WA - F - Power drill - 1 - 2000 - - - melanie.white@example2.edu - Melanie White - NC - F - 'iPad' - 1 - 1999 - - - ben.morisson@example6.org - Ben Morisson - FL - M - Amplifier - 1 - 1998 - - - arthur.duff@example4.com - Arthur Duff - OR - M - Night table - 1 - 1997 - - diff --git a/tests/data/duplicates.zip b/tests/data/duplicates.zip deleted file mode 100644 index eee03fff5f4b85177f17375cd82510d7d7034806..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1082 zcmWIWW@Zs#U|`^2_^?*k|7AyjP8lNu!+s_P20jKEhLqBRoXq6JlGI|o5Kac> z%YUL`LAbPnn}Lz#1v3K!n3y^-*6)ymNbCH!T55Y1oJ`FSe5!uzguj7e(~*!$xfi+B zrBj>B@bg*hl@eifyVn?LFiJ-=Y%e!U^yvyY(i7qNC+oxW zb1g;nEC(jc(>hz}van)_CeO(uQ%l3H&5Js+?mNdcX6t84wcD1n&suVab;tidy;iy| z0o&JIfBp5;-bo?B(`rra?0w8`3(vT7V>Y{3kVn~(pm+b0*Hv!(ny9N?KF2=*9($&1 zg#F)h_P)*l#-2DZ_V^hTkYdjW5`DZ3?9+cn#lkRJ6#7o|^*d}J((>K%=w$N-6JAfv zFYX+HE4o@TRt7B0-d^d+)7LEHe!$X#;roLS8AkP`2aav}d-8MIu^5k~i75wH%qi*V z@jWDVe(T*Qo04))-Lg=TW9>9~rW@lOJ*&8G>e0>5EbdHURpVXI&Gw+ENAk$0#&7SZ zUp|-M5-2ZctG$-mvBJ;x@_OO8eJFH&0TT7v+DL<4z6pL zH2C6+o>rLelr9QN-sZX`OW@h`8BTLnxyDJ^F~42e>hq0dmq7ih(>tuY*cLw)4zQ8o zbKQ_8yvzJ-nR>0rG_%93(otsDXW0Mn2-aO4vs$OTV7bBDW~!3OCdXJme<^|+WoC# zU7bK!vV2wGz8^)xtGC>{)qN|%H8V8yZ|(Jy`I~O?AN+DGTDp2g(9_MwK0IbWXdd9r z$Rx*%E7M5;Ga~~7FculMG=f;@S&$Wy1<~RTWTptzOl(O3WD*E0Y1{`i8et|;2_wLp Tl?|ks2?#d=>0)4}XJ7yT5lg$O diff --git a/tests/data/duplicates1.xml b/tests/data/duplicates1.xml deleted file mode 100644 index ad678e2..0000000 --- a/tests/data/duplicates1.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - danny.baron@example1.com - Danny Baron - CA - M - TV (UTF-8: 📺) - 1 - Wed, 4 Jul 2001 - diff --git a/tests/data/duplicates2.ods b/tests/data/duplicates2.ods deleted file mode 100644 index 25751a81b12a4b8bcaad518f122c972d8f07cc69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12139 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 Vkgr7!0D$`XFno17r_{gB{ufcKM+pD` diff --git a/tests/data/duplicates2.xls b/tests/data/duplicates2.xls deleted file mode 100644 index 5774b299eb1f0d042493e6e255c4c0780b1d3192..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10752 zcmeHNU2GKB6+W|ntZnSI`3(@r0Ko=hjQ_%48}J{7L;jg*!O=iC|g5AQbIdh_k|?@3wvf&}GGu}UI7yn*KxE?h4X!!vPr zip8Rf#^b|wA6ekGqiYZj455e7>GNgiQS>VGYV;cP<>; zEby#k@s}4<4oe32oScUz7vI((V*G|&%uIj2Sj_lO8}m@UXMs<%73qHaS4EM?BVqYf z?KHQ%+WYTGKz04SJCU_Erowa zU7vJoQn#4#L!(=1|C+jPQP(;_^hc_vXI=Uyu-y;(5iaDxm63y4anLB=QdQNj>1aOiqsh>TbX)G&8@tm5ULBU zLHEpO=am)Z(u0TQrEUr>muswKN9>H9v(lSF5%~dPK)P?qD$Kej|0$ZdyKTxO9(0ZW zaB+A#N%1KgUkOjH^NoLS@z-Eelgo3OYv-NX4h$UCT>Op-_?8Oz<_h?#dGTS_?>~3M zhN2tk_qq5h8;Fn08UM!GS@<%)FPk&|tr*8g=isZO#89+TBP$M(eIb|!DOo9#rc z@u502YON2|NmQ*o!h^6gvFlQxTGsKD+-oIBUXB`q40AY_%jPtP4dgJ8&E_-NyiHV% zJj$|qB%4(;>SZHO(?@M9k;;r{RqADvAE$JwlgD`acE@#I3e>|ooO%ANolB=OXUMz` zmcgjw_Cy{TPK(<@amO9$wX&7^KbN=i6XTlxIO!+tbFc#$Y$JmqE09^-RDlJnc-{nZ!j<_uNbg? zbP5L+iFV7T4;bZm$%;a)=vwsuBJe+v=AaFH2RcH}9_TW90Q}^iKK|F1nnNT)%<(>m8Gy=PObw1^GxkB4oqTq+?cLSZb+WzVK-<0p zPwauUOw;Ud-M;0dHN0hq))MT7QklG+Gf!LbGj<-k&YQYMWZ2HM=Fg|?oU24h8Tf=D^Il<9}1X?7m)rK>AQ)g^g>a=ZTT1RrJWHOZ>b=f~bC9$-pK{Ssz zLQ0znfBnR-$R0Ug=miml_}U+`5N+AexIk=Fq@q;29X82Yyc_ zQ+5t4k8|0kQhDpb-fn^4hj2FLTcV9qvMHx=PL9hNKzSi`7*s-==fp*eiVp2n{fsbo zecoc0R^mCZ z*A4adQ$OqNXE`=)0#hY9 zJJt17HFg#114cCVHTJBAMo_D9vvINxKP7SglMQTY=}2BP$Y_C<~$qf!H6jw0nYT}sBt-t z`L!HJHhA4p^)et4{!yqLDW=RM@|3>w~&XHWTw}v3Ji3tm@ruo;v zX!O<)goR?L(po}rmV}^^z+Fx*v?R}YE<_2ast%13kmVi7FM-h>!$D6=2+fiZf`k~3 zeR>|f6O#=kh!P$xL6oqu1o8(MsG+o*%+W!eh=ndfc;8L|Mr!(WvKUK);4n zBPA|PGJxq3wKB#?4B0~KyG+gBT7szI<0Z)NN2aY9PKTQJG9T~W5^qMF7b8){+l`SZ zeDB3bRC&;ik*MO`=Lk58f%pAoCl#LnMMyRP0iD8W3 z;5b6bPD3T*2SP$z_XAM$xK@4*ydR1lx1TBypM#>O!UV>PsVzmlKF>v}1^RhK%1tYV zN{+igV_LYkBGu|h&_&8Ek-A9jb|mN`<(3d#q}&n`RH?!(A@da}w}i|sQeFwsManH9 z{LbwqqmYu|mXOe_WTcA}Qwpu5imgl`vmXQ3#U>&_0Xl z{_Uw7RB6er()y`G;KuK7Ty5P@f9VR=-}2E<`hg3V;a&ia^^3yUnfW=FYpjF^`C)rN zEbv+W{zJu2Sq_=cOpLK^1{vBAetnX|SHofTJCrjTxrFNqL@Qabb}@%7W-7-YS=xlrzwP+%&$K-fiOvSWDK|#qi?7NHg aGykik?C5Z>x24+O|NEPJmCgD0BL9DL2^szX diff --git a/tests/data/duplicates2.xlsx b/tests/data/duplicates2.xlsx deleted file mode 100644 index 5cc2413e96129b65742a595ef52156aec3462681..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7802 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 Bq<{bb diff --git a/tests/data/duplicates_old.csv b/tests/data/duplicates_old.csv deleted file mode 100644 index 8fcb581..0000000 --- a/tests/data/duplicates_old.csv +++ /dev/null @@ -1,11 +0,0 @@ -email,name,state,gender,purchase -danny.baron@example1.com,Danny Baron,CA,M,TV -melanie.white@example2.edu,Melanie White,NC,F,iPhone -danny.baron@example1.com,D. Baron,CA,M,Winter jacket -ben.tyler@example3.org,Ben Tyler,NV,M,Flashlight -arthur.duff@example4.com,Arthur Duff,OR,M,Dining table -danny.baron@example1.com,Daniel Baron,CA,M,Bike -jean.griffith@example5.org,Jean Griffith,WA,F,Power drill -melanie.white@example2.edu,Melanie White,NC,F,iPad -ben.morisson@example6.org,Ben Morisson,FL,M,Amplifier -arthur.duff@example4.com,Arthur Duff,OR,M,Night table \ No newline at end of file diff --git a/tests/data/dữ liệu biểu tượng cảm xúc.txt b/tests/data/dữ liệu biểu tượng cảm xúc.txt deleted file mode 100644 index bca3e44..0000000 --- a/tests/data/dữ liệu biểu tượng cảm xúc.txt +++ /dev/null @@ -1,1315 +0,0 @@ -# Emoji Data for UTR #51 -# -# File: emoji-data.txt -# Version: 1.0 -# Date: 2015-08-04 -# -# Copyright (c) 2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation and usage, see http://www.unicode.org/reports/tr51/ -# -# Format: Code ; Default_Emoji_Style ; Emoji_Level ; Emoji_Modifier_Status ; Emoji_Sources # Comment -# -# Field 1 — Default_Emoji_Style: -# text: default text presentation -# emoji: default emoji presentation -# Field 2 — Emoji_Level: -# L1: level 1 emoji -# L2: level 2 emoji -# NA: not applicable -# Field 3 — Emoji_Modifier_Status: -# modifier: an emoji modifier -# primary: a primary emoji modifier base -# secondary: a secondary emoji modifier base -# none: not applicable -# Field 4 — Emoji_Sources: -# one or more values from {z, a, j, w, x} -# see the key in http://unicode.org/reports/tr51#Major_Sources -# NA: not applicable -# Comment — currently contains the version where the character was first encoded, -# followed by: -# - a character name in uppercase (for a single character), -# - a keycap name, -# - an associated flag, where is associated with value unicode region code -# -00A9 ; text ; L1 ; none ; j # V1.1 (©) COPYRIGHT SIGN -00AE ; text ; L1 ; none ; j # V1.1 (®) REGISTERED SIGN -203C ; text ; L1 ; none ; a j # V1.1 (‼) DOUBLE EXCLAMATION MARK -2049 ; text ; L1 ; none ; a j # V3.0 (⁉) EXCLAMATION QUESTION MARK -2122 ; text ; L1 ; none ; j # V1.1 (™) TRADE MARK SIGN -2139 ; text ; L1 ; none ; j # V3.0 (ℹ) INFORMATION SOURCE -2194 ; text ; L1 ; none ; z j # V1.1 (↔) LEFT RIGHT ARROW -2195 ; text ; L1 ; none ; z j # V1.1 (↕) UP DOWN ARROW -2196 ; text ; L1 ; none ; j # V1.1 (↖) NORTH WEST ARROW -2197 ; text ; L1 ; none ; j # V1.1 (↗) NORTH EAST ARROW -2198 ; text ; L1 ; none ; j # V1.1 (↘) SOUTH EAST ARROW -2199 ; text ; L1 ; none ; j # V1.1 (↙) SOUTH WEST ARROW -21A9 ; text ; L1 ; none ; j # V1.1 (↩) LEFTWARDS ARROW WITH HOOK -21AA ; text ; L1 ; none ; j # V1.1 (↪) RIGHTWARDS ARROW WITH HOOK -231A ; emoji ; L1 ; none ; j # V1.1 (⌚) WATCH -231B ; emoji ; L1 ; none ; j # V1.1 (⌛) HOURGLASS -2328 ; text ; L2 ; none ; x # V1.1 (⌨) KEYBOARD -23CF ; text ; L2 ; none ; x # V4.0 (⏏) EJECT SYMBOL -23E9 ; emoji ; L1 ; none ; j w # V6.0 (⏩) BLACK RIGHT-POINTING DOUBLE TRIANGLE -23EA ; emoji ; L1 ; none ; j w # V6.0 (⏪) BLACK LEFT-POINTING DOUBLE TRIANGLE -23EB ; emoji ; L1 ; none ; j # V6.0 (⏫) BLACK UP-POINTING DOUBLE TRIANGLE -23EC ; emoji ; L1 ; none ; j # V6.0 (⏬) BLACK DOWN-POINTING DOUBLE TRIANGLE -23ED ; text ; L2 ; none ; w # V6.0 (⏭) BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR -23EE ; text ; L2 ; none ; w # V6.0 (⏮) BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR -23EF ; text ; L2 ; none ; x # V6.0 (⏯) BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR -23F0 ; emoji ; L1 ; none ; j # V6.0 (⏰) ALARM CLOCK -23F1 ; text ; L2 ; none ; x # V6.0 (⏱) STOPWATCH -23F2 ; text ; L2 ; none ; x # V6.0 (⏲) TIMER CLOCK -23F3 ; emoji ; L1 ; none ; j w # V6.0 (⏳) HOURGLASS WITH FLOWING SAND -23F8 ; text ; L2 ; none ; w # V7.0 (⏸) DOUBLE VERTICAL BAR -23F9 ; text ; L2 ; none ; w # V7.0 (⏹) BLACK SQUARE FOR STOP -23FA ; text ; L2 ; none ; w # V7.0 (⏺) BLACK CIRCLE FOR RECORD -24C2 ; text ; L1 ; none ; j # V1.1 (Ⓜ) CIRCLED LATIN CAPITAL LETTER M -25AA ; text ; L1 ; none ; j w # V1.1 (▪) BLACK SMALL SQUARE -25AB ; text ; L1 ; none ; j # V1.1 (▫) WHITE SMALL SQUARE -25B6 ; text ; L1 ; none ; a j w # V1.1 (▶) BLACK RIGHT-POINTING TRIANGLE -25C0 ; text ; L1 ; none ; a j w # V1.1 (◀) BLACK LEFT-POINTING TRIANGLE -25FB ; text ; L1 ; none ; j # V3.2 (◻) WHITE MEDIUM SQUARE -25FC ; text ; L1 ; none ; j w # V3.2 (◼) BLACK MEDIUM SQUARE -25FD ; emoji ; L1 ; none ; j # V3.2 (◽) WHITE MEDIUM SMALL SQUARE -25FE ; emoji ; L1 ; none ; j w # V3.2 (◾) BLACK MEDIUM SMALL SQUARE -2600 ; text ; L1 ; none ; a j # V1.1 (☀) BLACK SUN WITH RAYS -2601 ; text ; L1 ; none ; a j w # V1.1 (☁) CLOUD -2602 ; text ; L2 ; none ; a # V1.1 (☂) UMBRELLA -2603 ; text ; L2 ; none ; a # V1.1 (☃) SNOWMAN -2604 ; text ; L2 ; none ; x # V1.1 (☄) COMET -260E ; text ; L1 ; none ; z a j # V1.1 (☎) BLACK TELEPHONE -2611 ; text ; L1 ; none ; j w # V1.1 (☑) BALLOT BOX WITH CHECK -2614 ; emoji ; L1 ; none ; a j # V4.0 (☔) UMBRELLA WITH RAIN DROPS -2615 ; emoji ; L1 ; none ; j # V4.0 (☕) HOT BEVERAGE -2618 ; text ; L2 ; none ; x # V4.1 (☘) SHAMROCK -261D ; text ; L1 ; secondary ; j w # V1.1 (☝) WHITE UP POINTING INDEX -2620 ; text ; L2 ; none ; x # V1.1 (☠) SKULL AND CROSSBONES -2622 ; text ; L2 ; none ; x # V1.1 (☢) RADIOACTIVE SIGN -2623 ; text ; L2 ; none ; x # V1.1 (☣) BIOHAZARD SIGN -2626 ; text ; L2 ; none ; x # V1.1 (☦) ORTHODOX CROSS -262A ; text ; L2 ; none ; w # V1.1 (☪) STAR AND CRESCENT -262E ; text ; L2 ; none ; x # V1.1 (☮) PEACE SYMBOL -262F ; text ; L2 ; none ; w # V1.1 (☯) YIN YANG -2638 ; text ; L2 ; none ; w # V1.1 (☸) WHEEL OF DHARMA -2639 ; text ; L2 ; secondary ; w # V1.1 (☹) WHITE FROWNING FACE -263A ; text ; L1 ; secondary ; j w # V1.1 (☺) WHITE SMILING FACE -2648 ; emoji ; L1 ; none ; j w # V1.1 (♈) ARIES -2649 ; emoji ; L1 ; none ; j w # V1.1 (♉) TAURUS -264A ; emoji ; L1 ; none ; j w # V1.1 (♊) GEMINI -264B ; emoji ; L1 ; none ; j w # V1.1 (♋) CANCER -264C ; emoji ; L1 ; none ; j w # V1.1 (♌) LEO -264D ; emoji ; L1 ; none ; j w # V1.1 (♍) VIRGO -264E ; emoji ; L1 ; none ; j w # V1.1 (♎) LIBRA -264F ; emoji ; L1 ; none ; j w # V1.1 (♏) SCORPIUS -2650 ; emoji ; L1 ; none ; j w # V1.1 (♐) SAGITTARIUS -2651 ; emoji ; L1 ; none ; j w # V1.1 (♑) CAPRICORN -2652 ; emoji ; L1 ; none ; j w # V1.1 (♒) AQUARIUS -2653 ; emoji ; L1 ; none ; j w # V1.1 (♓) PISCES -2660 ; text ; L1 ; none ; z a j # V1.1 (♠) BLACK SPADE SUIT -2663 ; text ; L1 ; none ; z a j # V1.1 (♣) BLACK CLUB SUIT -2665 ; text ; L1 ; none ; z a j # V1.1 (♥) BLACK HEART SUIT -2666 ; text ; L1 ; none ; z a j # V1.1 (♦) BLACK DIAMOND SUIT -2668 ; text ; L1 ; none ; a j # V1.1 (♨) HOT SPRINGS -267B ; text ; L1 ; none ; j # V3.2 (♻) BLACK UNIVERSAL RECYCLING SYMBOL -267F ; emoji ; L1 ; none ; j w # V4.1 (♿) WHEELCHAIR SYMBOL -2692 ; text ; L2 ; none ; x # V4.1 (⚒) HAMMER AND PICK -2693 ; emoji ; L1 ; none ; a j # V4.1 (⚓) ANCHOR -2694 ; text ; L2 ; none ; x # V4.1 (⚔) CROSSED SWORDS -2696 ; text ; L2 ; none ; x # V4.1 (⚖) SCALES -2697 ; text ; L2 ; none ; x # V4.1 (⚗) ALEMBIC -2699 ; text ; L2 ; none ; x # V4.1 (⚙) GEAR -269B ; text ; L2 ; none ; x # V4.1 (⚛) ATOM SYMBOL -269C ; text ; L2 ; none ; x # V4.1 (⚜) FLEUR-DE-LIS -26A0 ; text ; L1 ; none ; j # V4.0 (⚠) WARNING SIGN -26A1 ; emoji ; L1 ; none ; a j # V4.0 (⚡) HIGH VOLTAGE SIGN -26AA ; emoji ; L1 ; none ; j # V4.1 (⚪) MEDIUM WHITE CIRCLE -26AB ; emoji ; L1 ; none ; j w # V4.1 (⚫) MEDIUM BLACK CIRCLE -26B0 ; text ; L2 ; none ; x # V4.1 (⚰) COFFIN -26B1 ; text ; L2 ; none ; x # V4.1 (⚱) FUNERAL URN -26BD ; emoji ; L1 ; none ; j # V5.2 (⚽) SOCCER BALL -26BE ; emoji ; L1 ; none ; a j # V5.2 (⚾) BASEBALL -26C4 ; emoji ; L1 ; none ; a j # V5.2 (⛄) SNOWMAN WITHOUT SNOW -26C5 ; emoji ; L1 ; none ; a j # V5.2 (⛅) SUN BEHIND CLOUD -26C8 ; text ; L2 ; none ; a # V5.2 (⛈) THUNDER CLOUD AND RAIN -26CE ; emoji ; L1 ; none ; a j # V6.0 (⛎) OPHIUCHUS -26CF ; text ; L2 ; none ; a # V5.2 (⛏) PICK -26D1 ; text ; L2 ; none ; a # V5.2 (⛑) HELMET WITH WHITE CROSS -26D3 ; text ; L2 ; none ; a # V5.2 (⛓) CHAINS -26D4 ; emoji ; L1 ; none ; a j # V5.2 (⛔) NO ENTRY -26E9 ; text ; L2 ; none ; a # V5.2 (⛩) SHINTO SHRINE -26EA ; emoji ; L1 ; none ; a j # V5.2 (⛪) CHURCH -26F0 ; text ; L2 ; none ; a # V5.2 (⛰) MOUNTAIN -26F1 ; text ; L2 ; none ; a # V5.2 (⛱) UMBRELLA ON GROUND -26F2 ; emoji ; L1 ; none ; a j # V5.2 (⛲) FOUNTAIN -26F3 ; emoji ; L1 ; none ; a j w # V5.2 (⛳) FLAG IN HOLE -26F4 ; text ; L2 ; none ; a # V5.2 (⛴) FERRY -26F5 ; emoji ; L1 ; none ; a j # V5.2 (⛵) SAILBOAT -26F7 ; text ; L2 ; none ; a w # V5.2 (⛷) SKIER -26F8 ; text ; L2 ; none ; a # V5.2 (⛸) ICE SKATE -26F9 ; text ; L2 ; none ; a # V5.2 (⛹) PERSON WITH BALL -26FA ; emoji ; L1 ; none ; a j # V5.2 (⛺) TENT -26FD ; emoji ; L1 ; none ; a j # V5.2 (⛽) FUEL PUMP -2702 ; text ; L1 ; none ; z j w # V1.1 (✂) BLACK SCISSORS -2705 ; emoji ; L1 ; none ; j # V6.0 (✅) WHITE HEAVY CHECK MARK -2708 ; text ; L1 ; none ; z a j w # V1.1 (✈) AIRPLANE -2709 ; text ; L1 ; none ; z j # V1.1 (✉) ENVELOPE -270A ; emoji ; L1 ; secondary ; j # V6.0 (✊) RAISED FIST -270B ; emoji ; L1 ; secondary ; j # V6.0 (✋) RAISED HAND -270C ; text ; L1 ; secondary ; z j w # V1.1 (✌) VICTORY HAND -270D ; text ; L2 ; secondary ; z w # V1.1 (✍) WRITING HAND -270F ; text ; L1 ; none ; z j # V1.1 (✏) PENCIL -2712 ; text ; L1 ; none ; z j # V1.1 (✒) BLACK NIB -2714 ; text ; L1 ; none ; z j w # V1.1 (✔) HEAVY CHECK MARK -2716 ; text ; L1 ; none ; z j # V1.1 (✖) HEAVY MULTIPLICATION X -271D ; text ; L2 ; none ; w # V1.1 (✝) LATIN CROSS -2721 ; text ; L2 ; none ; w # V1.1 (✡) STAR OF DAVID -2728 ; emoji ; L1 ; none ; j # V6.0 (✨) SPARKLES -2733 ; text ; L1 ; none ; z j # V1.1 (✳) EIGHT SPOKED ASTERISK -2734 ; text ; L1 ; none ; z j # V1.1 (✴) EIGHT POINTED BLACK STAR -2744 ; text ; L1 ; none ; z j w # V1.1 (❄) SNOWFLAKE -2747 ; text ; L1 ; none ; z j # V1.1 (❇) SPARKLE -274C ; emoji ; L1 ; none ; j # V6.0 (❌) CROSS MARK -274E ; emoji ; L1 ; none ; j # V6.0 (❎) NEGATIVE SQUARED CROSS MARK -2753 ; emoji ; L1 ; none ; j w # V6.0 (❓) BLACK QUESTION MARK ORNAMENT -2754 ; emoji ; L1 ; none ; j # V6.0 (❔) WHITE QUESTION MARK ORNAMENT -2755 ; emoji ; L1 ; none ; j # V6.0 (❕) WHITE EXCLAMATION MARK ORNAMENT -2757 ; emoji ; L1 ; none ; j # V5.2 (❗) HEAVY EXCLAMATION MARK SYMBOL -2763 ; text ; L2 ; none ; z # V1.1 (❣) HEAVY HEART EXCLAMATION MARK ORNAMENT -2764 ; text ; L1 ; none ; z j # V1.1 (❤) HEAVY BLACK HEART -2795 ; emoji ; L1 ; none ; j # V6.0 (➕) HEAVY PLUS SIGN -2796 ; emoji ; L1 ; none ; j # V6.0 (➖) HEAVY MINUS SIGN -2797 ; emoji ; L1 ; none ; j # V6.0 (➗) HEAVY DIVISION SIGN -27A1 ; text ; L1 ; none ; z a j # V1.1 (➡) BLACK RIGHTWARDS ARROW -27B0 ; emoji ; L1 ; none ; j # V6.0 (➰) CURLY LOOP -27BF ; emoji ; L1 ; none ; x # V6.0 (➿) DOUBLE CURLY LOOP -2934 ; text ; L1 ; none ; j # V3.2 (⤴) ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS -2935 ; text ; L1 ; none ; j # V3.2 (⤵) ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS -2B05 ; text ; L1 ; none ; a j # V4.0 (⬅) LEFTWARDS BLACK ARROW -2B06 ; text ; L1 ; none ; a j # V4.0 (⬆) UPWARDS BLACK ARROW -2B07 ; text ; L1 ; none ; a j # V4.0 (⬇) DOWNWARDS BLACK ARROW -2B1B ; emoji ; L1 ; none ; a j w # V5.1 (⬛) BLACK LARGE SQUARE -2B1C ; emoji ; L1 ; none ; j w # V5.1 (⬜) WHITE LARGE SQUARE -2B50 ; emoji ; L1 ; none ; j # V5.1 (⭐) WHITE MEDIUM STAR -2B55 ; emoji ; L1 ; none ; j # V5.2 (⭕) HEAVY LARGE CIRCLE -3030 ; text ; L1 ; none ; j # V1.1 (〰) WAVY DASH -303D ; text ; L1 ; none ; j # V3.2 (〽) PART ALTERNATION MARK -3297 ; text ; L1 ; none ; j # V1.1 (㊗) CIRCLED IDEOGRAPH CONGRATULATION -3299 ; text ; L1 ; none ; a j # V1.1 (㊙) CIRCLED IDEOGRAPH SECRET -1F004 ; emoji ; L1 ; none ; j # V5.1 (🀄) MAHJONG TILE RED DRAGON -1F0CF ; emoji ; L1 ; none ; j # V6.0 (🃏) PLAYING CARD BLACK JOKER -1F170 ; text ; L1 ; none ; j # V6.0 (🅰) NEGATIVE SQUARED LATIN CAPITAL LETTER A -1F171 ; text ; L1 ; none ; j # V6.0 (🅱) NEGATIVE SQUARED LATIN CAPITAL LETTER B -1F17E ; text ; L1 ; none ; j # V6.0 (🅾) NEGATIVE SQUARED LATIN CAPITAL LETTER O -1F17F ; text ; L1 ; none ; a j # V5.2 (🅿) NEGATIVE SQUARED LATIN CAPITAL LETTER P -1F18E ; emoji ; L1 ; none ; j # V6.0 (🆎) NEGATIVE SQUARED AB -1F191 ; emoji ; L1 ; none ; j # V6.0 (🆑) SQUARED CL -1F192 ; emoji ; L1 ; none ; j # V6.0 (🆒) SQUARED COOL -1F193 ; emoji ; L1 ; none ; j # V6.0 (🆓) SQUARED FREE -1F194 ; emoji ; L1 ; none ; j # V6.0 (🆔) SQUARED ID -1F195 ; emoji ; L1 ; none ; j # V6.0 (🆕) SQUARED NEW -1F196 ; emoji ; L1 ; none ; j # V6.0 (🆖) SQUARED NG -1F197 ; emoji ; L1 ; none ; j # V6.0 (🆗) SQUARED OK -1F198 ; emoji ; L1 ; none ; j # V6.0 (🆘) SQUARED SOS -1F199 ; emoji ; L1 ; none ; j # V6.0 (🆙) SQUARED UP WITH EXCLAMATION MARK -1F19A ; emoji ; L1 ; none ; j # V6.0 (🆚) SQUARED VS -1F201 ; emoji ; L1 ; none ; j # V6.0 (🈁) SQUARED KATAKANA KOKO -1F202 ; text ; L1 ; none ; j # V6.0 (🈂) SQUARED KATAKANA SA -1F21A ; emoji ; L1 ; none ; a j # V5.2 (🈚) SQUARED CJK UNIFIED IDEOGRAPH-7121 -1F22F ; emoji ; L1 ; none ; a j # V5.2 (🈯) SQUARED CJK UNIFIED IDEOGRAPH-6307 -1F232 ; emoji ; L1 ; none ; j # V6.0 (🈲) SQUARED CJK UNIFIED IDEOGRAPH-7981 -1F233 ; emoji ; L1 ; none ; j # V6.0 (🈳) SQUARED CJK UNIFIED IDEOGRAPH-7A7A -1F234 ; emoji ; L1 ; none ; j # V6.0 (🈴) SQUARED CJK UNIFIED IDEOGRAPH-5408 -1F235 ; emoji ; L1 ; none ; j # V6.0 (🈵) SQUARED CJK UNIFIED IDEOGRAPH-6E80 -1F236 ; emoji ; L1 ; none ; j # V6.0 (🈶) SQUARED CJK UNIFIED IDEOGRAPH-6709 -1F237 ; text ; L1 ; none ; j # V6.0 (🈷) SQUARED CJK UNIFIED IDEOGRAPH-6708 -1F238 ; emoji ; L1 ; none ; j # V6.0 (🈸) SQUARED CJK UNIFIED IDEOGRAPH-7533 -1F239 ; emoji ; L1 ; none ; j # V6.0 (🈹) SQUARED CJK UNIFIED IDEOGRAPH-5272 -1F23A ; emoji ; L1 ; none ; j # V6.0 (🈺) SQUARED CJK UNIFIED IDEOGRAPH-55B6 -1F250 ; emoji ; L1 ; none ; j # V6.0 (🉐) CIRCLED IDEOGRAPH ADVANTAGE -1F251 ; emoji ; L1 ; none ; j # V6.0 (🉑) CIRCLED IDEOGRAPH ACCEPT -1F300 ; emoji ; L1 ; none ; j # V6.0 (🌀) CYCLONE -1F301 ; emoji ; L1 ; none ; j # V6.0 (🌁) FOGGY -1F302 ; emoji ; L1 ; none ; j # V6.0 (🌂) CLOSED UMBRELLA -1F303 ; emoji ; L1 ; none ; j # V6.0 (🌃) NIGHT WITH STARS -1F304 ; emoji ; L1 ; none ; j # V6.0 (🌄) SUNRISE OVER MOUNTAINS -1F305 ; emoji ; L1 ; none ; j # V6.0 (🌅) SUNRISE -1F306 ; emoji ; L1 ; none ; j # V6.0 (🌆) CITYSCAPE AT DUSK -1F307 ; emoji ; L1 ; none ; j # V6.0 (🌇) SUNSET OVER BUILDINGS -1F308 ; emoji ; L1 ; none ; j # V6.0 (🌈) RAINBOW -1F309 ; emoji ; L1 ; none ; j # V6.0 (🌉) BRIDGE AT NIGHT -1F30A ; emoji ; L1 ; none ; j # V6.0 (🌊) WATER WAVE -1F30B ; emoji ; L1 ; none ; j # V6.0 (🌋) VOLCANO -1F30C ; emoji ; L1 ; none ; j # V6.0 (🌌) MILKY WAY -1F30D ; emoji ; L1 ; none ; w # V6.0 (🌍) EARTH GLOBE EUROPE-AFRICA -1F30E ; emoji ; L1 ; none ; w # V6.0 (🌎) EARTH GLOBE AMERICAS -1F30F ; emoji ; L1 ; none ; j w # V6.0 (🌏) EARTH GLOBE ASIA-AUSTRALIA -1F310 ; emoji ; L1 ; none ; x # V6.0 (🌐) GLOBE WITH MERIDIANS -1F311 ; emoji ; L1 ; none ; j # V6.0 (🌑) NEW MOON SYMBOL -1F312 ; emoji ; L1 ; none ; x # V6.0 (🌒) WAXING CRESCENT MOON SYMBOL -1F313 ; emoji ; L1 ; none ; j # V6.0 (🌓) FIRST QUARTER MOON SYMBOL -1F314 ; emoji ; L1 ; none ; j # V6.0 (🌔) WAXING GIBBOUS MOON SYMBOL -1F315 ; emoji ; L1 ; none ; j w # V6.0 (🌕) FULL MOON SYMBOL -1F316 ; emoji ; L1 ; none ; x # V6.0 (🌖) WANING GIBBOUS MOON SYMBOL -1F317 ; emoji ; L1 ; none ; x # V6.0 (🌗) LAST QUARTER MOON SYMBOL -1F318 ; emoji ; L1 ; none ; x # V6.0 (🌘) WANING CRESCENT MOON SYMBOL -1F319 ; emoji ; L1 ; none ; j # V6.0 (🌙) CRESCENT MOON -1F31A ; emoji ; L1 ; none ; x # V6.0 (🌚) NEW MOON WITH FACE -1F31B ; emoji ; L1 ; none ; j # V6.0 (🌛) FIRST QUARTER MOON WITH FACE -1F31C ; emoji ; L1 ; none ; w # V6.0 (🌜) LAST QUARTER MOON WITH FACE -1F31D ; emoji ; L1 ; none ; x # V6.0 (🌝) FULL MOON WITH FACE -1F31E ; emoji ; L1 ; none ; x # V6.0 (🌞) SUN WITH FACE -1F31F ; emoji ; L1 ; none ; j # V6.0 (🌟) GLOWING STAR -1F320 ; emoji ; L1 ; none ; j # V6.0 (🌠) SHOOTING STAR -1F321 ; text ; L2 ; none ; w # V7.0 (🌡) THERMOMETER -1F324 ; text ; L2 ; none ; w # V7.0 (🌤) WHITE SUN WITH SMALL CLOUD -1F325 ; text ; L2 ; none ; w # V7.0 (🌥) WHITE SUN BEHIND CLOUD -1F326 ; text ; L2 ; none ; w # V7.0 (🌦) WHITE SUN BEHIND CLOUD WITH RAIN -1F327 ; text ; L2 ; none ; w # V7.0 (🌧) CLOUD WITH RAIN -1F328 ; text ; L2 ; none ; w # V7.0 (🌨) CLOUD WITH SNOW -1F329 ; text ; L2 ; none ; w # V7.0 (🌩) CLOUD WITH LIGHTNING -1F32A ; text ; L2 ; none ; w # V7.0 (🌪) CLOUD WITH TORNADO -1F32B ; text ; L2 ; none ; w # V7.0 (🌫) FOG -1F32C ; text ; L2 ; none ; w # V7.0 (🌬) WIND BLOWING FACE -1F32D ; emoji ; L2 ; none ; x # V8.0 (🌭) HOT DOG -1F32E ; emoji ; L2 ; none ; x # V8.0 (🌮) TACO -1F32F ; emoji ; L2 ; none ; x # V8.0 (🌯) BURRITO -1F330 ; emoji ; L1 ; none ; j # V6.0 (🌰) CHESTNUT -1F331 ; emoji ; L1 ; none ; j # V6.0 (🌱) SEEDLING -1F332 ; emoji ; L1 ; none ; x # V6.0 (🌲) EVERGREEN TREE -1F333 ; emoji ; L1 ; none ; x # V6.0 (🌳) DECIDUOUS TREE -1F334 ; emoji ; L1 ; none ; j # V6.0 (🌴) PALM TREE -1F335 ; emoji ; L1 ; none ; j # V6.0 (🌵) CACTUS -1F336 ; text ; L2 ; none ; w # V7.0 (🌶) HOT PEPPER -1F337 ; emoji ; L1 ; none ; j # V6.0 (🌷) TULIP -1F338 ; emoji ; L1 ; none ; j # V6.0 (🌸) CHERRY BLOSSOM -1F339 ; emoji ; L1 ; none ; j # V6.0 (🌹) ROSE -1F33A ; emoji ; L1 ; none ; j # V6.0 (🌺) HIBISCUS -1F33B ; emoji ; L1 ; none ; j # V6.0 (🌻) SUNFLOWER -1F33C ; emoji ; L1 ; none ; j # V6.0 (🌼) BLOSSOM -1F33D ; emoji ; L1 ; none ; j # V6.0 (🌽) EAR OF MAIZE -1F33E ; emoji ; L1 ; none ; j # V6.0 (🌾) EAR OF RICE -1F33F ; emoji ; L1 ; none ; j # V6.0 (🌿) HERB -1F340 ; emoji ; L1 ; none ; j # V6.0 (🍀) FOUR LEAF CLOVER -1F341 ; emoji ; L1 ; none ; j # V6.0 (🍁) MAPLE LEAF -1F342 ; emoji ; L1 ; none ; j # V6.0 (🍂) FALLEN LEAF -1F343 ; emoji ; L1 ; none ; j # V6.0 (🍃) LEAF FLUTTERING IN WIND -1F344 ; emoji ; L1 ; none ; j # V6.0 (🍄) MUSHROOM -1F345 ; emoji ; L1 ; none ; j # V6.0 (🍅) TOMATO -1F346 ; emoji ; L1 ; none ; j # V6.0 (🍆) AUBERGINE -1F347 ; emoji ; L1 ; none ; j # V6.0 (🍇) GRAPES -1F348 ; emoji ; L1 ; none ; j # V6.0 (🍈) MELON -1F349 ; emoji ; L1 ; none ; j # V6.0 (🍉) WATERMELON -1F34A ; emoji ; L1 ; none ; j # V6.0 (🍊) TANGERINE -1F34B ; emoji ; L1 ; none ; x # V6.0 (🍋) LEMON -1F34C ; emoji ; L1 ; none ; j # V6.0 (🍌) BANANA -1F34D ; emoji ; L1 ; none ; j # V6.0 (🍍) PINEAPPLE -1F34E ; emoji ; L1 ; none ; j # V6.0 (🍎) RED APPLE -1F34F ; emoji ; L1 ; none ; j # V6.0 (🍏) GREEN APPLE -1F350 ; emoji ; L1 ; none ; x # V6.0 (🍐) PEAR -1F351 ; emoji ; L1 ; none ; j # V6.0 (🍑) PEACH -1F352 ; emoji ; L1 ; none ; j # V6.0 (🍒) CHERRIES -1F353 ; emoji ; L1 ; none ; j # V6.0 (🍓) STRAWBERRY -1F354 ; emoji ; L1 ; none ; j # V6.0 (🍔) HAMBURGER -1F355 ; emoji ; L1 ; none ; j # V6.0 (🍕) SLICE OF PIZZA -1F356 ; emoji ; L1 ; none ; j # V6.0 (🍖) MEAT ON BONE -1F357 ; emoji ; L1 ; none ; j # V6.0 (🍗) POULTRY LEG -1F358 ; emoji ; L1 ; none ; j # V6.0 (🍘) RICE CRACKER -1F359 ; emoji ; L1 ; none ; j # V6.0 (🍙) RICE BALL -1F35A ; emoji ; L1 ; none ; j # V6.0 (🍚) COOKED RICE -1F35B ; emoji ; L1 ; none ; j # V6.0 (🍛) CURRY AND RICE -1F35C ; emoji ; L1 ; none ; j # V6.0 (🍜) STEAMING BOWL -1F35D ; emoji ; L1 ; none ; j # V6.0 (🍝) SPAGHETTI -1F35E ; emoji ; L1 ; none ; j # V6.0 (🍞) BREAD -1F35F ; emoji ; L1 ; none ; j # V6.0 (🍟) FRENCH FRIES -1F360 ; emoji ; L1 ; none ; j # V6.0 (🍠) ROASTED SWEET POTATO -1F361 ; emoji ; L1 ; none ; j # V6.0 (🍡) DANGO -1F362 ; emoji ; L1 ; none ; j # V6.0 (🍢) ODEN -1F363 ; emoji ; L1 ; none ; j # V6.0 (🍣) SUSHI -1F364 ; emoji ; L1 ; none ; j # V6.0 (🍤) FRIED SHRIMP -1F365 ; emoji ; L1 ; none ; j # V6.0 (🍥) FISH CAKE WITH SWIRL DESIGN -1F366 ; emoji ; L1 ; none ; j # V6.0 (🍦) SOFT ICE CREAM -1F367 ; emoji ; L1 ; none ; j # V6.0 (🍧) SHAVED ICE -1F368 ; emoji ; L1 ; none ; j # V6.0 (🍨) ICE CREAM -1F369 ; emoji ; L1 ; none ; j # V6.0 (🍩) DOUGHNUT -1F36A ; emoji ; L1 ; none ; j # V6.0 (🍪) COOKIE -1F36B ; emoji ; L1 ; none ; j # V6.0 (🍫) CHOCOLATE BAR -1F36C ; emoji ; L1 ; none ; j # V6.0 (🍬) CANDY -1F36D ; emoji ; L1 ; none ; j # V6.0 (🍭) LOLLIPOP -1F36E ; emoji ; L1 ; none ; j # V6.0 (🍮) CUSTARD -1F36F ; emoji ; L1 ; none ; j # V6.0 (🍯) HONEY POT -1F370 ; emoji ; L1 ; none ; j # V6.0 (🍰) SHORTCAKE -1F371 ; emoji ; L1 ; none ; j # V6.0 (🍱) BENTO BOX -1F372 ; emoji ; L1 ; none ; j # V6.0 (🍲) POT OF FOOD -1F373 ; emoji ; L1 ; none ; j # V6.0 (🍳) COOKING -1F374 ; emoji ; L1 ; none ; j # V6.0 (🍴) FORK AND KNIFE -1F375 ; emoji ; L1 ; none ; j # V6.0 (🍵) TEACUP WITHOUT HANDLE -1F376 ; emoji ; L1 ; none ; j # V6.0 (🍶) SAKE BOTTLE AND CUP -1F377 ; emoji ; L1 ; none ; j # V6.0 (🍷) WINE GLASS -1F378 ; emoji ; L1 ; none ; j w # V6.0 (🍸) COCKTAIL GLASS -1F379 ; emoji ; L1 ; none ; j # V6.0 (🍹) TROPICAL DRINK -1F37A ; emoji ; L1 ; none ; j # V6.0 (🍺) BEER MUG -1F37B ; emoji ; L1 ; none ; j # V6.0 (🍻) CLINKING BEER MUGS -1F37C ; emoji ; L1 ; none ; x # V6.0 (🍼) BABY BOTTLE -1F37D ; text ; L2 ; none ; w # V7.0 (🍽) FORK AND KNIFE WITH PLATE -1F37E ; emoji ; L2 ; none ; x # V8.0 (🍾) BOTTLE WITH POPPING CORK -1F37F ; emoji ; L2 ; none ; x # V8.0 (🍿) POPCORN -1F380 ; emoji ; L1 ; none ; j # V6.0 (🎀) RIBBON -1F381 ; emoji ; L1 ; none ; j # V6.0 (🎁) WRAPPED PRESENT -1F382 ; emoji ; L1 ; none ; j # V6.0 (🎂) BIRTHDAY CAKE -1F383 ; emoji ; L1 ; none ; j # V6.0 (🎃) JACK-O-LANTERN -1F384 ; emoji ; L1 ; none ; j # V6.0 (🎄) CHRISTMAS TREE -1F385 ; emoji ; L1 ; primary ; j # V6.0 (🎅) FATHER CHRISTMAS -1F386 ; emoji ; L1 ; none ; j # V6.0 (🎆) FIREWORKS -1F387 ; emoji ; L1 ; none ; j # V6.0 (🎇) FIREWORK SPARKLER -1F388 ; emoji ; L1 ; none ; j # V6.0 (🎈) BALLOON -1F389 ; emoji ; L1 ; none ; j # V6.0 (🎉) PARTY POPPER -1F38A ; emoji ; L1 ; none ; j # V6.0 (🎊) CONFETTI BALL -1F38B ; emoji ; L1 ; none ; j # V6.0 (🎋) TANABATA TREE -1F38C ; emoji ; L1 ; none ; j # V6.0 (🎌) CROSSED FLAGS -1F38D ; emoji ; L1 ; none ; j # V6.0 (🎍) PINE DECORATION -1F38E ; emoji ; L1 ; none ; j # V6.0 (🎎) JAPANESE DOLLS -1F38F ; emoji ; L1 ; none ; j # V6.0 (🎏) CARP STREAMER -1F390 ; emoji ; L1 ; none ; j # V6.0 (🎐) WIND CHIME -1F391 ; emoji ; L1 ; none ; j # V6.0 (🎑) MOON VIEWING CEREMONY -1F392 ; emoji ; L1 ; none ; j # V6.0 (🎒) SCHOOL SATCHEL -1F393 ; emoji ; L1 ; none ; j w # V6.0 (🎓) GRADUATION CAP -1F396 ; text ; L2 ; none ; w # V7.0 (🎖) MILITARY MEDAL -1F397 ; text ; L2 ; none ; w # V7.0 (🎗) REMINDER RIBBON -1F399 ; text ; L2 ; none ; w # V7.0 (🎙) STUDIO MICROPHONE -1F39A ; text ; L2 ; none ; w # V7.0 (🎚) LEVEL SLIDER -1F39B ; text ; L2 ; none ; w # V7.0 (🎛) CONTROL KNOBS -1F39E ; text ; L2 ; none ; w # V7.0 (🎞) FILM FRAMES -1F39F ; text ; L2 ; none ; w # V7.0 (🎟) ADMISSION TICKETS -1F3A0 ; emoji ; L1 ; none ; j # V6.0 (🎠) CAROUSEL HORSE -1F3A1 ; emoji ; L1 ; none ; j # V6.0 (🎡) FERRIS WHEEL -1F3A2 ; emoji ; L1 ; none ; j # V6.0 (🎢) ROLLER COASTER -1F3A3 ; emoji ; L1 ; none ; j # V6.0 (🎣) FISHING POLE AND FISH -1F3A4 ; emoji ; L1 ; none ; j # V6.0 (🎤) MICROPHONE -1F3A5 ; emoji ; L1 ; none ; j # V6.0 (🎥) MOVIE CAMERA -1F3A6 ; emoji ; L1 ; none ; j # V6.0 (🎦) CINEMA -1F3A7 ; emoji ; L1 ; none ; j w # V6.0 (🎧) HEADPHONE -1F3A8 ; emoji ; L1 ; none ; j # V6.0 (🎨) ARTIST PALETTE -1F3A9 ; emoji ; L1 ; none ; j # V6.0 (🎩) TOP HAT -1F3AA ; emoji ; L1 ; none ; j # V6.0 (🎪) CIRCUS TENT -1F3AB ; emoji ; L1 ; none ; j # V6.0 (🎫) TICKET -1F3AC ; emoji ; L1 ; none ; j w # V6.0 (🎬) CLAPPER BOARD -1F3AD ; emoji ; L1 ; none ; j w # V6.0 (🎭) PERFORMING ARTS -1F3AE ; emoji ; L1 ; none ; j w # V6.0 (🎮) VIDEO GAME -1F3AF ; emoji ; L1 ; none ; j # V6.0 (🎯) DIRECT HIT -1F3B0 ; emoji ; L1 ; none ; j # V6.0 (🎰) SLOT MACHINE -1F3B1 ; emoji ; L1 ; none ; j # V6.0 (🎱) BILLIARDS -1F3B2 ; emoji ; L1 ; none ; j # V6.0 (🎲) GAME DIE -1F3B3 ; emoji ; L1 ; none ; j # V6.0 (🎳) BOWLING -1F3B4 ; emoji ; L1 ; none ; j # V6.0 (🎴) FLOWER PLAYING CARDS -1F3B5 ; emoji ; L1 ; none ; j # V6.0 (🎵) MUSICAL NOTE -1F3B6 ; emoji ; L1 ; none ; j # V6.0 (🎶) MULTIPLE MUSICAL NOTES -1F3B7 ; emoji ; L1 ; none ; j # V6.0 (🎷) SAXOPHONE -1F3B8 ; emoji ; L1 ; none ; j # V6.0 (🎸) GUITAR -1F3B9 ; emoji ; L1 ; none ; j # V6.0 (🎹) MUSICAL KEYBOARD -1F3BA ; emoji ; L1 ; none ; j # V6.0 (🎺) TRUMPET -1F3BB ; emoji ; L1 ; none ; j # V6.0 (🎻) VIOLIN -1F3BC ; emoji ; L1 ; none ; j # V6.0 (🎼) MUSICAL SCORE -1F3BD ; emoji ; L1 ; none ; j # V6.0 (🎽) RUNNING SHIRT WITH SASH -1F3BE ; emoji ; L1 ; none ; j # V6.0 (🎾) TENNIS RACQUET AND BALL -1F3BF ; emoji ; L1 ; none ; j # V6.0 (🎿) SKI AND SKI BOOT -1F3C0 ; emoji ; L1 ; none ; j # V6.0 (🏀) BASKETBALL AND HOOP -1F3C1 ; emoji ; L1 ; none ; j # V6.0 (🏁) CHEQUERED FLAG -1F3C2 ; emoji ; L1 ; secondary ; j w # V6.0 (🏂) SNOWBOARDER -1F3C3 ; emoji ; L1 ; secondary ; j # V6.0 (🏃) RUNNER -1F3C4 ; emoji ; L1 ; secondary ; j w # V6.0 (🏄) SURFER -1F3C5 ; emoji ; L2 ; none ; x # V7.0 (🏅) SPORTS MEDAL -1F3C6 ; emoji ; L1 ; none ; j w # V6.0 (🏆) TROPHY -1F3C7 ; emoji ; L1 ; secondary ; x # V6.0 (🏇) HORSE RACING -1F3C8 ; emoji ; L1 ; none ; j # V6.0 (🏈) AMERICAN FOOTBALL -1F3C9 ; emoji ; L1 ; none ; x # V6.0 (🏉) RUGBY FOOTBALL -1F3CA ; emoji ; L1 ; secondary ; j w # V6.0 (🏊) SWIMMER -1F3CB ; text ; L2 ; none ; w # V7.0 (🏋) WEIGHT LIFTER -1F3CC ; text ; L2 ; none ; w # V7.0 (🏌) GOLFER -1F3CD ; text ; L2 ; none ; w # V7.0 (🏍) RACING MOTORCYCLE -1F3CE ; text ; L2 ; none ; w # V7.0 (🏎) RACING CAR -1F3CF ; emoji ; L2 ; none ; x # V8.0 (🏏) CRICKET BAT AND BALL -1F3D0 ; emoji ; L2 ; none ; x # V8.0 (🏐) VOLLEYBALL -1F3D1 ; emoji ; L2 ; none ; x # V8.0 (🏑) FIELD HOCKEY STICK AND BALL -1F3D2 ; emoji ; L2 ; none ; x # V8.0 (🏒) ICE HOCKEY STICK AND PUCK -1F3D3 ; emoji ; L2 ; none ; x # V8.0 (🏓) TABLE TENNIS PADDLE AND BALL -1F3D4 ; text ; L2 ; none ; w # V7.0 (🏔) SNOW CAPPED MOUNTAIN -1F3D5 ; text ; L2 ; none ; w # V7.0 (🏕) CAMPING -1F3D6 ; text ; L2 ; none ; w # V7.0 (🏖) BEACH WITH UMBRELLA -1F3D7 ; text ; L2 ; none ; w # V7.0 (🏗) BUILDING CONSTRUCTION -1F3D8 ; text ; L2 ; none ; w # V7.0 (🏘) HOUSE BUILDINGS -1F3D9 ; text ; L2 ; none ; w # V7.0 (🏙) CITYSCAPE -1F3DA ; text ; L2 ; none ; w # V7.0 (🏚) DERELICT HOUSE BUILDING -1F3DB ; text ; L2 ; none ; w # V7.0 (🏛) CLASSICAL BUILDING -1F3DC ; text ; L2 ; none ; w # V7.0 (🏜) DESERT -1F3DD ; text ; L2 ; none ; w # V7.0 (🏝) DESERT ISLAND -1F3DE ; text ; L2 ; none ; w # V7.0 (🏞) NATIONAL PARK -1F3DF ; text ; L2 ; none ; w # V7.0 (🏟) STADIUM -1F3E0 ; emoji ; L1 ; none ; j w # V6.0 (🏠) HOUSE BUILDING -1F3E1 ; emoji ; L1 ; none ; j # V6.0 (🏡) HOUSE WITH GARDEN -1F3E2 ; emoji ; L1 ; none ; j # V6.0 (🏢) OFFICE BUILDING -1F3E3 ; emoji ; L1 ; none ; j # V6.0 (🏣) JAPANESE POST OFFICE -1F3E4 ; emoji ; L1 ; none ; x # V6.0 (🏤) EUROPEAN POST OFFICE -1F3E5 ; emoji ; L1 ; none ; j # V6.0 (🏥) HOSPITAL -1F3E6 ; emoji ; L1 ; none ; j # V6.0 (🏦) BANK -1F3E7 ; emoji ; L1 ; none ; j # V6.0 (🏧) AUTOMATED TELLER MACHINE -1F3E8 ; emoji ; L1 ; none ; j # V6.0 (🏨) HOTEL -1F3E9 ; emoji ; L1 ; none ; j # V6.0 (🏩) LOVE HOTEL -1F3EA ; emoji ; L1 ; none ; j # V6.0 (🏪) CONVENIENCE STORE -1F3EB ; emoji ; L1 ; none ; j # V6.0 (🏫) SCHOOL -1F3EC ; emoji ; L1 ; none ; j # V6.0 (🏬) DEPARTMENT STORE -1F3ED ; emoji ; L1 ; none ; j w # V6.0 (🏭) FACTORY -1F3EE ; emoji ; L1 ; none ; j # V6.0 (🏮) IZAKAYA LANTERN -1F3EF ; emoji ; L1 ; none ; j # V6.0 (🏯) JAPANESE CASTLE -1F3F0 ; emoji ; L1 ; none ; j # V6.0 (🏰) EUROPEAN CASTLE -1F3F3 ; text ; L2 ; none ; w # V7.0 (🏳) WAVING WHITE FLAG -1F3F4 ; emoji ; L2 ; none ; x # V7.0 (🏴) WAVING BLACK FLAG -1F3F5 ; text ; L2 ; none ; w # V7.0 (🏵) ROSETTE -1F3F7 ; text ; L2 ; none ; w # V7.0 (🏷) LABEL -1F3F8 ; emoji ; L2 ; none ; x # V8.0 (🏸) BADMINTON RACQUET AND SHUTTLECOCK -1F3F9 ; emoji ; L2 ; none ; x # V8.0 (🏹) BOW AND ARROW -1F3FA ; emoji ; L2 ; none ; x # V8.0 (🏺) AMPHORA -1F3FB ; emoji ; L2 ; modifier ; x # V8.0 (🏻) EMOJI MODIFIER FITZPATRICK TYPE-1-2 -1F3FC ; emoji ; L2 ; modifier ; x # V8.0 (🏼) EMOJI MODIFIER FITZPATRICK TYPE-3 -1F3FD ; emoji ; L2 ; modifier ; x # V8.0 (🏽) EMOJI MODIFIER FITZPATRICK TYPE-4 -1F3FE ; emoji ; L2 ; modifier ; x # V8.0 (🏾) EMOJI MODIFIER FITZPATRICK TYPE-5 -1F3FF ; emoji ; L2 ; modifier ; x # V8.0 (🏿) EMOJI MODIFIER FITZPATRICK TYPE-6 -1F400 ; emoji ; L1 ; none ; x # V6.0 (🐀) RAT -1F401 ; emoji ; L1 ; none ; x # V6.0 (🐁) MOUSE -1F402 ; emoji ; L1 ; none ; x # V6.0 (🐂) OX -1F403 ; emoji ; L1 ; none ; x # V6.0 (🐃) WATER BUFFALO -1F404 ; emoji ; L1 ; none ; x # V6.0 (🐄) COW -1F405 ; emoji ; L1 ; none ; x # V6.0 (🐅) TIGER -1F406 ; emoji ; L1 ; none ; x # V6.0 (🐆) LEOPARD -1F407 ; emoji ; L1 ; none ; x # V6.0 (🐇) RABBIT -1F408 ; emoji ; L1 ; none ; w # V6.0 (🐈) CAT -1F409 ; emoji ; L1 ; none ; x # V6.0 (🐉) DRAGON -1F40A ; emoji ; L1 ; none ; x # V6.0 (🐊) CROCODILE -1F40B ; emoji ; L1 ; none ; x # V6.0 (🐋) WHALE -1F40C ; emoji ; L1 ; none ; j # V6.0 (🐌) SNAIL -1F40D ; emoji ; L1 ; none ; j # V6.0 (🐍) SNAKE -1F40E ; emoji ; L1 ; none ; j # V6.0 (🐎) HORSE -1F40F ; emoji ; L1 ; none ; x # V6.0 (🐏) RAM -1F410 ; emoji ; L1 ; none ; x # V6.0 (🐐) GOAT -1F411 ; emoji ; L1 ; none ; j # V6.0 (🐑) SHEEP -1F412 ; emoji ; L1 ; none ; j # V6.0 (🐒) MONKEY -1F413 ; emoji ; L1 ; none ; x # V6.0 (🐓) ROOSTER -1F414 ; emoji ; L1 ; none ; j # V6.0 (🐔) CHICKEN -1F415 ; emoji ; L1 ; none ; w # V6.0 (🐕) DOG -1F416 ; emoji ; L1 ; none ; x # V6.0 (🐖) PIG -1F417 ; emoji ; L1 ; none ; j # V6.0 (🐗) BOAR -1F418 ; emoji ; L1 ; none ; j # V6.0 (🐘) ELEPHANT -1F419 ; emoji ; L1 ; none ; j # V6.0 (🐙) OCTOPUS -1F41A ; emoji ; L1 ; none ; j # V6.0 (🐚) SPIRAL SHELL -1F41B ; emoji ; L1 ; none ; j # V6.0 (🐛) BUG -1F41C ; emoji ; L1 ; none ; j # V6.0 (🐜) ANT -1F41D ; emoji ; L1 ; none ; j # V6.0 (🐝) HONEYBEE -1F41E ; emoji ; L1 ; none ; j # V6.0 (🐞) LADY BEETLE -1F41F ; emoji ; L1 ; none ; j w # V6.0 (🐟) FISH -1F420 ; emoji ; L1 ; none ; j # V6.0 (🐠) TROPICAL FISH -1F421 ; emoji ; L1 ; none ; j # V6.0 (🐡) BLOWFISH -1F422 ; emoji ; L1 ; none ; j # V6.0 (🐢) TURTLE -1F423 ; emoji ; L1 ; none ; j # V6.0 (🐣) HATCHING CHICK -1F424 ; emoji ; L1 ; none ; j # V6.0 (🐤) BABY CHICK -1F425 ; emoji ; L1 ; none ; j # V6.0 (🐥) FRONT-FACING BABY CHICK -1F426 ; emoji ; L1 ; none ; j w # V6.0 (🐦) BIRD -1F427 ; emoji ; L1 ; none ; j # V6.0 (🐧) PENGUIN -1F428 ; emoji ; L1 ; none ; j # V6.0 (🐨) KOALA -1F429 ; emoji ; L1 ; none ; j # V6.0 (🐩) POODLE -1F42A ; emoji ; L1 ; none ; x # V6.0 (🐪) DROMEDARY CAMEL -1F42B ; emoji ; L1 ; none ; j # V6.0 (🐫) BACTRIAN CAMEL -1F42C ; emoji ; L1 ; none ; j # V6.0 (🐬) DOLPHIN -1F42D ; emoji ; L1 ; none ; j # V6.0 (🐭) MOUSE FACE -1F42E ; emoji ; L1 ; none ; j # V6.0 (🐮) COW FACE -1F42F ; emoji ; L1 ; none ; j # V6.0 (🐯) TIGER FACE -1F430 ; emoji ; L1 ; none ; j # V6.0 (🐰) RABBIT FACE -1F431 ; emoji ; L1 ; none ; j # V6.0 (🐱) CAT FACE -1F432 ; emoji ; L1 ; none ; j # V6.0 (🐲) DRAGON FACE -1F433 ; emoji ; L1 ; none ; j # V6.0 (🐳) SPOUTING WHALE -1F434 ; emoji ; L1 ; none ; j # V6.0 (🐴) HORSE FACE -1F435 ; emoji ; L1 ; none ; j # V6.0 (🐵) MONKEY FACE -1F436 ; emoji ; L1 ; none ; j # V6.0 (🐶) DOG FACE -1F437 ; emoji ; L1 ; none ; j # V6.0 (🐷) PIG FACE -1F438 ; emoji ; L1 ; none ; j # V6.0 (🐸) FROG FACE -1F439 ; emoji ; L1 ; none ; j # V6.0 (🐹) HAMSTER FACE -1F43A ; emoji ; L1 ; none ; j # V6.0 (🐺) WOLF FACE -1F43B ; emoji ; L1 ; none ; j # V6.0 (🐻) BEAR FACE -1F43C ; emoji ; L1 ; none ; j # V6.0 (🐼) PANDA FACE -1F43D ; emoji ; L1 ; none ; j # V6.0 (🐽) PIG NOSE -1F43E ; emoji ; L1 ; none ; j # V6.0 (🐾) PAW PRINTS -1F43F ; text ; L2 ; none ; w # V7.0 (🐿) CHIPMUNK -1F440 ; emoji ; L1 ; none ; j # V6.0 (👀) EYES -1F441 ; text ; L2 ; none ; w # V7.0 (👁) EYE -1F442 ; emoji ; L1 ; secondary ; j w # V6.0 (👂) EAR -1F443 ; emoji ; L1 ; secondary ; j # V6.0 (👃) NOSE -1F444 ; emoji ; L1 ; none ; j # V6.0 (👄) MOUTH -1F445 ; emoji ; L1 ; none ; j # V6.0 (👅) TONGUE -1F446 ; emoji ; L1 ; secondary ; j w # V6.0 (👆) WHITE UP POINTING BACKHAND INDEX -1F447 ; emoji ; L1 ; secondary ; j w # V6.0 (👇) WHITE DOWN POINTING BACKHAND INDEX -1F448 ; emoji ; L1 ; secondary ; j w # V6.0 (👈) WHITE LEFT POINTING BACKHAND INDEX -1F449 ; emoji ; L1 ; secondary ; j w # V6.0 (👉) WHITE RIGHT POINTING BACKHAND INDEX -1F44A ; emoji ; L1 ; secondary ; j # V6.0 (👊) FISTED HAND SIGN -1F44B ; emoji ; L1 ; secondary ; j # V6.0 (👋) WAVING HAND SIGN -1F44C ; emoji ; L1 ; secondary ; j # V6.0 (👌) OK HAND SIGN -1F44D ; emoji ; L1 ; secondary ; j w # V6.0 (👍) THUMBS UP SIGN -1F44E ; emoji ; L1 ; secondary ; j w # V6.0 (👎) THUMBS DOWN SIGN -1F44F ; emoji ; L1 ; secondary ; j # V6.0 (👏) CLAPPING HANDS SIGN -1F450 ; emoji ; L1 ; secondary ; j # V6.0 (👐) OPEN HANDS SIGN -1F451 ; emoji ; L1 ; none ; j # V6.0 (👑) CROWN -1F452 ; emoji ; L1 ; none ; j # V6.0 (👒) WOMANS HAT -1F453 ; emoji ; L1 ; none ; j w # V6.0 (👓) EYEGLASSES -1F454 ; emoji ; L1 ; none ; j # V6.0 (👔) NECKTIE -1F455 ; emoji ; L1 ; none ; j # V6.0 (👕) T-SHIRT -1F456 ; emoji ; L1 ; none ; j # V6.0 (👖) JEANS -1F457 ; emoji ; L1 ; none ; j # V6.0 (👗) DRESS -1F458 ; emoji ; L1 ; none ; j # V6.0 (👘) KIMONO -1F459 ; emoji ; L1 ; none ; j # V6.0 (👙) BIKINI -1F45A ; emoji ; L1 ; none ; j # V6.0 (👚) WOMANS CLOTHES -1F45B ; emoji ; L1 ; none ; j # V6.0 (👛) PURSE -1F45C ; emoji ; L1 ; none ; j # V6.0 (👜) HANDBAG -1F45D ; emoji ; L1 ; none ; j # V6.0 (👝) POUCH -1F45E ; emoji ; L1 ; none ; j # V6.0 (👞) MANS SHOE -1F45F ; emoji ; L1 ; none ; j # V6.0 (👟) ATHLETIC SHOE -1F460 ; emoji ; L1 ; none ; j # V6.0 (👠) HIGH-HEELED SHOE -1F461 ; emoji ; L1 ; none ; j # V6.0 (👡) WOMANS SANDAL -1F462 ; emoji ; L1 ; none ; j # V6.0 (👢) WOMANS BOOTS -1F463 ; emoji ; L1 ; none ; j # V6.0 (👣) FOOTPRINTS -1F464 ; emoji ; L1 ; none ; j # V6.0 (👤) BUST IN SILHOUETTE -1F465 ; emoji ; L1 ; none ; x # V6.0 (👥) BUSTS IN SILHOUETTE -1F466 ; emoji ; L1 ; primary ; j # V6.0 (👦) BOY -1F467 ; emoji ; L1 ; primary ; j # V6.0 (👧) GIRL -1F468 ; emoji ; L1 ; primary ; j # V6.0 (👨) MAN -1F469 ; emoji ; L1 ; primary ; j # V6.0 (👩) WOMAN -1F46A ; emoji ; L1 ; none ; j w # V6.0 (👪) FAMILY -1F46B ; emoji ; L1 ; none ; j # V6.0 (👫) MAN AND WOMAN HOLDING HANDS -1F46C ; emoji ; L1 ; none ; x # V6.0 (👬) TWO MEN HOLDING HANDS -1F46D ; emoji ; L1 ; none ; x # V6.0 (👭) TWO WOMEN HOLDING HANDS -1F46E ; emoji ; L1 ; primary ; j # V6.0 (👮) POLICE OFFICER -1F46F ; emoji ; L1 ; none ; j # V6.0 (👯) WOMAN WITH BUNNY EARS -1F470 ; emoji ; L1 ; primary ; j # V6.0 (👰) BRIDE WITH VEIL -1F471 ; emoji ; L1 ; primary ; j # V6.0 (👱) PERSON WITH BLOND HAIR -1F472 ; emoji ; L1 ; primary ; j # V6.0 (👲) MAN WITH GUA PI MAO -1F473 ; emoji ; L1 ; primary ; j # V6.0 (👳) MAN WITH TURBAN -1F474 ; emoji ; L1 ; primary ; j # V6.0 (👴) OLDER MAN -1F475 ; emoji ; L1 ; primary ; j # V6.0 (👵) OLDER WOMAN -1F476 ; emoji ; L1 ; primary ; j # V6.0 (👶) BABY -1F477 ; emoji ; L1 ; primary ; j # V6.0 (👷) CONSTRUCTION WORKER -1F478 ; emoji ; L1 ; primary ; j # V6.0 (👸) PRINCESS -1F479 ; emoji ; L1 ; none ; j # V6.0 (👹) JAPANESE OGRE -1F47A ; emoji ; L1 ; none ; j # V6.0 (👺) JAPANESE GOBLIN -1F47B ; emoji ; L1 ; none ; j # V6.0 (👻) GHOST -1F47C ; emoji ; L1 ; primary ; j # V6.0 (👼) BABY ANGEL -1F47D ; emoji ; L1 ; none ; j w # V6.0 (👽) EXTRATERRESTRIAL ALIEN -1F47E ; emoji ; L1 ; none ; j # V6.0 (👾) ALIEN MONSTER -1F47F ; emoji ; L1 ; secondary ; j # V6.0 (👿) IMP -1F480 ; emoji ; L1 ; none ; j # V6.0 (💀) SKULL -1F481 ; emoji ; L1 ; primary ; j # V6.0 (💁) INFORMATION DESK PERSON -1F482 ; emoji ; L1 ; primary ; j # V6.0 (💂) GUARDSMAN -1F483 ; emoji ; L1 ; secondary ; j # V6.0 (💃) DANCER -1F484 ; emoji ; L1 ; none ; j # V6.0 (💄) LIPSTICK -1F485 ; emoji ; L1 ; secondary ; j # V6.0 (💅) NAIL POLISH -1F486 ; emoji ; L1 ; primary ; j # V6.0 (💆) FACE MASSAGE -1F487 ; emoji ; L1 ; primary ; j # V6.0 (💇) HAIRCUT -1F488 ; emoji ; L1 ; none ; j # V6.0 (💈) BARBER POLE -1F489 ; emoji ; L1 ; none ; j # V6.0 (💉) SYRINGE -1F48A ; emoji ; L1 ; none ; j # V6.0 (💊) PILL -1F48B ; emoji ; L1 ; none ; j # V6.0 (💋) KISS MARK -1F48C ; emoji ; L1 ; none ; j # V6.0 (💌) LOVE LETTER -1F48D ; emoji ; L1 ; none ; j # V6.0 (💍) RING -1F48E ; emoji ; L1 ; none ; j # V6.0 (💎) GEM STONE -1F48F ; emoji ; L1 ; none ; j # V6.0 (💏) KISS -1F490 ; emoji ; L1 ; none ; j # V6.0 (💐) BOUQUET -1F491 ; emoji ; L1 ; none ; j # V6.0 (💑) COUPLE WITH HEART -1F492 ; emoji ; L1 ; none ; j # V6.0 (💒) WEDDING -1F493 ; emoji ; L1 ; none ; j # V6.0 (💓) BEATING HEART -1F494 ; emoji ; L1 ; none ; j # V6.0 (💔) BROKEN HEART -1F495 ; emoji ; L1 ; none ; j # V6.0 (💕) TWO HEARTS -1F496 ; emoji ; L1 ; none ; j # V6.0 (💖) SPARKLING HEART -1F497 ; emoji ; L1 ; none ; j # V6.0 (💗) GROWING HEART -1F498 ; emoji ; L1 ; none ; j # V6.0 (💘) HEART WITH ARROW -1F499 ; emoji ; L1 ; none ; j # V6.0 (💙) BLUE HEART -1F49A ; emoji ; L1 ; none ; j # V6.0 (💚) GREEN HEART -1F49B ; emoji ; L1 ; none ; j # V6.0 (💛) YELLOW HEART -1F49C ; emoji ; L1 ; none ; j # V6.0 (💜) PURPLE HEART -1F49D ; emoji ; L1 ; none ; j # V6.0 (💝) HEART WITH RIBBON -1F49E ; emoji ; L1 ; none ; j # V6.0 (💞) REVOLVING HEARTS -1F49F ; emoji ; L1 ; none ; j # V6.0 (💟) HEART DECORATION -1F4A0 ; emoji ; L1 ; none ; j # V6.0 (💠) DIAMOND SHAPE WITH A DOT INSIDE -1F4A1 ; emoji ; L1 ; none ; j # V6.0 (💡) ELECTRIC LIGHT BULB -1F4A2 ; emoji ; L1 ; none ; j # V6.0 (💢) ANGER SYMBOL -1F4A3 ; emoji ; L1 ; none ; j w # V6.0 (💣) BOMB -1F4A4 ; emoji ; L1 ; none ; j # V6.0 (💤) SLEEPING SYMBOL -1F4A5 ; emoji ; L1 ; none ; j # V6.0 (💥) COLLISION SYMBOL -1F4A6 ; emoji ; L1 ; none ; j # V6.0 (💦) SPLASHING SWEAT SYMBOL -1F4A7 ; emoji ; L1 ; none ; j # V6.0 (💧) DROPLET -1F4A8 ; emoji ; L1 ; none ; j # V6.0 (💨) DASH SYMBOL -1F4A9 ; emoji ; L1 ; none ; j # V6.0 (💩) PILE OF POO -1F4AA ; emoji ; L1 ; secondary ; j # V6.0 (💪) FLEXED BICEPS -1F4AB ; emoji ; L1 ; none ; j # V6.0 (💫) DIZZY SYMBOL -1F4AC ; emoji ; L1 ; none ; j # V6.0 (💬) SPEECH BALLOON -1F4AD ; emoji ; L1 ; none ; x # V6.0 (💭) THOUGHT BALLOON -1F4AE ; emoji ; L1 ; none ; j # V6.0 (💮) WHITE FLOWER -1F4AF ; emoji ; L1 ; none ; j # V6.0 (💯) HUNDRED POINTS SYMBOL -1F4B0 ; emoji ; L1 ; none ; j w # V6.0 (💰) MONEY BAG -1F4B1 ; emoji ; L1 ; none ; j # V6.0 (💱) CURRENCY EXCHANGE -1F4B2 ; emoji ; L1 ; none ; j # V6.0 (💲) HEAVY DOLLAR SIGN -1F4B3 ; emoji ; L1 ; none ; j w # V6.0 (💳) CREDIT CARD -1F4B4 ; emoji ; L1 ; none ; j # V6.0 (💴) BANKNOTE WITH YEN SIGN -1F4B5 ; emoji ; L1 ; none ; j # V6.0 (💵) BANKNOTE WITH DOLLAR SIGN -1F4B6 ; emoji ; L1 ; none ; x # V6.0 (💶) BANKNOTE WITH EURO SIGN -1F4B7 ; emoji ; L1 ; none ; x # V6.0 (💷) BANKNOTE WITH POUND SIGN -1F4B8 ; emoji ; L1 ; none ; j # V6.0 (💸) MONEY WITH WINGS -1F4B9 ; emoji ; L1 ; none ; j # V6.0 (💹) CHART WITH UPWARDS TREND AND YEN SIGN -1F4BA ; emoji ; L1 ; none ; j # V6.0 (💺) SEAT -1F4BB ; emoji ; L1 ; none ; j w # V6.0 (💻) PERSONAL COMPUTER -1F4BC ; emoji ; L1 ; none ; j # V6.0 (💼) BRIEFCASE -1F4BD ; emoji ; L1 ; none ; j # V6.0 (💽) MINIDISC -1F4BE ; emoji ; L1 ; none ; j # V6.0 (💾) FLOPPY DISK -1F4BF ; emoji ; L1 ; none ; j w # V6.0 (💿) OPTICAL DISC -1F4C0 ; emoji ; L1 ; none ; j # V6.0 (📀) DVD -1F4C1 ; emoji ; L1 ; none ; j # V6.0 (📁) FILE FOLDER -1F4C2 ; emoji ; L1 ; none ; j # V6.0 (📂) OPEN FILE FOLDER -1F4C3 ; emoji ; L1 ; none ; j # V6.0 (📃) PAGE WITH CURL -1F4C4 ; emoji ; L1 ; none ; j # V6.0 (📄) PAGE FACING UP -1F4C5 ; emoji ; L1 ; none ; j # V6.0 (📅) CALENDAR -1F4C6 ; emoji ; L1 ; none ; j # V6.0 (📆) TEAR-OFF CALENDAR -1F4C7 ; emoji ; L1 ; none ; j # V6.0 (📇) CARD INDEX -1F4C8 ; emoji ; L1 ; none ; j # V6.0 (📈) CHART WITH UPWARDS TREND -1F4C9 ; emoji ; L1 ; none ; j # V6.0 (📉) CHART WITH DOWNWARDS TREND -1F4CA ; emoji ; L1 ; none ; j # V6.0 (📊) BAR CHART -1F4CB ; emoji ; L1 ; none ; j w # V6.0 (📋) CLIPBOARD -1F4CC ; emoji ; L1 ; none ; j # V6.0 (📌) PUSHPIN -1F4CD ; emoji ; L1 ; none ; j # V6.0 (📍) ROUND PUSHPIN -1F4CE ; emoji ; L1 ; none ; j # V6.0 (📎) PAPERCLIP -1F4CF ; emoji ; L1 ; none ; j # V6.0 (📏) STRAIGHT RULER -1F4D0 ; emoji ; L1 ; none ; j # V6.0 (📐) TRIANGULAR RULER -1F4D1 ; emoji ; L1 ; none ; j # V6.0 (📑) BOOKMARK TABS -1F4D2 ; emoji ; L1 ; none ; j # V6.0 (📒) LEDGER -1F4D3 ; emoji ; L1 ; none ; j # V6.0 (📓) NOTEBOOK -1F4D4 ; emoji ; L1 ; none ; j # V6.0 (📔) NOTEBOOK WITH DECORATIVE COVER -1F4D5 ; emoji ; L1 ; none ; j # V6.0 (📕) CLOSED BOOK -1F4D6 ; emoji ; L1 ; none ; j # V6.0 (📖) OPEN BOOK -1F4D7 ; emoji ; L1 ; none ; j # V6.0 (📗) GREEN BOOK -1F4D8 ; emoji ; L1 ; none ; j # V6.0 (📘) BLUE BOOK -1F4D9 ; emoji ; L1 ; none ; j # V6.0 (📙) ORANGE BOOK -1F4DA ; emoji ; L1 ; none ; j w # V6.0 (📚) BOOKS -1F4DB ; emoji ; L1 ; none ; j # V6.0 (📛) NAME BADGE -1F4DC ; emoji ; L1 ; none ; j # V6.0 (📜) SCROLL -1F4DD ; emoji ; L1 ; none ; j # V6.0 (📝) MEMO -1F4DE ; emoji ; L1 ; none ; j # V6.0 (📞) TELEPHONE RECEIVER -1F4DF ; emoji ; L1 ; none ; j w # V6.0 (📟) PAGER -1F4E0 ; emoji ; L1 ; none ; j # V6.0 (📠) FAX MACHINE -1F4E1 ; emoji ; L1 ; none ; j # V6.0 (📡) SATELLITE ANTENNA -1F4E2 ; emoji ; L1 ; none ; j # V6.0 (📢) PUBLIC ADDRESS LOUDSPEAKER -1F4E3 ; emoji ; L1 ; none ; j # V6.0 (📣) CHEERING MEGAPHONE -1F4E4 ; emoji ; L1 ; none ; j w # V6.0 (📤) OUTBOX TRAY -1F4E5 ; emoji ; L1 ; none ; j w # V6.0 (📥) INBOX TRAY -1F4E6 ; emoji ; L1 ; none ; j w # V6.0 (📦) PACKAGE -1F4E7 ; emoji ; L1 ; none ; j # V6.0 (📧) E-MAIL SYMBOL -1F4E8 ; emoji ; L1 ; none ; j # V6.0 (📨) INCOMING ENVELOPE -1F4E9 ; emoji ; L1 ; none ; j # V6.0 (📩) ENVELOPE WITH DOWNWARDS ARROW ABOVE -1F4EA ; emoji ; L1 ; none ; j w # V6.0 (📪) CLOSED MAILBOX WITH LOWERED FLAG -1F4EB ; emoji ; L1 ; none ; j w # V6.0 (📫) CLOSED MAILBOX WITH RAISED FLAG -1F4EC ; emoji ; L1 ; none ; w # V6.0 (📬) OPEN MAILBOX WITH RAISED FLAG -1F4ED ; emoji ; L1 ; none ; w # V6.0 (📭) OPEN MAILBOX WITH LOWERED FLAG -1F4EE ; emoji ; L1 ; none ; j # V6.0 (📮) POSTBOX -1F4EF ; emoji ; L1 ; none ; x # V6.0 (📯) POSTAL HORN -1F4F0 ; emoji ; L1 ; none ; j # V6.0 (📰) NEWSPAPER -1F4F1 ; emoji ; L1 ; none ; j # V6.0 (📱) MOBILE PHONE -1F4F2 ; emoji ; L1 ; none ; j # V6.0 (📲) MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT -1F4F3 ; emoji ; L1 ; none ; j # V6.0 (📳) VIBRATION MODE -1F4F4 ; emoji ; L1 ; none ; j # V6.0 (📴) MOBILE PHONE OFF -1F4F5 ; emoji ; L1 ; none ; x # V6.0 (📵) NO MOBILE PHONES -1F4F6 ; emoji ; L1 ; none ; j # V6.0 (📶) ANTENNA WITH BARS -1F4F7 ; emoji ; L1 ; none ; j w # V6.0 (📷) CAMERA -1F4F8 ; emoji ; L2 ; none ; x # V7.0 (📸) CAMERA WITH FLASH -1F4F9 ; emoji ; L1 ; none ; j w # V6.0 (📹) VIDEO CAMERA -1F4FA ; emoji ; L1 ; none ; j w # V6.0 (📺) TELEVISION -1F4FB ; emoji ; L1 ; none ; j w # V6.0 (📻) RADIO -1F4FC ; emoji ; L1 ; none ; j # V6.0 (📼) VIDEOCASSETTE -1F4FD ; text ; L2 ; none ; w # V7.0 (📽) FILM PROJECTOR -1F4FF ; emoji ; L2 ; none ; x # V8.0 (📿) PRAYER BEADS -1F500 ; emoji ; L1 ; none ; x # V6.0 (🔀) TWISTED RIGHTWARDS ARROWS -1F501 ; emoji ; L1 ; none ; x # V6.0 (🔁) CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS -1F502 ; emoji ; L1 ; none ; x # V6.0 (🔂) CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY -1F503 ; emoji ; L1 ; none ; j # V6.0 (🔃) CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS -1F504 ; emoji ; L1 ; none ; x # V6.0 (🔄) ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS -1F505 ; emoji ; L1 ; none ; x # V6.0 (🔅) LOW BRIGHTNESS SYMBOL -1F506 ; emoji ; L1 ; none ; x # V6.0 (🔆) HIGH BRIGHTNESS SYMBOL -1F507 ; emoji ; L1 ; none ; x # V6.0 (🔇) SPEAKER WITH CANCELLATION STROKE -1F508 ; emoji ; L1 ; none ; w # V6.0 (🔈) SPEAKER -1F509 ; emoji ; L1 ; none ; x # V6.0 (🔉) SPEAKER WITH ONE SOUND WAVE -1F50A ; emoji ; L1 ; none ; j # V6.0 (🔊) SPEAKER WITH THREE SOUND WAVES -1F50B ; emoji ; L1 ; none ; j # V6.0 (🔋) BATTERY -1F50C ; emoji ; L1 ; none ; j # V6.0 (🔌) ELECTRIC PLUG -1F50D ; emoji ; L1 ; none ; j w # V6.0 (🔍) LEFT-POINTING MAGNIFYING GLASS -1F50E ; emoji ; L1 ; none ; j # V6.0 (🔎) RIGHT-POINTING MAGNIFYING GLASS -1F50F ; emoji ; L1 ; none ; j # V6.0 (🔏) LOCK WITH INK PEN -1F510 ; emoji ; L1 ; none ; j # V6.0 (🔐) CLOSED LOCK WITH KEY -1F511 ; emoji ; L1 ; none ; j # V6.0 (🔑) KEY -1F512 ; emoji ; L1 ; none ; j w # V6.0 (🔒) LOCK -1F513 ; emoji ; L1 ; none ; j w # V6.0 (🔓) OPEN LOCK -1F514 ; emoji ; L1 ; none ; j # V6.0 (🔔) BELL -1F515 ; emoji ; L1 ; none ; x # V6.0 (🔕) BELL WITH CANCELLATION STROKE -1F516 ; emoji ; L1 ; none ; j # V6.0 (🔖) BOOKMARK -1F517 ; emoji ; L1 ; none ; j # V6.0 (🔗) LINK SYMBOL -1F518 ; emoji ; L1 ; none ; j # V6.0 (🔘) RADIO BUTTON -1F519 ; emoji ; L1 ; none ; j # V6.0 (🔙) BACK WITH LEFTWARDS ARROW ABOVE -1F51A ; emoji ; L1 ; none ; j # V6.0 (🔚) END WITH LEFTWARDS ARROW ABOVE -1F51B ; emoji ; L1 ; none ; j # V6.0 (🔛) ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE -1F51C ; emoji ; L1 ; none ; j # V6.0 (🔜) SOON WITH RIGHTWARDS ARROW ABOVE -1F51D ; emoji ; L1 ; none ; j # V6.0 (🔝) TOP WITH UPWARDS ARROW ABOVE -1F51E ; emoji ; L1 ; none ; j # V6.0 (🔞) NO ONE UNDER EIGHTEEN SYMBOL -1F51F ; emoji ; L1 ; none ; j # V6.0 (🔟) KEYCAP TEN -1F520 ; emoji ; L1 ; none ; j # V6.0 (🔠) INPUT SYMBOL FOR LATIN CAPITAL LETTERS -1F521 ; emoji ; L1 ; none ; j # V6.0 (🔡) INPUT SYMBOL FOR LATIN SMALL LETTERS -1F522 ; emoji ; L1 ; none ; j # V6.0 (🔢) INPUT SYMBOL FOR NUMBERS -1F523 ; emoji ; L1 ; none ; j # V6.0 (🔣) INPUT SYMBOL FOR SYMBOLS -1F524 ; emoji ; L1 ; none ; j # V6.0 (🔤) INPUT SYMBOL FOR LATIN LETTERS -1F525 ; emoji ; L1 ; none ; j # V6.0 (🔥) FIRE -1F526 ; emoji ; L1 ; none ; j # V6.0 (🔦) ELECTRIC TORCH -1F527 ; emoji ; L1 ; none ; j # V6.0 (🔧) WRENCH -1F528 ; emoji ; L1 ; none ; j # V6.0 (🔨) HAMMER -1F529 ; emoji ; L1 ; none ; j # V6.0 (🔩) NUT AND BOLT -1F52A ; emoji ; L1 ; none ; j # V6.0 (🔪) HOCHO -1F52B ; emoji ; L1 ; none ; j # V6.0 (🔫) PISTOL -1F52C ; emoji ; L1 ; none ; x # V6.0 (🔬) MICROSCOPE -1F52D ; emoji ; L1 ; none ; x # V6.0 (🔭) TELESCOPE -1F52E ; emoji ; L1 ; none ; j # V6.0 (🔮) CRYSTAL BALL -1F52F ; emoji ; L1 ; none ; j # V6.0 (🔯) SIX POINTED STAR WITH MIDDLE DOT -1F530 ; emoji ; L1 ; none ; j # V6.0 (🔰) JAPANESE SYMBOL FOR BEGINNER -1F531 ; emoji ; L1 ; none ; j # V6.0 (🔱) TRIDENT EMBLEM -1F532 ; emoji ; L1 ; none ; j # V6.0 (🔲) BLACK SQUARE BUTTON -1F533 ; emoji ; L1 ; none ; j # V6.0 (🔳) WHITE SQUARE BUTTON -1F534 ; emoji ; L1 ; none ; j # V6.0 (🔴) LARGE RED CIRCLE -1F535 ; emoji ; L1 ; none ; j # V6.0 (🔵) LARGE BLUE CIRCLE -1F536 ; emoji ; L1 ; none ; j # V6.0 (🔶) LARGE ORANGE DIAMOND -1F537 ; emoji ; L1 ; none ; j # V6.0 (🔷) LARGE BLUE DIAMOND -1F538 ; emoji ; L1 ; none ; j # V6.0 (🔸) SMALL ORANGE DIAMOND -1F539 ; emoji ; L1 ; none ; j # V6.0 (🔹) SMALL BLUE DIAMOND -1F53A ; emoji ; L1 ; none ; j # V6.0 (🔺) UP-POINTING RED TRIANGLE -1F53B ; emoji ; L1 ; none ; j # V6.0 (🔻) DOWN-POINTING RED TRIANGLE -1F53C ; emoji ; L1 ; none ; j # V6.0 (🔼) UP-POINTING SMALL RED TRIANGLE -1F53D ; emoji ; L1 ; none ; j # V6.0 (🔽) DOWN-POINTING SMALL RED TRIANGLE -1F549 ; text ; L2 ; none ; w # V7.0 (🕉) OM SYMBOL -1F54A ; text ; L2 ; none ; w # V7.0 (🕊) DOVE OF PEACE -1F54B ; emoji ; L2 ; none ; x # V8.0 (🕋) KAABA -1F54C ; emoji ; L2 ; none ; x # V8.0 (🕌) MOSQUE -1F54D ; emoji ; L2 ; none ; x # V8.0 (🕍) SYNAGOGUE -1F54E ; emoji ; L2 ; none ; x # V8.0 (🕎) MENORAH WITH NINE BRANCHES -1F550 ; emoji ; L1 ; none ; j w # V6.0 (🕐) CLOCK FACE ONE OCLOCK -1F551 ; emoji ; L1 ; none ; j w # V6.0 (🕑) CLOCK FACE TWO OCLOCK -1F552 ; emoji ; L1 ; none ; j w # V6.0 (🕒) CLOCK FACE THREE OCLOCK -1F553 ; emoji ; L1 ; none ; j w # V6.0 (🕓) CLOCK FACE FOUR OCLOCK -1F554 ; emoji ; L1 ; none ; j w # V6.0 (🕔) CLOCK FACE FIVE OCLOCK -1F555 ; emoji ; L1 ; none ; j w # V6.0 (🕕) CLOCK FACE SIX OCLOCK -1F556 ; emoji ; L1 ; none ; j w # V6.0 (🕖) CLOCK FACE SEVEN OCLOCK -1F557 ; emoji ; L1 ; none ; j w # V6.0 (🕗) CLOCK FACE EIGHT OCLOCK -1F558 ; emoji ; L1 ; none ; j w # V6.0 (🕘) CLOCK FACE NINE OCLOCK -1F559 ; emoji ; L1 ; none ; j w # V6.0 (🕙) CLOCK FACE TEN OCLOCK -1F55A ; emoji ; L1 ; none ; j w # V6.0 (🕚) CLOCK FACE ELEVEN OCLOCK -1F55B ; emoji ; L1 ; none ; j w # V6.0 (🕛) CLOCK FACE TWELVE OCLOCK -1F55C ; emoji ; L1 ; none ; w # V6.0 (🕜) CLOCK FACE ONE-THIRTY -1F55D ; emoji ; L1 ; none ; w # V6.0 (🕝) CLOCK FACE TWO-THIRTY -1F55E ; emoji ; L1 ; none ; w # V6.0 (🕞) CLOCK FACE THREE-THIRTY -1F55F ; emoji ; L1 ; none ; w # V6.0 (🕟) CLOCK FACE FOUR-THIRTY -1F560 ; emoji ; L1 ; none ; w # V6.0 (🕠) CLOCK FACE FIVE-THIRTY -1F561 ; emoji ; L1 ; none ; w # V6.0 (🕡) CLOCK FACE SIX-THIRTY -1F562 ; emoji ; L1 ; none ; w # V6.0 (🕢) CLOCK FACE SEVEN-THIRTY -1F563 ; emoji ; L1 ; none ; w # V6.0 (🕣) CLOCK FACE EIGHT-THIRTY -1F564 ; emoji ; L1 ; none ; w # V6.0 (🕤) CLOCK FACE NINE-THIRTY -1F565 ; emoji ; L1 ; none ; w # V6.0 (🕥) CLOCK FACE TEN-THIRTY -1F566 ; emoji ; L1 ; none ; w # V6.0 (🕦) CLOCK FACE ELEVEN-THIRTY -1F567 ; emoji ; L1 ; none ; w # V6.0 (🕧) CLOCK FACE TWELVE-THIRTY -1F56F ; text ; L2 ; none ; w # V7.0 (🕯) CANDLE -1F570 ; text ; L2 ; none ; w # V7.0 (🕰) MANTELPIECE CLOCK -1F573 ; text ; L2 ; none ; w # V7.0 (🕳) HOLE -1F574 ; text ; L2 ; none ; w # V7.0 (🕴) MAN IN BUSINESS SUIT LEVITATING -1F575 ; text ; L2 ; none ; w # V7.0 (🕵) SLEUTH OR SPY -1F576 ; text ; L2 ; none ; w # V7.0 (🕶) DARK SUNGLASSES -1F577 ; text ; L2 ; none ; w # V7.0 (🕷) SPIDER -1F578 ; text ; L2 ; none ; w # V7.0 (🕸) SPIDER WEB -1F579 ; text ; L2 ; none ; w # V7.0 (🕹) JOYSTICK -1F587 ; text ; L2 ; none ; w # V7.0 (🖇) LINKED PAPERCLIPS -1F58A ; text ; L2 ; none ; w # V7.0 (🖊) LOWER LEFT BALLPOINT PEN -1F58B ; text ; L2 ; none ; w # V7.0 (🖋) LOWER LEFT FOUNTAIN PEN -1F58C ; text ; L2 ; none ; w # V7.0 (🖌) LOWER LEFT PAINTBRUSH -1F58D ; text ; L2 ; none ; w # V7.0 (🖍) LOWER LEFT CRAYON -1F590 ; text ; L2 ; secondary ; w # V7.0 (🖐) RAISED HAND WITH FINGERS SPLAYED -1F595 ; emoji ; L2 ; secondary ; x # V7.0 (🖕) REVERSED HAND WITH MIDDLE FINGER EXTENDED -1F596 ; emoji ; L2 ; secondary ; x # V7.0 (🖖) RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS -1F5A5 ; text ; L2 ; none ; w # V7.0 (🖥) DESKTOP COMPUTER -1F5A8 ; text ; L2 ; none ; w # V7.0 (🖨) PRINTER -1F5B1 ; text ; L2 ; none ; w # V7.0 (🖱) THREE BUTTON MOUSE -1F5B2 ; text ; L2 ; none ; w # V7.0 (🖲) TRACKBALL -1F5BC ; text ; L2 ; none ; w # V7.0 (🖼) FRAME WITH PICTURE -1F5C2 ; text ; L2 ; none ; w # V7.0 (🗂) CARD INDEX DIVIDERS -1F5C3 ; text ; L2 ; none ; w # V7.0 (🗃) CARD FILE BOX -1F5C4 ; text ; L2 ; none ; w # V7.0 (🗄) FILE CABINET -1F5D1 ; text ; L2 ; none ; w # V7.0 (🗑) WASTEBASKET -1F5D2 ; text ; L2 ; none ; w # V7.0 (🗒) SPIRAL NOTE PAD -1F5D3 ; text ; L2 ; none ; w # V7.0 (🗓) SPIRAL CALENDAR PAD -1F5DC ; text ; L2 ; none ; w # V7.0 (🗜) COMPRESSION -1F5DD ; text ; L2 ; none ; w # V7.0 (🗝) OLD KEY -1F5DE ; text ; L2 ; none ; w # V7.0 (🗞) ROLLED-UP NEWSPAPER -1F5E1 ; text ; L2 ; none ; w # V7.0 (🗡) DAGGER KNIFE -1F5E3 ; text ; L2 ; none ; w # V7.0 (🗣) SPEAKING HEAD IN SILHOUETTE -1F5EF ; text ; L2 ; none ; w # V7.0 (🗯) RIGHT ANGER BUBBLE -1F5F3 ; text ; L2 ; none ; w # V7.0 (🗳) BALLOT BOX WITH BALLOT -1F5FA ; text ; L2 ; none ; w # V7.0 (🗺) WORLD MAP -1F5FB ; emoji ; L1 ; none ; j # V6.0 (🗻) MOUNT FUJI -1F5FC ; emoji ; L1 ; none ; j # V6.0 (🗼) TOKYO TOWER -1F5FD ; emoji ; L1 ; none ; j # V6.0 (🗽) STATUE OF LIBERTY -1F5FE ; emoji ; L1 ; none ; j # V6.0 (🗾) SILHOUETTE OF JAPAN -1F5FF ; emoji ; L1 ; none ; j # V6.0 (🗿) MOYAI -1F600 ; emoji ; L1 ; secondary ; x # V6.1 (😀) GRINNING FACE -1F601 ; emoji ; L1 ; secondary ; j # V6.0 (😁) GRINNING FACE WITH SMILING EYES -1F602 ; emoji ; L1 ; secondary ; j # V6.0 (😂) FACE WITH TEARS OF JOY -1F603 ; emoji ; L1 ; secondary ; j # V6.0 (😃) SMILING FACE WITH OPEN MOUTH -1F604 ; emoji ; L1 ; secondary ; j # V6.0 (😄) SMILING FACE WITH OPEN MOUTH AND SMILING EYES -1F605 ; emoji ; L1 ; secondary ; j # V6.0 (😅) SMILING FACE WITH OPEN MOUTH AND COLD SWEAT -1F606 ; emoji ; L1 ; secondary ; j # V6.0 (😆) SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES -1F607 ; emoji ; L1 ; secondary ; x # V6.0 (😇) SMILING FACE WITH HALO -1F608 ; emoji ; L1 ; secondary ; x # V6.0 (😈) SMILING FACE WITH HORNS -1F609 ; emoji ; L1 ; secondary ; j # V6.0 (😉) WINKING FACE -1F60A ; emoji ; L1 ; secondary ; j # V6.0 (😊) SMILING FACE WITH SMILING EYES -1F60B ; emoji ; L1 ; secondary ; j # V6.0 (😋) FACE SAVOURING DELICIOUS FOOD -1F60C ; emoji ; L1 ; secondary ; j # V6.0 (😌) RELIEVED FACE -1F60D ; emoji ; L1 ; secondary ; j # V6.0 (😍) SMILING FACE WITH HEART-SHAPED EYES -1F60E ; emoji ; L1 ; secondary ; x # V6.0 (😎) SMILING FACE WITH SUNGLASSES -1F60F ; emoji ; L1 ; secondary ; j # V6.0 (😏) SMIRKING FACE -1F610 ; emoji ; L1 ; secondary ; w # V6.0 (😐) NEUTRAL FACE -1F611 ; emoji ; L1 ; secondary ; x # V6.1 (😑) EXPRESSIONLESS FACE -1F612 ; emoji ; L1 ; secondary ; j # V6.0 (😒) UNAMUSED FACE -1F613 ; emoji ; L1 ; secondary ; j # V6.0 (😓) FACE WITH COLD SWEAT -1F614 ; emoji ; L1 ; secondary ; j # V6.0 (😔) PENSIVE FACE -1F615 ; emoji ; L1 ; secondary ; x # V6.1 (😕) CONFUSED FACE -1F616 ; emoji ; L1 ; secondary ; j # V6.0 (😖) CONFOUNDED FACE -1F617 ; emoji ; L1 ; secondary ; x # V6.1 (😗) KISSING FACE -1F618 ; emoji ; L1 ; secondary ; j # V6.0 (😘) FACE THROWING A KISS -1F619 ; emoji ; L1 ; secondary ; x # V6.1 (😙) KISSING FACE WITH SMILING EYES -1F61A ; emoji ; L1 ; secondary ; j # V6.0 (😚) KISSING FACE WITH CLOSED EYES -1F61B ; emoji ; L1 ; secondary ; x # V6.1 (😛) FACE WITH STUCK-OUT TONGUE -1F61C ; emoji ; L1 ; secondary ; j # V6.0 (😜) FACE WITH STUCK-OUT TONGUE AND WINKING EYE -1F61D ; emoji ; L1 ; secondary ; j # V6.0 (😝) FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES -1F61E ; emoji ; L1 ; secondary ; j # V6.0 (😞) DISAPPOINTED FACE -1F61F ; emoji ; L1 ; secondary ; x # V6.1 (😟) WORRIED FACE -1F620 ; emoji ; L1 ; secondary ; j # V6.0 (😠) ANGRY FACE -1F621 ; emoji ; L1 ; secondary ; j # V6.0 (😡) POUTING FACE -1F622 ; emoji ; L1 ; secondary ; j # V6.0 (😢) CRYING FACE -1F623 ; emoji ; L1 ; secondary ; j # V6.0 (😣) PERSEVERING FACE -1F624 ; emoji ; L1 ; secondary ; j # V6.0 (😤) FACE WITH LOOK OF TRIUMPH -1F625 ; emoji ; L1 ; secondary ; j # V6.0 (😥) DISAPPOINTED BUT RELIEVED FACE -1F626 ; emoji ; L1 ; secondary ; x # V6.1 (😦) FROWNING FACE WITH OPEN MOUTH -1F627 ; emoji ; L1 ; secondary ; x # V6.1 (😧) ANGUISHED FACE -1F628 ; emoji ; L1 ; secondary ; j # V6.0 (😨) FEARFUL FACE -1F629 ; emoji ; L1 ; secondary ; j # V6.0 (😩) WEARY FACE -1F62A ; emoji ; L1 ; secondary ; j # V6.0 (😪) SLEEPY FACE -1F62B ; emoji ; L1 ; secondary ; j # V6.0 (😫) TIRED FACE -1F62C ; emoji ; L1 ; secondary ; x # V6.1 (😬) GRIMACING FACE -1F62D ; emoji ; L1 ; secondary ; j # V6.0 (😭) LOUDLY CRYING FACE -1F62E ; emoji ; L1 ; secondary ; x # V6.1 (😮) FACE WITH OPEN MOUTH -1F62F ; emoji ; L1 ; secondary ; x # V6.1 (😯) HUSHED FACE -1F630 ; emoji ; L1 ; secondary ; j # V6.0 (😰) FACE WITH OPEN MOUTH AND COLD SWEAT -1F631 ; emoji ; L1 ; secondary ; j # V6.0 (😱) FACE SCREAMING IN FEAR -1F632 ; emoji ; L1 ; secondary ; j # V6.0 (😲) ASTONISHED FACE -1F633 ; emoji ; L1 ; secondary ; j # V6.0 (😳) FLUSHED FACE -1F634 ; emoji ; L1 ; secondary ; x # V6.1 (😴) SLEEPING FACE -1F635 ; emoji ; L1 ; secondary ; j # V6.0 (😵) DIZZY FACE -1F636 ; emoji ; L1 ; secondary ; x # V6.0 (😶) FACE WITHOUT MOUTH -1F637 ; emoji ; L1 ; secondary ; j # V6.0 (😷) FACE WITH MEDICAL MASK -1F638 ; emoji ; L1 ; none ; j # V6.0 (😸) GRINNING CAT FACE WITH SMILING EYES -1F639 ; emoji ; L1 ; none ; j # V6.0 (😹) CAT FACE WITH TEARS OF JOY -1F63A ; emoji ; L1 ; none ; j # V6.0 (😺) SMILING CAT FACE WITH OPEN MOUTH -1F63B ; emoji ; L1 ; none ; j # V6.0 (😻) SMILING CAT FACE WITH HEART-SHAPED EYES -1F63C ; emoji ; L1 ; none ; j # V6.0 (😼) CAT FACE WITH WRY SMILE -1F63D ; emoji ; L1 ; none ; j # V6.0 (😽) KISSING CAT FACE WITH CLOSED EYES -1F63E ; emoji ; L1 ; none ; j # V6.0 (😾) POUTING CAT FACE -1F63F ; emoji ; L1 ; none ; j # V6.0 (😿) CRYING CAT FACE -1F640 ; emoji ; L1 ; none ; j # V6.0 (🙀) WEARY CAT FACE -1F641 ; emoji ; L2 ; secondary ; x # V7.0 (🙁) SLIGHTLY FROWNING FACE -1F642 ; emoji ; L2 ; secondary ; x # V7.0 (🙂) SLIGHTLY SMILING FACE -1F643 ; emoji ; L2 ; secondary ; x # V8.0 (🙃) UPSIDE-DOWN FACE -1F644 ; emoji ; L2 ; secondary ; x # V8.0 (🙄) FACE WITH ROLLING EYES -1F645 ; emoji ; L1 ; primary ; j # V6.0 (🙅) FACE WITH NO GOOD GESTURE -1F646 ; emoji ; L1 ; primary ; j # V6.0 (🙆) FACE WITH OK GESTURE -1F647 ; emoji ; L1 ; primary ; j # V6.0 (🙇) PERSON BOWING DEEPLY -1F648 ; emoji ; L1 ; none ; j # V6.0 (🙈) SEE-NO-EVIL MONKEY -1F649 ; emoji ; L1 ; none ; j # V6.0 (🙉) HEAR-NO-EVIL MONKEY -1F64A ; emoji ; L1 ; none ; j # V6.0 (🙊) SPEAK-NO-EVIL MONKEY -1F64B ; emoji ; L1 ; primary ; j # V6.0 (🙋) HAPPY PERSON RAISING ONE HAND -1F64C ; emoji ; L1 ; secondary ; j # V6.0 (🙌) PERSON RAISING BOTH HANDS IN CELEBRATION -1F64D ; emoji ; L1 ; primary ; j # V6.0 (🙍) PERSON FROWNING -1F64E ; emoji ; L1 ; primary ; j # V6.0 (🙎) PERSON WITH POUTING FACE -1F64F ; emoji ; L1 ; secondary ; j # V6.0 (🙏) PERSON WITH FOLDED HANDS -1F680 ; emoji ; L1 ; none ; j # V6.0 (🚀) ROCKET -1F681 ; emoji ; L1 ; none ; x # V6.0 (🚁) HELICOPTER -1F682 ; emoji ; L1 ; none ; x # V6.0 (🚂) STEAM LOCOMOTIVE -1F683 ; emoji ; L1 ; none ; j # V6.0 (🚃) RAILWAY CAR -1F684 ; emoji ; L1 ; none ; j # V6.0 (🚄) HIGH-SPEED TRAIN -1F685 ; emoji ; L1 ; none ; j # V6.0 (🚅) HIGH-SPEED TRAIN WITH BULLET NOSE -1F686 ; emoji ; L1 ; none ; x # V6.0 (🚆) TRAIN -1F687 ; emoji ; L1 ; none ; j w # V6.0 (🚇) METRO -1F688 ; emoji ; L1 ; none ; x # V6.0 (🚈) LIGHT RAIL -1F689 ; emoji ; L1 ; none ; j # V6.0 (🚉) STATION -1F68A ; emoji ; L1 ; none ; x # V6.0 (🚊) TRAM -1F68B ; emoji ; L1 ; none ; x # V6.0 (🚋) TRAM CAR -1F68C ; emoji ; L1 ; none ; j # V6.0 (🚌) BUS -1F68D ; emoji ; L1 ; none ; w # V6.0 (🚍) ONCOMING BUS -1F68E ; emoji ; L1 ; none ; x # V6.0 (🚎) TROLLEYBUS -1F68F ; emoji ; L1 ; none ; j # V6.0 (🚏) BUS STOP -1F690 ; emoji ; L1 ; none ; x # V6.0 (🚐) MINIBUS -1F691 ; emoji ; L1 ; none ; j w # V6.0 (🚑) AMBULANCE -1F692 ; emoji ; L1 ; none ; j # V6.0 (🚒) FIRE ENGINE -1F693 ; emoji ; L1 ; none ; j # V6.0 (🚓) POLICE CAR -1F694 ; emoji ; L1 ; none ; w # V6.0 (🚔) ONCOMING POLICE CAR -1F695 ; emoji ; L1 ; none ; j # V6.0 (🚕) TAXI -1F696 ; emoji ; L1 ; none ; x # V6.0 (🚖) ONCOMING TAXI -1F697 ; emoji ; L1 ; none ; j # V6.0 (🚗) AUTOMOBILE -1F698 ; emoji ; L1 ; none ; w # V6.0 (🚘) ONCOMING AUTOMOBILE -1F699 ; emoji ; L1 ; none ; j # V6.0 (🚙) RECREATIONAL VEHICLE -1F69A ; emoji ; L1 ; none ; j # V6.0 (🚚) DELIVERY TRUCK -1F69B ; emoji ; L1 ; none ; x # V6.0 (🚛) ARTICULATED LORRY -1F69C ; emoji ; L1 ; none ; x # V6.0 (🚜) TRACTOR -1F69D ; emoji ; L1 ; none ; x # V6.0 (🚝) MONORAIL -1F69E ; emoji ; L1 ; none ; x # V6.0 (🚞) MOUNTAIN RAILWAY -1F69F ; emoji ; L1 ; none ; x # V6.0 (🚟) SUSPENSION RAILWAY -1F6A0 ; emoji ; L1 ; none ; x # V6.0 (🚠) MOUNTAIN CABLEWAY -1F6A1 ; emoji ; L1 ; none ; x # V6.0 (🚡) AERIAL TRAMWAY -1F6A2 ; emoji ; L1 ; none ; j # V6.0 (🚢) SHIP -1F6A3 ; emoji ; L1 ; secondary ; x # V6.0 (🚣) ROWBOAT -1F6A4 ; emoji ; L1 ; none ; j # V6.0 (🚤) SPEEDBOAT -1F6A5 ; emoji ; L1 ; none ; j # V6.0 (🚥) HORIZONTAL TRAFFIC LIGHT -1F6A6 ; emoji ; L1 ; none ; x # V6.0 (🚦) VERTICAL TRAFFIC LIGHT -1F6A7 ; emoji ; L1 ; none ; j # V6.0 (🚧) CONSTRUCTION SIGN -1F6A8 ; emoji ; L1 ; none ; j # V6.0 (🚨) POLICE CARS REVOLVING LIGHT -1F6A9 ; emoji ; L1 ; none ; j # V6.0 (🚩) TRIANGULAR FLAG ON POST -1F6AA ; emoji ; L1 ; none ; j # V6.0 (🚪) DOOR -1F6AB ; emoji ; L1 ; none ; j # V6.0 (🚫) NO ENTRY SIGN -1F6AC ; emoji ; L1 ; none ; j # V6.0 (🚬) SMOKING SYMBOL -1F6AD ; emoji ; L1 ; none ; j w # V6.0 (🚭) NO SMOKING SYMBOL -1F6AE ; emoji ; L1 ; none ; x # V6.0 (🚮) PUT LITTER IN ITS PLACE SYMBOL -1F6AF ; emoji ; L1 ; none ; x # V6.0 (🚯) DO NOT LITTER SYMBOL -1F6B0 ; emoji ; L1 ; none ; x # V6.0 (🚰) POTABLE WATER SYMBOL -1F6B1 ; emoji ; L1 ; none ; x # V6.0 (🚱) NON-POTABLE WATER SYMBOL -1F6B2 ; emoji ; L1 ; none ; j w # V6.0 (🚲) BICYCLE -1F6B3 ; emoji ; L1 ; none ; x # V6.0 (🚳) NO BICYCLES -1F6B4 ; emoji ; L1 ; secondary ; x # V6.0 (🚴) BICYCLIST -1F6B5 ; emoji ; L1 ; secondary ; x # V6.0 (🚵) MOUNTAIN BICYCLIST -1F6B6 ; emoji ; L1 ; secondary ; j # V6.0 (🚶) PEDESTRIAN -1F6B7 ; emoji ; L1 ; none ; x # V6.0 (🚷) NO PEDESTRIANS -1F6B8 ; emoji ; L1 ; none ; x # V6.0 (🚸) CHILDREN CROSSING -1F6B9 ; emoji ; L1 ; none ; j w # V6.0 (🚹) MENS SYMBOL -1F6BA ; emoji ; L1 ; none ; j w # V6.0 (🚺) WOMENS SYMBOL -1F6BB ; emoji ; L1 ; none ; j # V6.0 (🚻) RESTROOM -1F6BC ; emoji ; L1 ; none ; j w # V6.0 (🚼) BABY SYMBOL -1F6BD ; emoji ; L1 ; none ; j # V6.0 (🚽) TOILET -1F6BE ; emoji ; L1 ; none ; j # V6.0 (🚾) WATER CLOSET -1F6BF ; emoji ; L1 ; none ; x # V6.0 (🚿) SHOWER -1F6C0 ; emoji ; L1 ; secondary ; j # V6.0 (🛀) BATH -1F6C1 ; emoji ; L1 ; none ; x # V6.0 (🛁) BATHTUB -1F6C2 ; emoji ; L1 ; none ; x # V6.0 (🛂) PASSPORT CONTROL -1F6C3 ; emoji ; L1 ; none ; x # V6.0 (🛃) CUSTOMS -1F6C4 ; emoji ; L1 ; none ; x # V6.0 (🛄) BAGGAGE CLAIM -1F6C5 ; emoji ; L1 ; none ; x # V6.0 (🛅) LEFT LUGGAGE -1F6CB ; text ; L2 ; none ; w # V7.0 (🛋) COUCH AND LAMP -1F6CC ; emoji ; L2 ; none ; x # V7.0 (🛌) SLEEPING ACCOMMODATION -1F6CD ; text ; L2 ; none ; w # V7.0 (🛍) SHOPPING BAGS -1F6CE ; text ; L2 ; none ; w # V7.0 (🛎) BELLHOP BELL -1F6CF ; text ; L2 ; none ; w # V7.0 (🛏) BED -1F6D0 ; emoji ; L2 ; none ; x # V8.0 (🛐) PLACE OF WORSHIP -1F6E0 ; text ; L2 ; none ; w # V7.0 (🛠) HAMMER AND WRENCH -1F6E1 ; text ; L2 ; none ; w # V7.0 (🛡) SHIELD -1F6E2 ; text ; L2 ; none ; w # V7.0 (🛢) OIL DRUM -1F6E3 ; text ; L2 ; none ; w # V7.0 (🛣) MOTORWAY -1F6E4 ; text ; L2 ; none ; w # V7.0 (🛤) RAILWAY TRACK -1F6E5 ; text ; L2 ; none ; w # V7.0 (🛥) MOTOR BOAT -1F6E9 ; text ; L2 ; none ; w # V7.0 (🛩) SMALL AIRPLANE -1F6EB ; emoji ; L2 ; none ; x # V7.0 (🛫) AIRPLANE DEPARTURE -1F6EC ; emoji ; L2 ; none ; x # V7.0 (🛬) AIRPLANE ARRIVING -1F6F0 ; text ; L2 ; none ; w # V7.0 (🛰) SATELLITE -1F6F3 ; text ; L2 ; none ; w # V7.0 (🛳) PASSENGER SHIP -1F910 ; emoji ; L2 ; secondary ; x # V8.0 (🤐) ZIPPER-MOUTH FACE -1F911 ; emoji ; L2 ; secondary ; x # V8.0 (🤑) MONEY-MOUTH FACE -1F912 ; emoji ; L2 ; secondary ; x # V8.0 (🤒) FACE WITH THERMOMETER -1F913 ; emoji ; L2 ; secondary ; x # V8.0 (🤓) NERD FACE -1F914 ; emoji ; L2 ; secondary ; x # V8.0 (🤔) THINKING FACE -1F915 ; emoji ; L2 ; secondary ; x # V8.0 (🤕) FACE WITH HEAD-BANDAGE -1F916 ; emoji ; L2 ; none ; x # V8.0 (🤖) ROBOT FACE -1F917 ; emoji ; L2 ; secondary ; x # V8.0 (🤗) HUGGING FACE -1F918 ; emoji ; L2 ; secondary ; x # V8.0 (🤘) SIGN OF THE HORNS -1F980 ; emoji ; L2 ; none ; x # V8.0 (🦀) CRAB -1F981 ; emoji ; L2 ; none ; x # V8.0 (🦁) LION FACE -1F982 ; emoji ; L2 ; none ; x # V8.0 (🦂) SCORPION -1F983 ; emoji ; L2 ; none ; x # V8.0 (🦃) TURKEY -1F984 ; emoji ; L2 ; none ; x # V8.0 (🦄) UNICORN FACE -1F9C0 ; emoji ; L2 ; none ; x # V8.0 (🧀) CHEESE WEDGE -0023 20E3 ; text ; L1 ; none ; j # V3.0 (#⃣) keycap NUMBER SIGN -002A 20E3 ; text ; L2 ; none ; x # V3.0 (*⃣) keycap ASTERISK -0030 20E3 ; text ; L1 ; none ; j # V3.0 (0⃣) keycap DIGIT ZERO -0031 20E3 ; text ; L1 ; none ; j # V3.0 (1⃣) keycap DIGIT ONE -0032 20E3 ; text ; L1 ; none ; j # V3.0 (2⃣) keycap DIGIT TWO -0033 20E3 ; text ; L1 ; none ; j # V3.0 (3⃣) keycap DIGIT THREE -0034 20E3 ; text ; L1 ; none ; j # V3.0 (4⃣) keycap DIGIT FOUR -0035 20E3 ; text ; L1 ; none ; j # V3.0 (5⃣) keycap DIGIT FIVE -0036 20E3 ; text ; L1 ; none ; j # V3.0 (6⃣) keycap DIGIT SIX -0037 20E3 ; text ; L1 ; none ; j # V3.0 (7⃣) keycap DIGIT SEVEN -0038 20E3 ; text ; L1 ; none ; j # V3.0 (8⃣) keycap DIGIT EIGHT -0039 20E3 ; text ; L1 ; none ; j # V3.0 (9⃣) keycap DIGIT NINE -1F1E6 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇦🇨) flag for Ascension Island -1F1E6 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇦🇩) flag for Andorra -1F1E6 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇦🇪) flag for United Arab Emirates -1F1E6 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇦🇫) flag for Afghanistan -1F1E6 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇦🇬) flag for Antigua & Barbuda -1F1E6 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇦🇮) flag for Anguilla -1F1E6 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇦🇱) flag for Albania -1F1E6 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇦🇲) flag for Armenia -1F1E6 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇦🇴) flag for Angola -1F1E6 1F1F6 ; emoji ; L2 ; none ; x # V6.0 (🇦🇶) flag for Antarctica -1F1E6 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇦🇷) flag for Argentina -1F1E6 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇦🇸) flag for American Samoa -1F1E6 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇦🇹) flag for Austria -1F1E6 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇦🇺) flag for Australia -1F1E6 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇦🇼) flag for Aruba -1F1E6 1F1FD ; emoji ; L2 ; none ; x # V6.0 (🇦🇽) flag for Åland Islands -1F1E6 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇦🇿) flag for Azerbaijan -1F1E7 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇧🇦) flag for Bosnia & Herzegovina -1F1E7 1F1E7 ; emoji ; L2 ; none ; x # V6.0 (🇧🇧) flag for Barbados -1F1E7 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇧🇩) flag for Bangladesh -1F1E7 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇧🇪) flag for Belgium -1F1E7 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇧🇫) flag for Burkina Faso -1F1E7 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇧🇬) flag for Bulgaria -1F1E7 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇧🇭) flag for Bahrain -1F1E7 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇧🇮) flag for Burundi -1F1E7 1F1EF ; emoji ; L2 ; none ; x # V6.0 (🇧🇯) flag for Benin -1F1E7 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇧🇱) flag for St. Barthélemy -1F1E7 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇧🇲) flag for Bermuda -1F1E7 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇧🇳) flag for Brunei -1F1E7 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇧🇴) flag for Bolivia -1F1E7 1F1F6 ; emoji ; L2 ; none ; x # V6.0 (🇧🇶) flag for Caribbean Netherlands -1F1E7 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇧🇷) flag for Brazil -1F1E7 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇧🇸) flag for Bahamas -1F1E7 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇧🇹) flag for Bhutan -1F1E7 1F1FB ; emoji ; L2 ; none ; x # V6.0 (🇧🇻) flag for Bouvet Island -1F1E7 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇧🇼) flag for Botswana -1F1E7 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇧🇾) flag for Belarus -1F1E7 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇧🇿) flag for Belize -1F1E8 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇨🇦) flag for Canada -1F1E8 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇨🇨) flag for Cocos Islands -1F1E8 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇨🇩) flag for Congo - Kinshasa -1F1E8 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇨🇫) flag for Central African Republic -1F1E8 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇨🇬) flag for Congo - Brazzaville -1F1E8 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇨🇭) flag for Switzerland -1F1E8 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇨🇮) flag for Côte d’Ivoire -1F1E8 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇨🇰) flag for Cook Islands -1F1E8 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇨🇱) flag for Chile -1F1E8 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇨🇲) flag for Cameroon -1F1E8 1F1F3 ; emoji ; L1 ; none ; j # V6.0 (🇨🇳) flag for China -1F1E8 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇨🇴) flag for Colombia -1F1E8 1F1F5 ; emoji ; L2 ; none ; x # V6.0 (🇨🇵) flag for Clipperton Island -1F1E8 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇨🇷) flag for Costa Rica -1F1E8 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇨🇺) flag for Cuba -1F1E8 1F1FB ; emoji ; L2 ; none ; x # V6.0 (🇨🇻) flag for Cape Verde -1F1E8 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇨🇼) flag for Curaçao -1F1E8 1F1FD ; emoji ; L2 ; none ; x # V6.0 (🇨🇽) flag for Christmas Island -1F1E8 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇨🇾) flag for Cyprus -1F1E8 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇨🇿) flag for Czech Republic -1F1E9 1F1EA ; emoji ; L1 ; none ; j # V6.0 (🇩🇪) flag for Germany -1F1E9 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇩🇬) flag for Diego Garcia -1F1E9 1F1EF ; emoji ; L2 ; none ; x # V6.0 (🇩🇯) flag for Djibouti -1F1E9 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇩🇰) flag for Denmark -1F1E9 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇩🇲) flag for Dominica -1F1E9 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇩🇴) flag for Dominican Republic -1F1E9 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇩🇿) flag for Algeria -1F1EA 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇪🇦) flag for Ceuta & Melilla -1F1EA 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇪🇨) flag for Ecuador -1F1EA 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇪🇪) flag for Estonia -1F1EA 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇪🇬) flag for Egypt -1F1EA 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇪🇭) flag for Western Sahara -1F1EA 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇪🇷) flag for Eritrea -1F1EA 1F1F8 ; emoji ; L1 ; none ; j # V6.0 (🇪🇸) flag for Spain -1F1EA 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇪🇹) flag for Ethiopia -1F1EA 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇪🇺) flag for European Union -1F1EB 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇫🇮) flag for Finland -1F1EB 1F1EF ; emoji ; L2 ; none ; x # V6.0 (🇫🇯) flag for Fiji -1F1EB 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇫🇰) flag for Falkland Islands -1F1EB 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇫🇲) flag for Micronesia -1F1EB 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇫🇴) flag for Faroe Islands -1F1EB 1F1F7 ; emoji ; L1 ; none ; j # V6.0 (🇫🇷) flag for France -1F1EC 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇬🇦) flag for Gabon -1F1EC 1F1E7 ; emoji ; L1 ; none ; j # V6.0 (🇬🇧) flag for United Kingdom -1F1EC 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇬🇩) flag for Grenada -1F1EC 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇬🇪) flag for Georgia -1F1EC 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇬🇫) flag for French Guiana -1F1EC 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇬🇬) flag for Guernsey -1F1EC 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇬🇭) flag for Ghana -1F1EC 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇬🇮) flag for Gibraltar -1F1EC 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇬🇱) flag for Greenland -1F1EC 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇬🇲) flag for Gambia -1F1EC 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇬🇳) flag for Guinea -1F1EC 1F1F5 ; emoji ; L2 ; none ; x # V6.0 (🇬🇵) flag for Guadeloupe -1F1EC 1F1F6 ; emoji ; L2 ; none ; x # V6.0 (🇬🇶) flag for Equatorial Guinea -1F1EC 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇬🇷) flag for Greece -1F1EC 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇬🇸) flag for South Georgia & South Sandwich Islands -1F1EC 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇬🇹) flag for Guatemala -1F1EC 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇬🇺) flag for Guam -1F1EC 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇬🇼) flag for Guinea-Bissau -1F1EC 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇬🇾) flag for Guyana -1F1ED 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇭🇰) flag for Hong Kong -1F1ED 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇭🇲) flag for Heard & McDonald Islands -1F1ED 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇭🇳) flag for Honduras -1F1ED 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇭🇷) flag for Croatia -1F1ED 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇭🇹) flag for Haiti -1F1ED 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇭🇺) flag for Hungary -1F1EE 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇮🇨) flag for Canary Islands -1F1EE 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇮🇩) flag for Indonesia -1F1EE 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇮🇪) flag for Ireland -1F1EE 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇮🇱) flag for Israel -1F1EE 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇮🇲) flag for Isle of Man -1F1EE 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇮🇳) flag for India -1F1EE 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇮🇴) flag for British Indian Ocean Territory -1F1EE 1F1F6 ; emoji ; L2 ; none ; x # V6.0 (🇮🇶) flag for Iraq -1F1EE 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇮🇷) flag for Iran -1F1EE 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇮🇸) flag for Iceland -1F1EE 1F1F9 ; emoji ; L1 ; none ; j # V6.0 (🇮🇹) flag for Italy -1F1EF 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇯🇪) flag for Jersey -1F1EF 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇯🇲) flag for Jamaica -1F1EF 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇯🇴) flag for Jordan -1F1EF 1F1F5 ; emoji ; L1 ; none ; j # V6.0 (🇯🇵) flag for Japan -1F1F0 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇰🇪) flag for Kenya -1F1F0 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇰🇬) flag for Kyrgyzstan -1F1F0 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇰🇭) flag for Cambodia -1F1F0 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇰🇮) flag for Kiribati -1F1F0 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇰🇲) flag for Comoros -1F1F0 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇰🇳) flag for St. Kitts & Nevis -1F1F0 1F1F5 ; emoji ; L2 ; none ; x # V6.0 (🇰🇵) flag for North Korea -1F1F0 1F1F7 ; emoji ; L1 ; none ; j # V6.0 (🇰🇷) flag for South Korea -1F1F0 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇰🇼) flag for Kuwait -1F1F0 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇰🇾) flag for Cayman Islands -1F1F0 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇰🇿) flag for Kazakhstan -1F1F1 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇱🇦) flag for Laos -1F1F1 1F1E7 ; emoji ; L2 ; none ; x # V6.0 (🇱🇧) flag for Lebanon -1F1F1 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇱🇨) flag for St. Lucia -1F1F1 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇱🇮) flag for Liechtenstein -1F1F1 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇱🇰) flag for Sri Lanka -1F1F1 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇱🇷) flag for Liberia -1F1F1 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇱🇸) flag for Lesotho -1F1F1 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇱🇹) flag for Lithuania -1F1F1 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇱🇺) flag for Luxembourg -1F1F1 1F1FB ; emoji ; L2 ; none ; x # V6.0 (🇱🇻) flag for Latvia -1F1F1 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇱🇾) flag for Libya -1F1F2 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇲🇦) flag for Morocco -1F1F2 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇲🇨) flag for Monaco -1F1F2 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇲🇩) flag for Moldova -1F1F2 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇲🇪) flag for Montenegro -1F1F2 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇲🇫) flag for St. Martin -1F1F2 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇲🇬) flag for Madagascar -1F1F2 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇲🇭) flag for Marshall Islands -1F1F2 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇲🇰) flag for Macedonia -1F1F2 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇲🇱) flag for Mali -1F1F2 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇲🇲) flag for Myanmar -1F1F2 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇲🇳) flag for Mongolia -1F1F2 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇲🇴) flag for Macau -1F1F2 1F1F5 ; emoji ; L2 ; none ; x # V6.0 (🇲🇵) flag for Northern Mariana Islands -1F1F2 1F1F6 ; emoji ; L2 ; none ; x # V6.0 (🇲🇶) flag for Martinique -1F1F2 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇲🇷) flag for Mauritania -1F1F2 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇲🇸) flag for Montserrat -1F1F2 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇲🇹) flag for Malta -1F1F2 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇲🇺) flag for Mauritius -1F1F2 1F1FB ; emoji ; L2 ; none ; x # V6.0 (🇲🇻) flag for Maldives -1F1F2 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇲🇼) flag for Malawi -1F1F2 1F1FD ; emoji ; L2 ; none ; x # V6.0 (🇲🇽) flag for Mexico -1F1F2 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇲🇾) flag for Malaysia -1F1F2 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇲🇿) flag for Mozambique -1F1F3 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇳🇦) flag for Namibia -1F1F3 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇳🇨) flag for New Caledonia -1F1F3 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇳🇪) flag for Niger -1F1F3 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇳🇫) flag for Norfolk Island -1F1F3 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇳🇬) flag for Nigeria -1F1F3 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇳🇮) flag for Nicaragua -1F1F3 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇳🇱) flag for Netherlands -1F1F3 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇳🇴) flag for Norway -1F1F3 1F1F5 ; emoji ; L2 ; none ; x # V6.0 (🇳🇵) flag for Nepal -1F1F3 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇳🇷) flag for Nauru -1F1F3 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇳🇺) flag for Niue -1F1F3 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇳🇿) flag for New Zealand -1F1F4 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇴🇲) flag for Oman -1F1F5 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇵🇦) flag for Panama -1F1F5 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇵🇪) flag for Peru -1F1F5 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇵🇫) flag for French Polynesia -1F1F5 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇵🇬) flag for Papua New Guinea -1F1F5 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇵🇭) flag for Philippines -1F1F5 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇵🇰) flag for Pakistan -1F1F5 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇵🇱) flag for Poland -1F1F5 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇵🇲) flag for St. Pierre & Miquelon -1F1F5 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇵🇳) flag for Pitcairn Islands -1F1F5 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇵🇷) flag for Puerto Rico -1F1F5 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇵🇸) flag for Palestinian Territories -1F1F5 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇵🇹) flag for Portugal -1F1F5 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇵🇼) flag for Palau -1F1F5 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇵🇾) flag for Paraguay -1F1F6 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇶🇦) flag for Qatar -1F1F7 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇷🇪) flag for Réunion -1F1F7 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇷🇴) flag for Romania -1F1F7 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇷🇸) flag for Serbia -1F1F7 1F1FA ; emoji ; L1 ; none ; j # V6.0 (🇷🇺) flag for Russia -1F1F7 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇷🇼) flag for Rwanda -1F1F8 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇸🇦) flag for Saudi Arabia -1F1F8 1F1E7 ; emoji ; L2 ; none ; x # V6.0 (🇸🇧) flag for Solomon Islands -1F1F8 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇸🇨) flag for Seychelles -1F1F8 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇸🇩) flag for Sudan -1F1F8 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇸🇪) flag for Sweden -1F1F8 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇸🇬) flag for Singapore -1F1F8 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇸🇭) flag for St. Helena -1F1F8 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇸🇮) flag for Slovenia -1F1F8 1F1EF ; emoji ; L2 ; none ; x # V6.0 (🇸🇯) flag for Svalbard & Jan Mayen -1F1F8 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇸🇰) flag for Slovakia -1F1F8 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇸🇱) flag for Sierra Leone -1F1F8 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇸🇲) flag for San Marino -1F1F8 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇸🇳) flag for Senegal -1F1F8 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇸🇴) flag for Somalia -1F1F8 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇸🇷) flag for Suriname -1F1F8 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇸🇸) flag for South Sudan -1F1F8 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇸🇹) flag for São Tomé & Príncipe -1F1F8 1F1FB ; emoji ; L2 ; none ; x # V6.0 (🇸🇻) flag for El Salvador -1F1F8 1F1FD ; emoji ; L2 ; none ; x # V6.0 (🇸🇽) flag for Sint Maarten -1F1F8 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇸🇾) flag for Syria -1F1F8 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇸🇿) flag for Swaziland -1F1F9 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇹🇦) flag for Tristan da Cunha -1F1F9 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇹🇨) flag for Turks & Caicos Islands -1F1F9 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇹🇩) flag for Chad -1F1F9 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇹🇫) flag for French Southern Territories -1F1F9 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇹🇬) flag for Togo -1F1F9 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇹🇭) flag for Thailand -1F1F9 1F1EF ; emoji ; L2 ; none ; x # V6.0 (🇹🇯) flag for Tajikistan -1F1F9 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇹🇰) flag for Tokelau -1F1F9 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇹🇱) flag for Timor-Leste -1F1F9 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇹🇲) flag for Turkmenistan -1F1F9 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇹🇳) flag for Tunisia -1F1F9 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇹🇴) flag for Tonga -1F1F9 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇹🇷) flag for Turkey -1F1F9 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇹🇹) flag for Trinidad & Tobago -1F1F9 1F1FB ; emoji ; L2 ; none ; x # V6.0 (🇹🇻) flag for Tuvalu -1F1F9 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇹🇼) flag for Taiwan -1F1F9 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇹🇿) flag for Tanzania -1F1FA 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇺🇦) flag for Ukraine -1F1FA 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇺🇬) flag for Uganda -1F1FA 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇺🇲) flag for U.S. Outlying Islands -1F1FA 1F1F8 ; emoji ; L1 ; none ; j # V6.0 (🇺🇸) flag for United States -1F1FA 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇺🇾) flag for Uruguay -1F1FA 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇺🇿) flag for Uzbekistan -1F1FB 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇻🇦) flag for Vatican City -1F1FB 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇻🇨) flag for St. Vincent & Grenadines -1F1FB 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇻🇪) flag for Venezuela -1F1FB 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇻🇬) flag for British Virgin Islands -1F1FB 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇻🇮) flag for U.S. Virgin Islands -1F1FB 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇻🇳) flag for Vietnam -1F1FB 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇻🇺) flag for Vanuatu -1F1FC 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇼🇫) flag for Wallis & Futuna -1F1FC 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇼🇸) flag for Samoa -1F1FD 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇽🇰) flag for Kosovo -1F1FE 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇾🇪) flag for Yemen -1F1FE 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇾🇹) flag for Mayotte -1F1FF 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇿🇦) flag for South Africa -1F1FF 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇿🇲) flag for Zambia -1F1FF 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇿🇼) flag for Zimbabwe diff --git a/tests/data/evil-fruits.tsv b/tests/data/evil-fruits.tsv deleted file mode 100644 index 230c862..0000000 --- a/tests/data/evil-fruits.tsv +++ /dev/null @@ -1,6 +0,0 @@ -🔣 code meaning -🍇 1F347 GRAPES -🍉 1F349 WATERMELON -🍒 1F352 CHERRIES -🍓 1F353 STRAWBERRY -🍍 1F34D PINEAPPLE diff --git a/tests/delete-utf8.sh b/tests/delete-utf8.sh new file mode 100755 index 0000000..2d88f7f --- /dev/null +++ b/tests/delete-utf8.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +a,b,c +1,2,3 +DATA + +# ================================= ASSERTION ================================ # + +cat << DATA > "tmp/${t}/${t}.assert" +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" --projectName "${t} biểu tượng cảm xúc 🍉" +${cmd} --delete "${t} biểu tượng cảm xúc 🍉" +${cmd} --list | grep "${t}" | cut -d ':' -f 2 > "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/delete.sh b/tests/delete.sh new file mode 100755 index 0000000..d7e0434 --- /dev/null +++ b/tests/delete.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +a,b,c +1,2,3 +DATA + +# ================================= ASSERTION ================================ # + +cat << DATA > "tmp/${t}/${t}.assert" +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --delete "${t}" +${cmd} --list | grep "${t}" | cut -d ':' -f 2 > "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/download.sh b/tests/download.sh new file mode 100755 index 0000000..9f8b0ae --- /dev/null +++ b/tests/download.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# ================================== ACTION ================================== # + +${cmd} --download "https://git.io/fj5ju" --output "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "data/duplicates-deletion.json" "tmp/${t}/${t}.output" diff --git a/tests/export-filename-utf8.sh b/tests/export-filename-utf8.sh new file mode 100755 index 0000000..9c74d1c --- /dev/null +++ b/tests/export-filename-utf8.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.tsv" +a b c +1 2 3 +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +a,b,c +1,2,3 +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.tsv" +${cmd} --export "${t}" --output "tmp/${t}/biểu tượng cảm xúc 🍉.csv" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/biểu tượng cảm xúc 🍉.csv" diff --git a/tests/export-filename.sh b/tests/export-filename.sh new file mode 100755 index 0000000..7176adc --- /dev/null +++ b/tests/export-filename.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.tsv" +a b c +1 2 3 +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +a,b,c +1,2,3 +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.tsv" +${cmd} --export "${t}" --output "tmp/${t}/${t}.csv" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.csv" diff --git a/tests/export-utf8.sh b/tests/export-utf8.sh new file mode 100755 index 0000000..ec26638 --- /dev/null +++ b/tests/export-utf8.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +🔣,code,meaning +🍇,1F347,GRAPES +🍉,1F349,WATERMELON +🍒,1F352,CHERRIES +🍓,1F353,STRAWBERRY +🍍,1F34D,PINEAPPLE +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +🔣 code meaning +🍇 1F347 GRAPES +🍉 1F349 WATERMELON +🍒 1F352 CHERRIES +🍓 1F353 STRAWBERRY +🍍 1F34D PINEAPPLE +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --export "${t}" > "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/export.sh b/tests/export.sh new file mode 100755 index 0000000..1980555 --- /dev/null +++ b/tests/export.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +a,b,c +1,2,3 +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +a b c +1 2 3 +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --export "${t}" > "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/help.sh b/tests/help.sh new file mode 100755 index 0000000..e768159 --- /dev/null +++ b/tests/help.sh @@ -0,0 +1,169 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +Usage: refine.py [--help | OPTIONS] + +Script to provide a command line interface to an OpenRefine server. + +Options: + -h, --help show this help message and exit + + Connection options: + -H 127.0.0.1, --host=127.0.0.1 + OpenRefine hostname (default: 127.0.0.1) + -P 3333, --port=3333 + OpenRefine port (default: 3333) + + Commands: + -c [FILE], --create=[FILE] + Create project from file. The filename ending (e.g. + .csv) defines the input format + (csv,tsv,xml,json,txt,xls,xlsx,ods) + -l, --list List projects + --download=[URL] Download file from URL (e.g. example data). Combine + with --output to specify a filename. + + Commands with argument [PROJECTID/PROJECTNAME]: + -d, --delete Delete project + -f [FILE], --apply=[FILE] + Apply JSON rules to OpenRefine project + -E, --export Export project in tsv format to stdout. + -o [FILE], --output=[FILE] + Export project to file. The filename ending (e.g. + .tsv) defines the output format + (csv,tsv,xls,xlsx,html) + --template=[STRING] + Export project with templating. Provide (big) text + string that you enter in the *row template* textfield + in the export/templating menu in the browser app) + --info show project metadata + + General options: + --format=FILE_FORMAT + Override file detection (import: + csv,tsv,xml,json,line-based,fixed-width,xls,xlsx,ods; + export: csv,tsv,html,xls,xlsx,ods) + + Create options: + --columnWidths=COLUMNWIDTHS + (txt/fixed-width), please provide widths in multiple + arguments, e.g. --columnWidths=7 --columnWidths=5 + --encoding=ENCODING + (csv,tsv,txt), please provide short encoding name + (e.g. UTF-8) + --guessCellValueTypes=true/false + (xml,csv,tsv,txt,json, default: false) + --headerLines=HEADERLINES + (csv,tsv,txt/fixed-width,xls,xlsx,ods), default: 1, + default txt/fixed-width: 0 + --ignoreLines=IGNORELINES + (csv,tsv,txt,xls,xlsx,ods), default: -1 + --includeFileSources=true/false + (all formats), default: false + --limit=LIMIT (all formats), default: -1 + --linesPerRow=LINESPERROW + (txt/line-based), default: 1 + --processQuotes=true/false + (csv,tsv), default: true + --projectName=PROJECTNAME + (all formats), default: filename + --projectTags=PROJECTTAGS + (all formats), please provide tags in multiple + arguments, e.g. --projectTags=beta + --projectTags=client1 + --recordPath=RECORDPATH + (xml,json), please provide path in multiple arguments, + e.g. /collection/record/ should be entered: + --recordPath=collection --recordPath=record, default + xml: root element, default json: _ _ + --separator=SEPARATOR + (csv,tsv), default csv: , default tsv: \t + --sheets=SHEETS (xls,xlsx,ods), please provide sheets in multiple + arguments, e.g. --sheets=0 --sheets=1, default: 0 + (first sheet) + --skipDataLines=SKIPDATALINES + (csv,tsv,txt,xls,xlsx,ods), default: 0, default line- + based: -1 + --storeBlankCellsAsNulls=true/false + (csv,tsv,txt,xls,xlsx,ods), default: true + --storeBlankRows=true/false + (csv,tsv,txt,xls,xlsx,ods), default: true + --storeEmptyStrings=true/false + (xml,json), default: true + --trimStrings=true/false + (xml,json), default: false + + Templating options: + --mode=row-based/record-based + engine mode (default: row-based) + --prefix=PREFIX text string that you enter in the *prefix* textfield + in the browser app + --rowSeparator=ROWSEPARATOR + text string that you enter in the *row separator* + textfield in the browser app + --suffix=SUFFIX text string that you enter in the *suffix* textfield + in the browser app + --filterQuery=REGEX + Simple RegEx text filter on filterColumn, e.g. ^12015$ + --filterColumn=COLUMNNAME + column name for filterQuery (default: name of first + column) + --facets=FACETS facets config in json format (may be extracted with + browser dev tools in browser app) + --splitToFiles=true/false + will split each row/record into a single file; it + specifies a presumably unique character series for + splitting; --prefix and --suffix will be applied to + all files; filename-prefix can be specified with + --output (default: %Y%m%d) + --suffixById=true/false + enhancement option for --splitToFiles; will generate + filename-suffix from values in key column + +Example data: + --download "https://git.io/fj5hF" --output=duplicates.csv + --download "https://git.io/fj5ju" --output=duplicates-deletion.json + +Basic commands: + --list # list all projects + --list -H 127.0.0.1 -P 80 # specify hostname and port + --create duplicates.csv # create new project from file + --info "duplicates" # show project metadata + --apply duplicates-deletion.json "duplicates" # apply rules in file to project + --export "duplicates" # export project to terminal in tsv format + --export --output=deduped.xls "duplicates" # export project to file in xls format + --delete "duplicates" # delete project + +Some more examples: + --info 1234567890123 # specify project by id + --create example.tsv --encoding=UTF-8 + --create example.xml --recordPath=collection --recordPath=record + --create example.json --recordPath=_ --recordPath=_ + --create example.xlsx --sheets=0 + --create example.ods --sheets=0 + +Example for Templating Export: + Cf. https://github.com/opencultureconsulting/openrefine-client#advanced-templating +DATA + +# ================================== ACTION ================================== # + +${cmd} --help > "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/info-utf8.sh b/tests/info-utf8.sh new file mode 100755 index 0000000..1fc4122 --- /dev/null +++ b/tests/info-utf8.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.tsv" +🔣 code meaning +🍇 1F347 GRAPES +🍉 1F349 WATERMELON +🍒 1F352 CHERRIES +🍓 1F353 STRAWBERRY +🍍 1F34D PINEAPPLE +DATA + +# ================================= ASSERTION ================================ # + +cat << DATA > "tmp/${t}/${t}.assert" + column 001: 🔣 +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.tsv" +${cmd} --info "${t}" | grep 'column 001' > "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/info.sh b/tests/info.sh new file mode 100755 index 0000000..204b630 --- /dev/null +++ b/tests/info.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +a,b,c +1,2,3 +DATA + +# ================================= ASSERTION ================================ # + +cat << DATA > "tmp/${t}/${t}.assert" + column 002: b +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --info "${t}" | grep 'column 002' > "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/list.sh b/tests/list.sh new file mode 100755 index 0000000..7e23172 --- /dev/null +++ b/tests/list.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +a,b,c +1,2,3 +DATA + +# ================================= ASSERTION ================================ # + +cat << DATA > "tmp/${t}/${t}.assert" + ${t} +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --list | grep "${t}" | cut -d ':' -f 2 > "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/template b/tests/template index 7ec62f7..ade739e 100755 --- a/tests/template +++ b/tests/template @@ -2,14 +2,17 @@ # =============================== ENVIRONMENT ================================ # -t="test" - if [[ ${1} ]]; then - version="${1##*.}" + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 fi +#if [[ ${2} ]]; then +# version="${2##*.}" +#fi +t="$(basename "${BASH_SOURCE[0]}" .sh)" cd "${BASH_SOURCE%/*}/" || exit 1 -client="python3 ../refine.py -H localhost -P 3334" mkdir -p "tmp/${t}" # =================================== DATA =================================== # @@ -39,21 +42,21 @@ DATA # ================================= ASSERTION ================================ # -# if [[ "$version" >= 2 ]]; then +#if [[ "$version" >= 2 ]]; then cat << "DATA" > "tmp/${t}/${t}.assert" a b apply c 1 2 TEST 3 0 0 0 0 $ \ \ ' DATA -# else -# fi +#else +#fi # ================================== ACTION ================================== # -${client} --create "tmp/${t}/${t}.csv" -${client} --apply "tmp/${t}/${t}.transform" "${t}" -${client} --export "${t}" --output "tmp/${t}/${t}.output" +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --apply "tmp/${t}/${t}.transform" "${t}" +${cmd} --export "${t}" --output "tmp/${t}/${t}.output" # =================================== TEST =================================== # diff --git a/tests/templating-filter-utf8.sh b/tests/templating-filter-utf8.sh new file mode 100755 index 0000000..78d883a --- /dev/null +++ b/tests/templating-filter-utf8.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +🔣,code,meaning +🍇,1F347,GRAPES +🍉,1F349,WATERMELON +🍒,1F352,CHERRIES +🍓,1F353,STRAWBERRY +🍍,1F34D,PINEAPPLE +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +{ "emojis" : [ + { "symbol" : "🍇", "meaning" : "GRAPES" }, + { "symbol" : "🍉", "meaning" : "WATERMELON" }, + { "symbol" : "🍍", "meaning" : "PINEAPPLE" } +] } +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --export "${t}" \ +--prefix '{ "emojis" : [ +' \ +--template ' { "symbol" : {{jsonize(with(row.columnNames[0],cn,cells[cn].value))}}, "meaning" : {{jsonize(cells["meaning"].value)}} }' \ +--rowSeparator ', +' \ +--suffix ' +] } +' \ +--filterQuery '^1F34' \ +--filterColumn 'code' \ +--output "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/templating-filter.sh b/tests/templating-filter.sh new file mode 100755 index 0000000..e63c710 --- /dev/null +++ b/tests/templating-filter.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +email,name,state,gender,purchase +danny.baron@example1.com,Danny Baron,CA,M,TV +melanie.white@example2.edu,Melanie White,NC,F,iPhone +danny.baron@example1.com,D. Baron,CA,M,Winter jacket +ben.tyler@example3.org,Ben Tyler,NV,M,Flashlight +arthur.duff@example4.com,Arthur Duff,OR,M,Dining table +danny.baron@example1.com,Daniel Baron,CA,M,Bike +jean.griffith@example5.org,Jean Griffith,WA,F,Power drill +melanie.white@example2.edu,Melanie White,NC,F,iPad +ben.morisson@example6.org,Ben Morisson,FL,M,Amplifier +arthur.duff@example4.com,Arthur Duff,OR,M,Night table +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +{ "events" : [ + { "name" : "Melanie White", "purchase" : "iPhone" }, + { "name" : "Jean Griffith", "purchase" : "Power drill" }, + { "name" : "Melanie White", "purchase" : "iPad" } +] } +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --export "${t}" \ +--prefix '{ "events" : [ +' \ +--template ' { "name" : {{jsonize(cells["name"].value)}}, "purchase" : {{jsonize(cells["purchase"].value)}} }' \ +--rowSeparator ', +' \ +--suffix ' +] } +' \ +--filterQuery '^F$' \ +--filterColumn 'gender' \ +--output "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/templating-split-id-utf8.sh b/tests/templating-split-id-utf8.sh new file mode 100755 index 0000000..ec30a4a --- /dev/null +++ b/tests/templating-split-id-utf8.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +🔣,code,meaning +🍇,1F347,GRAPES +🍉,1F349,WATERMELON +🍒,1F352,CHERRIES +🍓,1F353,STRAWBERRY +🍍,1F34D,PINEAPPLE +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +{ "emojis" : [ + { "symbol" : "🍍", "meaning" : "PINEAPPLE" } +] } +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --export "${t}" \ +--prefix '{ "emojis" : [ +' \ +--template ' { "symbol" : {{jsonize(with(row.columnNames[0],cn,cells[cn].value))}}, "meaning" : {{jsonize(cells["meaning"].value)}} }' \ +--rowSeparator ', +' \ +--suffix ' +] } +' \ +--splitToFiles true \ +--suffixById true \ +--output "tmp/${t}/trái cây.json" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/trái cây_🍍.json" diff --git a/tests/templating-split-id.sh b/tests/templating-split-id.sh new file mode 100755 index 0000000..a739c52 --- /dev/null +++ b/tests/templating-split-id.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +email,name,state,gender,purchase +danny.baron@example1.com,Danny Baron,CA,M,TV +melanie.white@example2.edu,Melanie White,NC,F,iPhone +danny.baron@example1.com,D. Baron,CA,M,Winter jacket +ben.tyler@example3.org,Ben Tyler,NV,M,Flashlight +arthur.duff@example4.com,Arthur Duff,OR,M,Dining table +danny.baron@example1.com,Daniel Baron,CA,M,Bike +jean.griffith@example5.org,Jean Griffith,WA,F,Power drill +melanie.white@example2.edu,Melanie White,NC,F,iPad +ben.morisson@example6.org,Ben Morisson,FL,M,Amplifier +arthur.duff@example4.com,Arthur Duff,OR,M,Night table +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +{ "events" : [ + { "name" : "Arthur Duff", "purchase" : "Night table" } +] } +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --export "${t}" \ +--prefix '{ "events" : [ +' \ +--template ' { "name" : {{jsonize(cells["name"].value)}}, "purchase" : {{jsonize(cells["purchase"].value)}} }' \ +--rowSeparator ', +' \ +--suffix ' +] } +' \ +--splitToFiles true \ +--suffixById true \ +--output "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +ls "tmp/${t}" +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}_arthur.duff@example4.com.output" diff --git a/tests/templating-split-utf8.sh b/tests/templating-split-utf8.sh new file mode 100755 index 0000000..3ceeefb --- /dev/null +++ b/tests/templating-split-utf8.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +🔣,code,meaning +🍇,1F347,GRAPES +🍉,1F349,WATERMELON +🍒,1F352,CHERRIES +🍓,1F353,STRAWBERRY +🍍,1F34D,PINEAPPLE +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +{ "emojis" : [ + { "symbol" : "🍍", "meaning" : "PINEAPPLE" } +] } +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --export "${t}" \ +--prefix '{ "emojis" : [ +' \ +--template ' { "symbol" : {{jsonize(with(row.columnNames[0],cn,cells[cn].value))}}, "meaning" : {{jsonize(cells["meaning"].value)}} }' \ +--rowSeparator ', +' \ +--suffix ' +] } +' \ +--splitToFiles true \ +--output "tmp/${t}/trái cây.json" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/trái cây_5.json" diff --git a/tests/templating-split.sh b/tests/templating-split.sh new file mode 100755 index 0000000..3929754 --- /dev/null +++ b/tests/templating-split.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +email,name,state,gender,purchase +danny.baron@example1.com,Danny Baron,CA,M,TV +melanie.white@example2.edu,Melanie White,NC,F,iPhone +danny.baron@example1.com,D. Baron,CA,M,Winter jacket +ben.tyler@example3.org,Ben Tyler,NV,M,Flashlight +arthur.duff@example4.com,Arthur Duff,OR,M,Dining table +danny.baron@example1.com,Daniel Baron,CA,M,Bike +jean.griffith@example5.org,Jean Griffith,WA,F,Power drill +melanie.white@example2.edu,Melanie White,NC,F,iPad +ben.morisson@example6.org,Ben Morisson,FL,M,Amplifier +arthur.duff@example4.com,Arthur Duff,OR,M,Night table +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +{ "events" : [ + { "name" : "Arthur Duff", "purchase" : "Night table" } +] } +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --export "${t}" \ +--prefix '{ "events" : [ +' \ +--template ' { "name" : {{jsonize(cells["name"].value)}}, "purchase" : {{jsonize(cells["purchase"].value)}} }' \ +--rowSeparator ', +' \ +--suffix ' +] } +' \ +--splitToFiles true \ +--output "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +ls "tmp/${t}" +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}_10.output" diff --git a/tests/templating-utf8.sh b/tests/templating-utf8.sh new file mode 100755 index 0000000..a47f946 --- /dev/null +++ b/tests/templating-utf8.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +🔣,code,meaning +🍇,1F347,GRAPES +🍉,1F349,WATERMELON +🍒,1F352,CHERRIES +🍓,1F353,STRAWBERRY +🍍,1F34D,PINEAPPLE +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +{ "emojis" : [ + { "symbol" : "🍇", "meaning" : "GRAPES" }, + { "symbol" : "🍉", "meaning" : "WATERMELON" }, + { "symbol" : "🍒", "meaning" : "CHERRIES" }, + { "symbol" : "🍓", "meaning" : "STRAWBERRY" }, + { "symbol" : "🍍", "meaning" : "PINEAPPLE" } +] } +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --export "${t}" \ +--prefix '{ "emojis" : [ +' \ +--template ' { "symbol" : {{jsonize(with(row.columnNames[0],cn,cells[cn].value))}}, "meaning" : {{jsonize(cells["meaning"].value)}} }' \ +--rowSeparator ', +' \ +--suffix ' +] } +' \ +--output "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/templating.sh b/tests/templating.sh new file mode 100755 index 0000000..e3b89b9 --- /dev/null +++ b/tests/templating.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# =================================== DATA =================================== # + +cat << "DATA" > "tmp/${t}/${t}.csv" +email,name,state,gender,purchase +danny.baron@example1.com,Danny Baron,CA,M,TV +melanie.white@example2.edu,Melanie White,NC,F,iPhone +danny.baron@example1.com,D. Baron,CA,M,Winter jacket +ben.tyler@example3.org,Ben Tyler,NV,M,Flashlight +arthur.duff@example4.com,Arthur Duff,OR,M,Dining table +danny.baron@example1.com,Daniel Baron,CA,M,Bike +jean.griffith@example5.org,Jean Griffith,WA,F,Power drill +melanie.white@example2.edu,Melanie White,NC,F,iPad +ben.morisson@example6.org,Ben Morisson,FL,M,Amplifier +arthur.duff@example4.com,Arthur Duff,OR,M,Night table +DATA + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +{ "events" : [ + { "name" : "Danny Baron", "purchase" : "TV" }, + { "name" : "Melanie White", "purchase" : "iPhone" }, + { "name" : "D. Baron", "purchase" : "Winter jacket" }, + { "name" : "Ben Tyler", "purchase" : "Flashlight" }, + { "name" : "Arthur Duff", "purchase" : "Dining table" }, + { "name" : "Daniel Baron", "purchase" : "Bike" }, + { "name" : "Jean Griffith", "purchase" : "Power drill" }, + { "name" : "Melanie White", "purchase" : "iPad" }, + { "name" : "Ben Morisson", "purchase" : "Amplifier" }, + { "name" : "Arthur Duff", "purchase" : "Night table" } +] } +DATA + +# ================================== ACTION ================================== # + +${cmd} --create "tmp/${t}/${t}.csv" +${cmd} --export "${t}" \ +--prefix '{ "events" : [ +' \ +--template ' { "name" : {{jsonize(cells["name"].value)}}, "purchase" : {{jsonize(cells["purchase"].value)}} }' \ +--rowSeparator ', +' \ +--suffix ' +] } +' \ +--output "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output" diff --git a/tests/usage.sh b/tests/usage.sh new file mode 100755 index 0000000..ccce91a --- /dev/null +++ b/tests/usage.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# =============================== ENVIRONMENT ================================ # + +if [[ ${1} ]]; then + cmd="${1}" +else + echo 1>&2 "execute tests.sh to run all tests"; exit 1 +fi + +t="$(basename "${BASH_SOURCE[0]}" .sh)" +cd "${BASH_SOURCE%/*}/" || exit 1 +mkdir -p "tmp/${t}" + +# ================================= ASSERTION ================================ # + +cat << "DATA" > "tmp/${t}/${t}.assert" +Usage: refine.py [--help | OPTIONS] + +DATA + +# ================================== ACTION ================================== # + +${cmd} > "tmp/${t}/${t}.output" + +# =================================== TEST =================================== # + +diff -u "tmp/${t}/${t}.assert" "tmp/${t}/${t}.output"