diff --git a/config.json b/config.json deleted file mode 100644 index 8e8ffad..0000000 --- a/config.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "system":{ - "id":"data-transport", - "logo":"www/data-transport/_images/database.png","context":"", "theme":"oss.css", - "app":{ - - "debug":true,"port":8000}, - "version":0.6,"mode":"portal", - "source":{ - "id":"cloud", - "auth":"nextcloud-auth.json" - } - - - }, - - "layout":{ - - "header":{"title":"data-transport","logo":true,"subtitle":"Simple Data Access Layer - Pandas Support"}, - "icons":[], - "root":"www/data-transport", - "index":"index.html", - "on":{ - "load":{ - "left-pane":["www/data-transport/more.md"] - } - }, - "order":{ - "menu":["resources","about"] - }, - "overwrite":{ - "license":{ - "title":"MIT License", - "text":"license", - "type":"dialog", - "uri":"www/data-transport/resources/license.md" - }, - "source-code":{ - "text":"Source Code", - "type":"redirect", - "url":"https://hiplab.mc.vanderbilt.edu/git/hiplab/data-transport" - }, - "the-story":{ - "title":"History", - "text":"History","type":"dialog","uri":"www/data-transport/about/the-story.md" - }, - "about-etl":{ - "title":"data-transport - ETL", - "text":"Run ETL", "type":"dialog", - "uri":"www/data-transport/tutorials/about-etl.md" - } - }, - "footer":[{"text":"Health Information Privacy Laboratory"},{"text":"Powered By - QCMS"}] - } -} diff --git a/qcms-manifest.json b/qcms-manifest.json new file mode 100644 index 0000000..805ba45 --- /dev/null +++ b/qcms-manifest.json @@ -0,0 +1,95 @@ +{ + "system": { + "logo": "www/html/_assets/images/logo.png", + "context": "", + "theme": "oss", + "app": { + "debug": true, + "port": 8000 + }, + "version": 0.1, + "source": { + "id": "_cloud", + "auth": "nextcloud-auth.json", + "key": "/home/steve/dev/data/qcms/dev-qcms.key" + }, + "data": { + "logger": { + "provider": "console" + } + } + }, + "plugins": { + "info": [ + "_data", + "about", + "product","registry" + ] + }, + "layout": { + "header": { + "title": "data-transport", + "logo": true, + "subtitle": "Simple/Seamless Read, Write & Streaming - Powered by Pandas" + }, + "icons": [], + "root": "www/html", + "index": "index.html", + "on": { + "load": { + + } + }, + "order": { + "menu": [ + "docs", + "wizard", + "setup", + "about" + ] + }, + "overwrite": { + "design and credit": { + "title": "Design & Credit", + "text": "Design/Credit", + "type": "dialog", + "uri": "www/html/about/design-and-credit.md" + }, + "tutorials": { + "text": "notebooks", + "type": "redirect", + "url": "https://github.com/lnyemba/data-transport/src/branch/v2.0/notebooks" + }, + "wizard": { + "title": "auth-file Generator", + "text": "auth-file Generator", + "type": "dialog", + "uri": "www/html/wizard/wizard.html" + }, + "transport": { + "text": "ETL - CLI", + "type": "redirect" + }, + "source code": { + "title": "Source Code", + "text": "Source Code", + "type": "redirect", + "url": "https://hiplab.mc.vanderbilt.edu/git/hiplab/data-transport" + }, + "feedback": { + "title": "Feedback", + "text": "Feedback", + "type": "redirect", + "url": "https://dev.the-phi.com/cloud/apps/forms/s/CXqXgBaSk7qkgammbqALWfPM" + } + }, + "footer": [ + { + "text": "Health Information Privacy Laboratory" + }, + { + "text": "Powered By - QCMS" + } + ] + } +} diff --git a/www/html/_assets/data/products.csv b/www/html/_assets/data/products.csv new file mode 100644 index 0000000..a2b6b58 --- /dev/null +++ b/www/html/_assets/data/products.csv @@ -0,0 +1,10 @@ + ,community edition,enterprise edition +NoSQL
mongodb; couchdb ...
,yes,yes +RDBMS/SQL
PostgreSQL; SQL Server; MySQL ...
,yes,yes +Cloud
s3; redshift; bigquery; databricks ...
,yes,yes +Warehouse
Iceberg; Drill ...
,yes,yes +Other
http; MQTT; Files ...
,yes,yes +Plugins
native python
,yes,yes +Command Line (CLI)
ETL & setting up registry
,yes,yes +Logging/Monitoring,no,yes +Streaming,no,yes diff --git a/www/html/_assets/images/.xdp-.$uml-plugins-components.drawio.bkp-mGR3TI b/www/html/_assets/images/.xdp-.$uml-plugins-components.drawio.bkp-mGR3TI new file mode 100644 index 0000000..5abe817 --- /dev/null +++ b/www/html/_assets/images/.xdp-.$uml-plugins-components.drawio.bkp-mGR3TI @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/html/_assets/images/banner.jpg b/www/html/_assets/images/banner.jpg new file mode 100644 index 0000000..47cffbb Binary files /dev/null and b/www/html/_assets/images/banner.jpg differ diff --git a/www/html/_assets/images/database.png b/www/html/_assets/images/database.png new file mode 100644 index 0000000..e42b8e9 Binary files /dev/null and b/www/html/_assets/images/database.png differ diff --git a/www/html/_assets/images/logo.png b/www/html/_assets/images/logo.png new file mode 100644 index 0000000..1b49e78 Binary files /dev/null and b/www/html/_assets/images/logo.png differ diff --git a/www/html/_assets/images/plugins-components.png b/www/html/_assets/images/plugins-components.png new file mode 100644 index 0000000..f11dc79 Binary files /dev/null and b/www/html/_assets/images/plugins-components.png differ diff --git a/www/html/_assets/images/plugins-components.svg b/www/html/_assets/images/plugins-components.svg new file mode 100644 index 0000000..b4c43eb --- /dev/null +++ b/www/html/_assets/images/plugins-components.svg @@ -0,0 +1,4 @@ + + + +
«plugin»
Plug02
«plugin»...
«plugin»
Plug01
«plugin»...

Data-Transport


