keboola/docker-demo-app

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# Keboola Docker Demo Application

[![Build Status](https://travis-ci.org/keboola/docker-demo-app.svg?branch=master)](https://travis-ci.org/keboola/docker-demo-app) [![Code Climate](https://codeclimate.com/github/keboola/docker-demo-app/badges/gpa.svg)](https://codeclimate.com/github/keboola/docker-demo-app) [![Test Coverage](https://codeclimate.com/github/keboola/docker-demo-app/badges/coverage.svg)](https://codeclimate.com/github/keboola/docker-demo-app/coverage)

This is a working example of an application which is encapsulated in a Docker image and is integrated with KBC. Application functionality is simple, it splits long text columns from a single table into multiple rows and adds index number into a new column and writes the result into `/data/out/tables/sliced.csv` file.

## Development
 
Clone this repository and init the workspace with following command:

```
git clone https://github.com/keboola/docker-demo-app
cd docker-demo-app
docker-compose build
docker-compose run --rm dev composer install
```

Run the test suite using this command:

```
docker-compose run --rm tests
```

### Composer

```
docker-compose run dev composer install
```

### Code Style Checker
```
docker-compose run --rm dev /code/vendor/bin/phpcs --standard=psr2 -n --ignore=vendor --extensions=php .
```

### PHP Static Code Analysis

```
docker-compose run --rm dev /code/vendor/bin/phpstan analyse --level=7 ./src ./tests
```

### Running the container

```
docker-compose run --rm --volume /my-data-dir:/data docker-demo-app
```

Note: `--volume` needs to be adjusted accordingly and has to lead to a [`data` directory](http://developers.keboola.com/extend/common-interface/).

### Debugging (using Xdebug and PHPStorm)

#### Environment variables

Create a `.env` file with these variable and replace required values

```
XDEBUG_CONFIG=remote_host=docker.for.mac.localhost remote_port=9000
PHP_IDE_CONFIG=serverName=docker-demo-app
```
##### remote_host

 - The default value `docker.for.mac.localhost` can be used with Docker for Mac 17.06 and newer
 - Older Docker for Mac versions can use `cat ~/Library/Containers/com.docker.docker/Data/database/com.docker.driver.amd64-linux/slirp/host`
 - For dlite use `ifconfig` and find the network interface linked to your dlite install (eg. `bridge100`), default is `192.168.64.1` 

#### PHPStorm

In **Preferences > Languages & Framewoks > PHP** add a new **CLI Interpreter** with the **Docker Compose** option.

![New CLI Interpreter](./docs/phpstorm-cli-interpreter.png)

In **Preferences > Languages & Framewoks > PHP > Debug** check the following settings in **Xdebug** part.

![Debug](./docs/phpstorm-debug.png)

In **Preferences > Languages & Framewoks > PHP > Servers** add a new server that matches the `serverName` name and add a mapping from the project root to `/code`.

![Mapping](./docs/phpstorm-mapping.png)

#### Running

```
docker-compose run --rm --volume /my-data-dir:/data xdebug php run.php
```

## Configuration

The data folder must contain 

 - JSON configuration stored in `data/config.json`
 - CSV file in `data/in/tables` 

### Sample configuration
Mapped to `/data/config.json` 

```json
{
  "storage": {
    "input": {
      "tables": [
        {
          "source": "in.c-main.yourtable",
          "destination": "source.csv"
        }
      ]
    },
    "output": {
      "tables": [
        {
          "source": "sliced.csv",
          "destination": "out.c-main.yourtable"
        }
      ]
    }
  },
  "parameters": {
    "primary_key_column": "id",
    "data_column": "text",
    "string_length": 255
  }
}
```

 - `storage.input.tables[0].destination` (required): source table file
 - `parameters.primary_key_column` (required): primary key column of the source table
 - `parameters.data_column` (required): column to be split
 - `parameters.string_length` (required): split length

Note: attributes `storage.input.tables[0].source` and `storage.output` are not required for this script, but required for full functionality within Keboola Docker Bundle.


### Data sample

#### Source
Mapped to `/data/in/tables/source.csv`

```
id,text,some_other_column
1,"Short text","Whatever"
2,"Long text Long text Long text","Something else"
```

#### Destination
Created in `/data/out/tables/sliced.csv`


```
id,text,row_number
1,"Short text",0
2,"Long text Long ",0
2,"text Long Text",1

```

## License

MIT licensed, see [LICENSE](./LICENSE) file.