+ read: pandas.DataFrame
+ write: pandas.DataFrame

+ stream: pandas.DataFrame

Data-Transport...
functions registered and setup in a pipeline
functions registered and setup in a p...
Data Transport component pass data to other components
Data Transport component pass data to ot...
\ No newline at end of file diff --git a/www/html/_assets/images/transport-help.png b/www/html/_assets/images/transport-help.png new file mode 100644 index 0000000..9ec6992 Binary files /dev/null and b/www/html/_assets/images/transport-help.png differ diff --git a/www/html/_assets/images/uml-activity-2.png b/www/html/_assets/images/uml-activity-2.png new file mode 100644 index 0000000..1b99b2a Binary files /dev/null and b/www/html/_assets/images/uml-activity-2.png differ diff --git a/www/html/_assets/images/uml-activity.drawio b/www/html/_assets/images/uml-activity.drawio new file mode 100644 index 0000000..4b2e382 --- /dev/null +++ b/www/html/_assets/images/uml-activity.drawio @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/html/_assets/images/uml-activity.png b/www/html/_assets/images/uml-activity.png new file mode 100644 index 0000000..45fec09 Binary files /dev/null and b/www/html/_assets/images/uml-activity.png differ diff --git a/www/html/_assets/images/uml-plugins-components.drawio b/www/html/_assets/images/uml-plugins-components.drawio new file mode 100644 index 0000000..5abe817 --- /dev/null +++ b/www/html/_assets/images/uml-plugins-components.drawio @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/html/_assets/themes/default/borders.css b/www/html/_assets/themes/default/borders.css new file mode 100644 index 0000000..6f9a192 --- /dev/null +++ b/www/html/_assets/themes/default/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:1px solid #CAD5E0; + +} + +.border-left{ + border-left:1px solid #CAD5E0; +} + + +.border-bottom { border-bottom:1px solid #CAD5E0} +.border-top { border-top:1px solid #CAD5E0} + diff --git a/www/html/_assets/themes/default/footer.css b/www/html/_assets/themes/default/footer.css new file mode 100644 index 0000000..8086c04 --- /dev/null +++ b/www/html/_assets/themes/default/footer.css @@ -0,0 +1,19 @@ +/** +* This file styles the footer of the page +*/ + +.footer { + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); */ + + grid-column: 1 /span 2; +} diff --git a/www/html/_assets/themes/default/header.css b/www/html/_assets/themes/default/header.css new file mode 100644 index 0000000..a64ce8b --- /dev/null +++ b/www/html/_assets/themes/default/header.css @@ -0,0 +1,3 @@ +.main .header { display:grid; grid-template-columns:64px auto; gap:4px} +.main .header .title {font-size:28px; font-weight:bold} +.main .header img {width:55px; height:55px;} diff --git a/www/html/_assets/themes/default/layout.css b/www/html/_assets/themes/default/layout.css new file mode 100644 index 0000000..0e48ca3 --- /dev/null +++ b/www/html/_assets/themes/default/layout.css @@ -0,0 +1,22 @@ + + +.main { + height:98vh; display:grid; grid-template-columns:70% auto; gap:4px; + grid-template-rows:70px 40px auto 32px; + padding-left:2%; padding-right:2%; + line-height: 1.5; font-size:16px; font-family: sans-serif; font-weight:lighter; +} +.main .content{ + align-self:center; +} +.main .pane {border-left:1px solid #CAD5E0; height:100%; padding:8px;} +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/html/_assets/themes/default/menu.css b/www/html/_assets/themes/default/menu.css new file mode 100644 index 0000000..7a14d15 --- /dev/null +++ b/www/html/_assets/themes/default/menu.css @@ -0,0 +1,78 @@ +.menu { + padding:8px; + border:1px solid #CAD5E0 ; + + display:grid; + grid-column: 1 / span 2; + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + align-items: center; + +} +.menu .icon {padding:4px;} +.menu .icon img {width:30px; height:30px;} +.menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; + + + + + +} + +.menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} + +.menu .item:hover .sub-menu{ + + display:block; + height:auto; +} +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/html/_assets/themes/default/pane.css b/www/html/_assets/themes/default/pane.css new file mode 100644 index 0000000..e321d4a --- /dev/null +++ b/www/html/_assets/themes/default/pane.css @@ -0,0 +1,2 @@ +.main .pane { height:auto;} +.main .pane iframe{ width:100%; border:0px; height:80%;} diff --git a/www/html/_assets/themes/hiplab/borders.css b/www/html/_assets/themes/hiplab/borders.css new file mode 100644 index 0000000..6f9a192 --- /dev/null +++ b/www/html/_assets/themes/hiplab/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:1px solid #CAD5E0; + +} + +.border-left{ + border-left:1px solid #CAD5E0; +} + + +.border-bottom { border-bottom:1px solid #CAD5E0} +.border-top { border-top:1px solid #CAD5E0} + diff --git a/www/html/_assets/themes/hiplab/footer.css b/www/html/_assets/themes/hiplab/footer.css new file mode 100644 index 0000000..8086c04 --- /dev/null +++ b/www/html/_assets/themes/hiplab/footer.css @@ -0,0 +1,19 @@ +/** +* This file styles the footer of the page +*/ + +.footer { + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); */ + + grid-column: 1 /span 2; +} diff --git a/www/html/_assets/themes/hiplab/header.css b/www/html/_assets/themes/hiplab/header.css new file mode 100644 index 0000000..a64ce8b --- /dev/null +++ b/www/html/_assets/themes/hiplab/header.css @@ -0,0 +1,3 @@ +.main .header { display:grid; grid-template-columns:64px auto; gap:4px} +.main .header .title {font-size:28px; font-weight:bold} +.main .header img {width:55px; height:55px;} diff --git a/www/html/_assets/themes/hiplab/layout.css b/www/html/_assets/themes/hiplab/layout.css new file mode 100644 index 0000000..4c0bf03 --- /dev/null +++ b/www/html/_assets/themes/hiplab/layout.css @@ -0,0 +1,37 @@ +/** +* This is the default window and we will have to hide the pane (side) +*/ + +.main {height:98vh; display:grid; grid-template-columns:75% auto; gap:4px; + grid-template-rows:70px 40px auto 32px; + padding-left:2%; padding-right:2%; + } + .main .header { display:grid; grid-template-columns:64px auto; gap:4px; align-items: center;} + .main .header .title {font-size:28px; font-weight:bold} + .main .header img {width:80px; height:80px;} + .main .index{ + align-self:center; + padding:8px; + } + .main .menu {border:1px solid transparent; background-color:#f3f3f3;} + .main .pane {border-left:1px solid #CAD5E0; height:100%; padding:8px; line-height:1.5; font-size: 14px;} + .main .pane div:first-child {margin-top:4px; background-color:#f3f3f3; border-radius: 8px; padding:8px; min-height:150px} + + .search-box {display:block; grid-template-columns: none;} + + + + +.main .content{ + align-self:center; +} +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/html/_assets/themes/hiplab/menu.css b/www/html/_assets/themes/hiplab/menu.css new file mode 100644 index 0000000..bb368d0 --- /dev/null +++ b/www/html/_assets/themes/hiplab/menu.css @@ -0,0 +1,110 @@ +.menu { + padding:8px; + border:1px solid #CAD5E0 ; + + display:grid; + grid-column: 1 / span 2; + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + align-items: center; + +} +.menu .icon {padding:4px;} +.menu .icon img {width:30px; height:30px;} +.menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; + + + + + +} + +.menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} + +.menu .item:hover .sub-menu{ + + display:block; + height:auto; +} + +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/html/_assets/themes/hiplab/pane.css b/www/html/_assets/themes/hiplab/pane.css new file mode 100644 index 0000000..e69de29 diff --git a/www/html/_assets/themes/magazine/borders.css b/www/html/_assets/themes/magazine/borders.css new file mode 100644 index 0000000..e6c7e66 --- /dev/null +++ b/www/html/_assets/themes/magazine/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:3px dotted #CAD5E0; + +} + +.border-left{ + border-left:3px dotted gray; +} + + +.border-bottom { border-bottom:1px dotted gray;} +.border-top { border-top:3px dotted gray;} + diff --git a/www/html/_assets/themes/magazine/footer.css b/www/html/_assets/themes/magazine/footer.css new file mode 100644 index 0000000..84ce356 --- /dev/null +++ b/www/html/_assets/themes/magazine/footer.css @@ -0,0 +1,22 @@ +/** +* This file styles the footer of the page +*/ + + + +/* .main .footer { grid-column: 1 / span 2; font-size:13px; font-weight: lighter; padding:8px;} */ +.footer { + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); */ + + grid-column: 1 /span 2; +} diff --git a/www/html/_assets/themes/magazine/header.css b/www/html/_assets/themes/magazine/header.css new file mode 100644 index 0000000..991b9af --- /dev/null +++ b/www/html/_assets/themes/magazine/header.css @@ -0,0 +1,13 @@ +.main .header { + + grid-row:1; + grid-column: 1 / span 2; + display:grid; + grid-template-columns: 50px auto; gap:4px; + line-height: 1; + + +} +.main .header .title {font-size:28px; text-transform: capitalize; font-weight:bold} +.main .header .subtitle {font-size:14px} +.main .header img { width:44px; height:44px;} diff --git a/www/html/_assets/themes/magazine/layout.css b/www/html/_assets/themes/magazine/layout.css new file mode 100644 index 0000000..ad5c277 --- /dev/null +++ b/www/html/_assets/themes/magazine/layout.css @@ -0,0 +1,55 @@ +.main { + margin:10px; + padding:4px; + display:grid; + grid-template-columns: 50% 50% ; gap:4px; + grid-template-rows: 48px 64px auto 32px; + font-family: sans-serif; + font-weight: lighter; + font-size:18px; + line-height: 1.5; + justify-items: normal; + ; + height:96vh; +} +.main .content { + grid-row:3; + grid-column: 1 ; + text-wrap: wrap; + height:100%; + display:grid; + align-content: start; + + + +} + +.main .content #index { + text-align: left; + text-wrap: wrap; +} + +p { + margin-top:22px; +} +table { + width:99%; + border: 1px solid #CAD5E0; +} +table td {padding:4px; margin:4px;} +table thead { + + font-weight:bold; + background-color:#f3f3f3; +} + +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/html/_assets/themes/magazine/menu.css b/www/html/_assets/themes/magazine/menu.css new file mode 100644 index 0000000..21cfd84 --- /dev/null +++ b/www/html/_assets/themes/magazine/menu.css @@ -0,0 +1,110 @@ +.menu { + padding:8px; + border-bottom:3px dotted gray ; + + display:grid; + grid-column: 1 / span 2; + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + align-items: center; + +} +.menu .icon {padding:4px;} +.menu .icon img {width:30px; height:30px;} +.menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; + + + + + +} + +.menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} + +.menu .item:hover .sub-menu{ + + display:block; + height:auto; +} + +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/html/_assets/themes/magazine/pane.css b/www/html/_assets/themes/magazine/pane.css new file mode 100644 index 0000000..4fb956f --- /dev/null +++ b/www/html/_assets/themes/magazine/pane.css @@ -0,0 +1,14 @@ +.main .pane { + border-left:3px dotted gray; + grid-column: 2; + font-family: sans-serif; + padding-left: 10px; + + +} +.pane iframe { + border:1px solid transparent; + width:99%; + height:100%; + +} \ No newline at end of file diff --git a/www/html/_assets/themes/oss/borders.css b/www/html/_assets/themes/oss/borders.css new file mode 100644 index 0000000..6f9a192 --- /dev/null +++ b/www/html/_assets/themes/oss/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:1px solid #CAD5E0; + +} + +.border-left{ + border-left:1px solid #CAD5E0; +} + + +.border-bottom { border-bottom:1px solid #CAD5E0} +.border-top { border-top:1px solid #CAD5E0} + diff --git a/www/html/_assets/themes/oss/footer.css b/www/html/_assets/themes/oss/footer.css new file mode 100644 index 0000000..e1acfb5 --- /dev/null +++ b/www/html/_assets/themes/oss/footer.css @@ -0,0 +1,21 @@ +/** +* This file styles the footer of the page +*/ + +.footer { + grid-row:5; + margin-top:10px; + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); + + +} diff --git a/www/html/_assets/themes/oss/header.css b/www/html/_assets/themes/oss/header.css new file mode 100644 index 0000000..c7ee323 --- /dev/null +++ b/www/html/_assets/themes/oss/header.css @@ -0,0 +1,7 @@ +.main .header {display:grid; grid-template-columns:64px auto; gap:4px; width:100%; align-items:center;} +.main .header .icon {width:64px; height:64px;} +.main .header .icon img {width:64px; height:64px;} + +.main .header .title { font-size:32px; text-transform: uppercase; font-weight:bold} +.main .header .subtitle {font-style:italic;font-size:14px; color:gray; text-transform: capitalize;} + diff --git a/www/html/_assets/themes/oss/layout.css b/www/html/_assets/themes/oss/layout.css new file mode 100644 index 0000000..08c816e --- /dev/null +++ b/www/html/_assets/themes/oss/layout.css @@ -0,0 +1,50 @@ +/** +* This file implements theme Open Source Software, the expectation is just a pager that presents a tool/software +*/ +body, ul, p, select { + font-size: 16px; + font-weight:lighter; + font-family:sans-serif; + line-height:1.5; + +} +.main { + display:grid; + grid-template-columns: 100%;; + margin:1%; + margin-left:10%; + margin-right:10%; + gap:4px; + + width:80%; +} +.main .content{ + + grid-row:4; + align-self:center; + height:100%; + width:100%; +} + +.main .content .banner { + background-repeat: no-repeat; + background-size: cover; + background-position: center; + height:200px; + align-items: center; + align-content: center; + display: grid; + +} + +/* .main .pane {border-left:1px solid #CAD5E0; height:100%; padding:8px;} */ +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/html/_assets/themes/oss/menu.css b/www/html/_assets/themes/oss/menu.css new file mode 100644 index 0000000..a34f727 --- /dev/null +++ b/www/html/_assets/themes/oss/menu.css @@ -0,0 +1,82 @@ + +.menu .icon {padding:4px; align-items:center; display:grid;} +.menu .icon img {width:30px; height:30px;} + +.main .menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} +.main .menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; +} + +.main .menu .item:hover .sub-menu{ + + display:block; + height:auto; +} + +.main .menu { + padding:8px; + grid-row:2; + width:100%; + display:none; + + /* grid-row:2; grid-column:1 ; */ + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + border:0; height:48px; padding:0px; + display:grid; grid-template:64px repeat(6,1fr); gap:4px; + /* background-color: #f3f3f3; */ + align-items: center; +} +.main .menu .icon .button { + border:1px solid #CAD5E0; border-radius:8px; padding:2px; + ; +} +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/html/_assets/themes/oss/pane.css b/www/html/_assets/themes/oss/pane.css new file mode 100644 index 0000000..3be2b06 --- /dev/null +++ b/www/html/_assets/themes/oss/pane.css @@ -0,0 +1 @@ +.main .pane {display:block} \ No newline at end of file diff --git a/www/html/_assets/themes/oss/responsive.css b/www/html/_assets/themes/oss/responsive.css new file mode 100644 index 0000000..cc43868 --- /dev/null +++ b/www/html/_assets/themes/oss/responsive.css @@ -0,0 +1,3 @@ +@media (max-width: 480px) { + +} \ No newline at end of file diff --git a/www/html/_assets/themes/resume/borders.css b/www/html/_assets/themes/resume/borders.css new file mode 100644 index 0000000..6f9a192 --- /dev/null +++ b/www/html/_assets/themes/resume/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:1px solid #CAD5E0; + +} + +.border-left{ + border-left:1px solid #CAD5E0; +} + + +.border-bottom { border-bottom:1px solid #CAD5E0} +.border-top { border-top:1px solid #CAD5E0} + diff --git a/www/html/_assets/themes/resume/footer.css b/www/html/_assets/themes/resume/footer.css new file mode 100644 index 0000000..8086c04 --- /dev/null +++ b/www/html/_assets/themes/resume/footer.css @@ -0,0 +1,19 @@ +/** +* This file styles the footer of the page +*/ + +.footer { + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); */ + + grid-column: 1 /span 2; +} diff --git a/www/html/_assets/themes/resume/header.css b/www/html/_assets/themes/resume/header.css new file mode 100644 index 0000000..a64ce8b --- /dev/null +++ b/www/html/_assets/themes/resume/header.css @@ -0,0 +1,3 @@ +.main .header { display:grid; grid-template-columns:64px auto; gap:4px} +.main .header .title {font-size:28px; font-weight:bold} +.main .header img {width:55px; height:55px;} diff --git a/www/html/_assets/themes/resume/layout.css b/www/html/_assets/themes/resume/layout.css new file mode 100644 index 0000000..0e48ca3 --- /dev/null +++ b/www/html/_assets/themes/resume/layout.css @@ -0,0 +1,22 @@ + + +.main { + height:98vh; display:grid; grid-template-columns:70% auto; gap:4px; + grid-template-rows:70px 40px auto 32px; + padding-left:2%; padding-right:2%; + line-height: 1.5; font-size:16px; font-family: sans-serif; font-weight:lighter; +} +.main .content{ + align-self:center; +} +.main .pane {border-left:1px solid #CAD5E0; height:100%; padding:8px;} +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/html/_assets/themes/resume/menu.css b/www/html/_assets/themes/resume/menu.css new file mode 100644 index 0000000..3080a4e --- /dev/null +++ b/www/html/_assets/themes/resume/menu.css @@ -0,0 +1,79 @@ +.menu { + padding:8px; + border:1px solid #CAD5E0 ; + + display:grid; + grid-column: 1 / span 2; + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + align-items: center; + +} +.menu .icon {padding:4px;} +.menu .icon img {width:30px; height:30px;} +.menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; + + + + + +} + +.menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} + +.menu .item:hover .sub-menu{ + + display:block; + height:auto; +} + +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/html/_assets/themes/resume/pane.css b/www/html/_assets/themes/resume/pane.css new file mode 100644 index 0000000..e69de29 diff --git a/www/html/_images/.xdp-.$uml-activity.drawio.bkp-B1N2v3 b/www/html/_images/.xdp-.$uml-activity.drawio.bkp-B1N2v3 new file mode 100644 index 0000000..5b00ef4 --- /dev/null +++ b/www/html/_images/.xdp-.$uml-activity.drawio.bkp-B1N2v3 @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/html/_images/banner.jpg b/www/html/_images/banner.jpg new file mode 100644 index 0000000..47cffbb Binary files /dev/null and b/www/html/_images/banner.jpg differ diff --git a/www/html/_images/database.png b/www/html/_images/database.png new file mode 100644 index 0000000..e42b8e9 Binary files /dev/null and b/www/html/_images/database.png differ diff --git a/www/html/_images/uml-activity.drawio b/www/html/_images/uml-activity.drawio new file mode 100644 index 0000000..4b2e382 --- /dev/null +++ b/www/html/_images/uml-activity.drawio @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/html/_images/uml-activity.png b/www/html/_images/uml-activity.png new file mode 100644 index 0000000..45fec09 Binary files /dev/null and b/www/html/_images/uml-activity.png differ diff --git a/www/html/_index.html b/www/html/_index.html new file mode 100644 index 0000000..39f3426 --- /dev/null +++ b/www/html/_index.html @@ -0,0 +1,134 @@ + + +
+ +
+
+
+
+

+

+
Thank you,
+
+

+
\ No newline at end of file diff --git a/www/html/_notes/documentation.html b/www/html/_notes/documentation.html new file mode 100644 index 0000000..ca30a3f --- /dev/null +++ b/www/html/_notes/documentation.html @@ -0,0 +1,14 @@ +
+ +

Documentation

+

+

The documentation is available within the codebase in a folder called notebooks. You will learn to
+ + Feel free to reachout to for questions, feature requests +
steve.l.nyemba@vumc.org or steve@the-phi.com +

+
\ No newline at end of file diff --git a/www/html/_notes/features.html b/www/html/_notes/features.html new file mode 100644 index 0000000..09bedfe --- /dev/null +++ b/www/html/_notes/features.html @@ -0,0 +1,47 @@ + +
+

Features

+

+

+

+

Supported Technologies

+
+
\ No newline at end of file diff --git a/www/html/_notes/install.html b/www/html/_notes/install.html new file mode 100644 index 0000000..3b68f48 --- /dev/null +++ b/www/html/_notes/install.html @@ -0,0 +1,39 @@ + +
+
Installation
+

+ The assumption here is the you are using virtual environment virtualenv along with pip. + There are various components that can be installed with data-transport. By default SQL support is always available +

+

+ You can specify any combination of nosql, cloud, warehouse, other or all, by default sql support is provided. +

+

+ pip install data-transport[nosql,cloud,warehouse,other]@git+https://dev.the-phi.com/git/data-transport/ce +
+

+ A command line interface (CLI) is installed and can be tested by running the following to see what +

+

+ $ transport --help
+
+
+ + +
+

+ + +
+ +
\ No newline at end of file diff --git a/www/html/_notes/intro.html b/www/html/_notes/intro.html new file mode 100644 index 0000000..462af66 --- /dev/null +++ b/www/html/_notes/intro.html @@ -0,0 +1,53 @@ + + + +
+
Quick Start
+ By default basic installation has + + + +
+ + diff --git a/www/html/_notes/plugins-intro.html b/www/html/_notes/plugins-intro.html new file mode 100644 index 0000000..90ff0ae --- /dev/null +++ b/www/html/_notes/plugins-intro.html @@ -0,0 +1 @@ + These are basic python functions with a single argument (data:pd.DataFrame). The functions can be used as a pipeline to be called in the context of pre/post processing. \ No newline at end of file diff --git a/www/html/_notes/product.html b/www/html/_notes/product.html new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/www/html/_notes/product.html @@ -0,0 +1 @@ + diff --git a/www/html/_notes/registry.html b/www/html/_notes/registry.html new file mode 100644 index 0000000..16b7cce --- /dev/null +++ b/www/html/_notes/registry.html @@ -0,0 +1,76 @@ + +
+
What is the registry
+

data-transport uses a registry to store database authentication information and referenced by a human readable label. +

+

+
Initialize Registry
+

+ The registry can be initialized through the command line (CLI) or in code. +
A folder will be created in your home folder $HOME/.data-transport/transport-registry.json +

+

+

+
+ Command line (CLI) +

+ +

+ # creates folders and files needed +
$ transport registry reset < your email > +
+ +

+ Create a file http-auth.json and it should contain the following +

+ {
"provider":"http", + + "url":"https://raw.githubusercontent.com/codeforamerica/ohana-api/master/data/sample-csv/addresses.csv" + +
} +
+

+ + Add the created file http-auth.json to the registry under the label address-db +
+ $ transport registry --add address-db http-auth.json +
+ +

+

+
+ +
+ In code +

+

+import transport +import io +import json +# +# transport.registry.exists() +_email = 'steve@the-phi.com' +transport.registry.init(_email) + +# +# Adding the entry to the registry now that is initialized +_authStr = {"provider":"http", +"url":"https://raw.githubusercontent.com/codeforamerica/ohana-api/master/data/sample-csv/addresses.csv" +} +file = io.StringIO(json.dumps(_authStr)) +transport.registry.set('address-db',file) +
+

+
+ + +
+

+
\ No newline at end of file diff --git a/www/html/_notes/run-etl.html b/www/html/_notes/run-etl.html new file mode 100644 index 0000000..2de09c3 --- /dev/null +++ b/www/html/_notes/run-etl.html @@ -0,0 +1,23 @@ + +
+

Run ETL (transport)

+

+ Simple ETL from the commandline (CLI), you can generate a sample ETL configuration, +

+ $ transport generate ./my-etl-config.json +
+ + + Perform the ETL Job given the configuration specifications +
+ $ transport apply ./my-etl-config.json +
+ +

+ +
+ + \ No newline at end of file diff --git a/www/html/_notes/source-code.html b/www/html/_notes/source-code.html new file mode 100644 index 0000000..ea95299 --- /dev/null +++ b/www/html/_notes/source-code.html @@ -0,0 +1,90 @@ + + + +
+ +
+
Collaborative development
+

+ 0. In this scenario we assume the registry has been initialized and that an entry has been added (CLI). +

+ # transport registry add --help +
$ transport registry add address-db http-auth.json +
+ + +

+The python code would look like the following : +
+import transport +
+#
+#   We are assuming here that the label books-db is an entry in the registry
+
+dbreader    = transport.get.reader(label='address-db')    # No database credentials
+_df         = dbreader.read(sql="SELECT * FROM books where postal_code like '946%' ")
+print (_df.head())
+
+ +
+

+1. Alternatively it is possible to directly use the authentication file dubbed "auth-file". + +

+ import transport +
+        #
+        #   We are assuming here that the label books-db is an entry in the registry
+
+        dbreader    = transport.get.reader(auth_file='/home/me/http-auth.json')    # No database credentials
+        _df         = dbreader.read(sql="SELECT * FROM books where postal_code like '946%' ")
+        print (_df.head())
+        
+ +
+

+
+
+
+
Non-collaborative development
+

+ In this scenario, we are using connectivity parameters in the code. We do NOT recommend this if the code will be used/shared. + +

+
+ import transport +
+    #
+    #   In this scenario we are loading an SQLite3+ database
+    url= "https://raw.githubusercontent.com/codeforamerica/ohana-api/master/data/sample-csv/addresses.csv"
+    _args = {"provider":"http","database"}
+    dbreader    = transport.get.reader(**_args)    # No database credentials
+    _df         = dbreader.read(sql="SELECT * FROM books where postal_code like '946%' ")
+    print (_df.head())
+    
+ +
+ +

+

Learn more
+ It is possible to initialize the registry; run ETL from your code as well as from the command line (CLI). We compiled this in notebooks available in our code repository +

+
+ +
\ No newline at end of file diff --git a/www/html/_notes/supported.html b/www/html/_notes/supported.html new file mode 100644 index 0000000..450ad57 --- /dev/null +++ b/www/html/_notes/supported.html @@ -0,0 +1,49 @@ + + +
+

+

+

Supported Databases

+
+
+
+
+
+ +
+

+
+ + diff --git a/www/html/_plugins/info.py b/www/html/_plugins/info.py new file mode 100644 index 0000000..dfa52e7 --- /dev/null +++ b/www/html/_plugins/info.py @@ -0,0 +1,49 @@ +import transport +import info +from multiprocessing import Process +import pandas as pd +from io import StringIO +import requests +import cms +import os + +@cms.Plugin(mimetype='application/json') +def about (**_args): + return {'license':info.__license__,'author':transport.__app_name__, 'version':transport.__version__, 'supported':transport.supported().to_html(index=False,col_space=0,justify='left').replace("\n","").replace('border="1"','')} +# +# loading notebooks from github +@cms.Plugin(mimetype='application/json') +def _data (**_args) : + _csv = f"""provider,label,doc,url,notebook +etl,ETL,"Built-in ETL CLI program",https://healthcareio.the-phi.com/data-transport,etl.ipynb +mongodb,MongoDB,"mongodb is a NoSQL database developed by mongodb",https://mongodb.com,mongodb.ipynb +mysql,MySQL,"mysql is a relational database developed and maintained by Oracle",https://www.mysql.com,mysql.ipynb +postgresql,PostgreSQL,"postgresql is an object - relational database developed and maintained by PostgreSQL Global Development Group",https://www.postgresql.com,postgresql.ipynb +mssqlserver,MS SQL Server,"SQL Server a relational database server developed by Microsoft",https://www.microsoft.com,mssqlserver.ipynb +sqlite,sqlite,"sqlite is portable relational database",https://www.sqlite.com,sqlite.ipynb +s3,AWS S3,"AWS Simple Storage Service",https://www.aws.amazon.com/s3,s3.ipynb +""" + _df = pd.read_csv(StringIO(_csv)) + return _df.drop_duplicates().to_dict(orient='records') +# MEM_PRODUCT_FILE = StringIO(f"""_,community,enterprise +# NoSQL,1,1 +# RDBMS/SQL,1,1 +# Cloud databases,1,1 +# Other (MQTT; Files; https),1,1 +# Warehouse,1,1 +# """) +@cms.Plugin(mimetype="text/html") +def product(**_args): + _config = _args['config'] + path = os.sep.join([_config['layout']['location'],_config['layout']['root'],'_assets','data','products.csv']) + _df = pd.read_csv(path) + + return _df.to_html(index=0).replace(">",">").replace("<","<").replace("no",'').replace("yes",'') + +@cms.Plugin(mimetype="application/json") +def registry (**_args): + if not transport.registry.isloaded() : + transport.registry.load() + _repo = transport.registry.DATA + _data = [{'label':key,'provider':_repo[key]['provider'],'plugins':([] if 'plugins' not in _repo[key] else _repo[key]['plugins'])} for key in _repo if 'provider' in _repo[key]] + return _data \ No newline at end of file diff --git a/www/html/about/design-and-credit.md b/www/html/about/design-and-credit.md new file mode 100644 index 0000000..ee58d49 --- /dev/null +++ b/www/html/about/design-and-credit.md @@ -0,0 +1,13 @@ +### What is data-transport + +The **data-transport** and is intended to read, write to any supported databases transparently. The framework lowers the barrier to adoption by using **Python Pandas**, **SQLAlchemy** as foundational components to its architecture. The architecture allows + +1. seamless reads and writes regardless of the database vendor (SQL, NoSQL, Cloud ...) +2. separates reads from writes to avoid accidental tampering with data +3. works with pandas for reads and writes +4. support for plugin (functions) to apply against the data as pre/post processing +5. supports a lightweight Extract Transform tool (ETL) as a command line interface (CLI) + +### Credits + +**Data-transport** was designed and developed at the [Health Information Privacy Laboratory](https://hiplab.mc.vanderbilt.edu) at Vanderbilt University Medical Center with the input of all co-workers, interns post-doctoral fellows diff --git a/www/html/about/feedback.html b/www/html/about/feedback.html new file mode 100644 index 0000000..e3c2d28 --- /dev/null +++ b/www/html/about/feedback.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/html/about/license.html b/www/html/about/license.html new file mode 100644 index 0000000..5bf2030 --- /dev/null +++ b/www/html/about/license.html @@ -0,0 +1,37 @@ + + + + \ No newline at end of file diff --git a/www/html/contact.html b/www/html/contact.html new file mode 100644 index 0000000..bd0fb2e --- /dev/null +++ b/www/html/contact.html @@ -0,0 +1,8 @@ +
Thank you,
+
For considering {{layout.header.title}}, +Please feel free to direct bugs/inquiries to :
+ \ No newline at end of file diff --git a/www/html/docs/html/bigquery.html b/www/html/docs/html/bigquery.html new file mode 100644 index 0000000..96eaeb0 --- /dev/null +++ b/www/html/docs/html/bigquery.html @@ -0,0 +1,7672 @@ + + + + + +bigquery + + + + + + + + + + + + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ +
+
+ + diff --git a/www/html/docs/html/etl.html b/www/html/docs/html/etl.html new file mode 100644 index 0000000..3b810ec --- /dev/null +++ b/www/html/docs/html/etl.html @@ -0,0 +1,7679 @@ + + + + + +etl + + + + + + + + + + + + +
+
+ +
+ + +
+
+ +
+ +
+
+ + diff --git a/www/html/docs/html/mongodb.html b/www/html/docs/html/mongodb.html new file mode 100644 index 0000000..89ac6c2 --- /dev/null +++ b/www/html/docs/html/mongodb.html @@ -0,0 +1,7651 @@ + + + + + +mongodb + + + + + + + + + + + + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ +
+
+ + diff --git a/www/html/docs/html/mssqlserver.html b/www/html/docs/html/mssqlserver.html new file mode 100644 index 0000000..bfcea1f --- /dev/null +++ b/www/html/docs/html/mssqlserver.html @@ -0,0 +1,7668 @@ + + + + + +mssqlserver + + + + + + + + + + + + +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ + +
+ +
+
+ + diff --git a/www/html/docs/html/mysql.html b/www/html/docs/html/mysql.html new file mode 100644 index 0000000..f4394e5 --- /dev/null +++ b/www/html/docs/html/mysql.html @@ -0,0 +1,7691 @@ + + + + + +mysql + + + + + + + + + + + + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+ +
+
+ + diff --git a/www/html/docs/html/postgresql.html b/www/html/docs/html/postgresql.html new file mode 100644 index 0000000..654d733 --- /dev/null +++ b/www/html/docs/html/postgresql.html @@ -0,0 +1,7691 @@ + + + + + +postgresql + + + + + + + + + + + + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+ +
+
+ + diff --git a/www/html/docs/html/s3.html b/www/html/docs/html/s3.html new file mode 100644 index 0000000..dd57795 --- /dev/null +++ b/www/html/docs/html/s3.html @@ -0,0 +1,7654 @@ + + + + + +s3 + + + + + + + + + + + + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ +
+
+ + diff --git a/www/html/docs/html/sqlite.html b/www/html/docs/html/sqlite.html new file mode 100644 index 0000000..89dfac9 --- /dev/null +++ b/www/html/docs/html/sqlite.html @@ -0,0 +1,7669 @@ + + + + + +sqlite + + + + + + + + + + + + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ +
+ +
+
+ + diff --git a/www/html/docs/notebooks.html b/www/html/docs/notebooks.html new file mode 100644 index 0000000..49f869b --- /dev/null +++ b/www/html/docs/notebooks.html @@ -0,0 +1,199 @@ + + +
+ +
+ + +

+
+ Found +
+
+ + +
+
+
    + Preview notebooks with database providers/vendors +
    The notebooks show how to use data-transport as a library +
    +
    +
+
+
 
+

+

Generated: auth-file

+ +
+ + +

+

+
+
+
+
+
+
Jupyter Notebook preview
+ +
+ + +
+

+
+
\ No newline at end of file diff --git a/www/html/docs/plugins.html b/www/html/docs/plugins.html new file mode 100644 index 0000000..f239221 --- /dev/null +++ b/www/html/docs/plugins.html @@ -0,0 +1,166 @@ + + +
+
+
+

Plugins: Usage & Development

+

+

+
+

+

+

Plugins: Registry

+ + The plugins registry is a registry of plugins intended to be used in pre/post processing. This feature comes in handy : +
    +
    During ETL: Cleanup data, adding columns enforcing data-typing, removing/encrypting PHI ...
    +
    In a collaborative environment (Jupyter-x; Zeppelin; AWS Service Workbench)
    +
+ + +

+

+

Plugins: Architecture & Design

+ Plugins are designed around plugin architecture using Iterator design-pattern. In that respect and function as a pipeline i.e executed sequentially in the order in which they are expressed in the parameter. Effectively the output of one function will be the input to the next. +

+

+ +
Data Transport UML Plugin Component View
+
+ +

+

+
+
+

Quick Start

+
+ + + + + + + + + +
+ +
+

+ +

+ + +
+
    +
    The code here shows a function that will be registered as "autoincrement".
    +
    The data, will always be a pandas.DataFrame
    +
    For the sake of this example the file will be my-plugin.py
    +
+ +
+
+ import transport +
import numpy as np
+
+
_index = 0 +
@transport.Plugin(name='autoincrement')
+
def _incr (_data):
+
    +
    global _index
    +
    _data['_id'] = _index + np.arange(_data.shape[0])
    +
    _index = _data.shape[0]
    +
    return _data
    +
+
+
+

+
+ +
+

+

+ +
+ data-transport comes with a built-in command line interface (CLI). It allows plugins to be registered and reused. +
    +
    Registered functions are stored in $HOME/.data-transport/plugins/code
    +
    Any updates to my-plugin.py will require re-registering the file
    +
    Additional plugin registry functions (list, test) are available
    + +
+
+
+
+ $ transport plugin-add demo ./my-plugin.py +
+

+ The following command allows data-transport to determine what is knows about the function i.e real name and name to be used in code. +

+ $ transport plugin-test demo.autoincrement +
+

+
+
+

+
+ +
+

+ Once registered, the plugins are ready for use within code or configuration file (auth-file). +

import transport +
from transport import providers
+ + _args = { +
"provider":providers.HTTP,
+
"url":"https://raw.githubusercontent.com/codeforamerica/ohana-api/master/data/sample-csv/addresses.csv",
+
"plugins":["demo@autoincrement"]
+ } + +
reader = transport.get.reader(**_args)
+
_data = reader.read()
+
print (_data.head())
+ +
+

+
+
+
+
\ No newline at end of file diff --git a/www/html/docs/quick_start.html b/www/html/docs/quick_start.html new file mode 100644 index 0000000..75e29f7 --- /dev/null +++ b/www/html/docs/quick_start.html @@ -0,0 +1,114 @@ + + +
+
+ +
+ +
+
0. Installation
+
    + Install using pip or from code and test installation from https://dev.the-phi.com/git/qcms/cms +
+
+
+
1. Initialize registry
+
    + Keep database authentication parameters out of sight, in a collaborative environment +
+
+ +
+
2. Import into Code
+
    + How to use {{layout.header.title}} in python source code (notebooks, or files) +
+
+ +
+
3. Source code
+
    + {{layout.header.title}} is available uner MIT license and available on github. Contribute, share at will ;-) +
+
+
+ +
+
+ +
+
\ No newline at end of file diff --git a/www/html/docs/source-code.html b/www/html/docs/source-code.html new file mode 100644 index 0000000..e69de29 diff --git a/www/html/docs/transport.html b/www/html/docs/transport.html new file mode 100644 index 0000000..a205659 --- /dev/null +++ b/www/html/docs/transport.html @@ -0,0 +1,186 @@ + + +
+
+

+

ETL: Introduction

+ Extract Load & Transform (ETL) consists in copying data from one database to one or many others. This can be done in two different ways: + + The ETL process will take advantage of registries for plugins and labeled database connectivity to perform pre/post processing tasks. + +

+
+

+

ETL: Command Line Interface

+

+ The configuration file needed to run the ETL is a JSON formatted file where each entry contains: +

+ +
+ The CLI (transport), is capable of generating a demo ETL : +
    +
    with source: reads CSV data from github
    +
    and target: writes the data to CSV & SQLite3 database
    +
+
+ $ transport generate ./demo-etl.json +
+
+

+

+
+
+
+
+ Data-transport UML Extract-Load-Transform (ETL) Workflow +
+
+
+ +
+
+
+ + + + + + + + + + +
+
+

+ +

+
+

+ The command-line interface should be instructed to run the ETL by calling the apply function. +

+

+

+ $ transport apply ./demo-etl.json +
+

+

+ Additional parameters can be invoked by providing the --help switch +

+ +

+

+ $ transport apply --help +
+

+ +
+
+
+ The following examples shows simple configuration files that do NOT require any database to be installed. Feel free to change and edit at your own discression. +
+

+

Example # 1: Basic ETL

+
+ + + + +
+ +
+
+
+

+ data-transport comes with a CLI integrated that will +

    +
    generate an EL configuration file
    +
    + $ transport generate ./demo-etl.json +
    + +
+
NOTE:The configuration file supports labels and/or plugins, these would have to be done manually
+

+
+
+

Copy the content and save it to a file "demo-etl.json"

+
+ +
[{
+"source": {
+    "provider": "http", 
+    "url": "https://github.com/codeforamerica/ohana-api/blob/master/data/sample-csv/addresses.csv"
+}, 
+"target": [
+    {"provider": "files", "path": "addresses.csv", "delimiter": ","}, 
+    {"provider": "sqlite3", "database": "sample.db3", "table": "addresses"}
+]}]
+ +
+
+ +
+
+ +

+
+ +

+

Example # 2: ETL With Plugins

+

Copy the content and save it to a file "demo-etl.json"

+
+ +
[{
+              "source": {
+                  "provider": "http", 
+                  "plugins":["demo@autoincrement"],
+                  "url": "https://github.com/codeforamerica/ohana-api/blob/master/data/sample-csv/addresses.csv"
+              }, 
+              "target": [
+                  {"provider": "files", "path": "addresses.csv", "delimiter": ","}, 
+                  {"provider": "sqlite3", "database": "sample.db3", "table": "addresses"}
+              ]}]
+ +
+ +

+ +
+
+

+ +
+
\ No newline at end of file diff --git a/www/html/index.html b/www/html/index.html new file mode 100644 index 0000000..d2acc3e --- /dev/null +++ b/www/html/index.html @@ -0,0 +1,194 @@ + + +
+

+ +

+
+
+
+
Read, Write & Stream Data
+
Anywhere
+
+ version + +
+
+ + +
+
+
+
Open-Source
+

+

Built with python, easy install and available under MIT license on github
+

+
+
+
Multiple Databases
+

+

Seamless & consistent access to SQL, NoSQL, Cloud & Warehouse databases
+

+
+
+
Secure Collaboration
+

+

+ Uses a registry to prevent sensitive data connectivity to be in a notebook (Zeppelin, Jypterlab ...) +
+

+
+
+
Pipelines
+

+

+ Apply user-defined functions across database technologies for consistent results +
+

+
+
+
+
+
+
+
+
+
+
+
+
+ info@the-phi.com
+
Contact US
+
+
+
+
+ +
+
+ + + + +

+ + +
\ No newline at end of file diff --git a/www/html/setup/configurator.html b/www/html/setup/configurator.html new file mode 100644 index 0000000..d6ddca5 --- /dev/null +++ b/www/html/setup/configurator.html @@ -0,0 +1,83 @@ + + +
+
+ + + + + +
+ +
+
+
+

Source: Database Technology

+
Select a database technology as a source
+ +
+
+
+
+
\ No newline at end of file diff --git a/www/html/wizard/wizard.html b/www/html/wizard/wizard.html new file mode 100644 index 0000000..c30e39d --- /dev/null +++ b/www/html/wizard/wizard.html @@ -0,0 +1,199 @@ + + + +
+
+
Wizard: auth file generator
+

+

This wizard generates an auth-file. It is a template file to be used to setup a data-transport database connectivity to help with best practice when it comes to sensitive information in code. +
    + search for the database provider / vendors +
    click on the vendor and copy the generated code to a file + +
+
+

+

+

+
+ +
+
+ +
+
+
+
+ 0 found +
+
+ + +
+

+

+

+ +
+
+
 
+
Note : +
Copy the code above to the auth-file and fill with appropriate values +
Attributes with zero i.e 0 are optional +
+
+

+

+

+

+ +
+
+
Prerequisites
+ +
Thing to know
+ +
+