6 Commits

Author SHA1 Message Date
Fonata
f2b0aecd12 docs: remove Travis from README; make running act locally easier 2021-11-07 13:36:38 +01:00
Fonata
5d4643b201 Allow _guess_delimiter to work with a single row of data
Fix #206
2021-11-07 13:36:38 +01:00
d5606f8b2a ci(travis): remove .travis.yml config file
If we're switching to GitHub Actions, there's no need to keep the
Travis-CI config file around.
2021-11-07 13:36:38 +01:00
8cebcbd9bb ci(github): add GitHub Actions CI workflow
Can be tested locally via the local-ci make target, which requires
Docker and act (https://github.com/nektos/act).
2021-11-07 13:36:38 +01:00
518f5081fb chore: improve editorconfig for YAML and Makefile 2021-11-07 13:36:38 +01:00
Fonata
a28fc6ab0a refactor: simplify code without changing behavior 2021-11-07 13:36:38 +01:00
8 changed files with 78 additions and 31 deletions

View File

@@ -14,5 +14,8 @@ insert_final_newline = true
[composer.json] [composer.json]
indent_size = 4 indent_size = 4
[.travis.yml] [Makefile]
indent_style = tab
[*.yml,*.yaml]
indent_size = 2 indent_size = 2

38
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,38 @@
---
name: CI
on:
push:
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php_version:
- "7.4"
- "7.3"
- "7.2"
- "7.1"
steps:
- uses: actions/checkout@v2
- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php_version }}
env:
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Get composer cache directory
id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies
uses: actions/cache@v2
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-
- name: Install dependencies
run: composer update
- name: Validate dependencies
run: composer validate
- name: Run tests
run: vendor/bin/phpunit --configuration tests/phpunit.xml

View File

@@ -1,24 +0,0 @@
dist: trusty
language: php
dist: trusty
php:
- '7.4'
- '7.3'
- '7.2'
- '7.1'
before_install:
- composer update
script:
- composer validate
- vendor/bin/phpunit --version
- vendor/bin/phpunit --configuration tests/phpunit.xml
notifications:
email:
recipients:
- will.knauss@gmail.com
on_success: never
on_failure: always

View File

@@ -11,5 +11,21 @@ phpunit-dep:
exit 1 \ exit 1 \
) )
# Requires:
# - Docker: https://docker.com
# - act: https://github.com/nektos/act
local-ci:
ifeq (, $(shell which act))
define ACT_ERROR
Consider running the following to install 'act':
curl https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash
The dependency 'act' was not found
endef
$(error ${ACT_ERROR})
endif
act -P ubuntu-latest=shivammathur/node:latest -W .github/workflows/ci.yml
.SILENT: .SILENT:
.PHONY: test phpunit-dep .PHONY: test phpunit-dep local-ci

View File

@@ -165,8 +165,12 @@ composer install
composer run test composer run test
```` ````
When pushing code to GitHub, tests will be executed using Travis CI. The relevant configuration is in the When pushing code to GitHub, tests will be executed using GitHub Actions. The relevant configuration is in the
file `.travis.yml`. file `.github/workflows/ci.yml`. To run the `test` action locally, you can execute the following command:
````bash
make local-ci
````
## Security ## Security

View File

@@ -1248,7 +1248,7 @@ class Csv {
$first = null; $first = null;
$equal = null; $equal = null;
$almost = false; $almost = false;
foreach ($array as $key => $value) { foreach ($array as $value) {
if ($first == null) { if ($first == null) {
$first = $value; $first = $value;
} elseif ($value == $first && $equal !== false) { } elseif ($value == $first && $equal !== false) {
@@ -1261,7 +1261,7 @@ class Csv {
} }
} }
if ($equal) { if ($equal || $depth === 1) {
$match = $almost ? 2 : 1; $match = $almost ? 2 : 1;
$pref = strpos($preferred, $char); $pref = strpos($preferred, $char);
$pref = ($pref !== false) ? str_pad($pref, 3, '0', STR_PAD_LEFT) : '999'; $pref = ($pref !== false) ? str_pad($pref, 3, '0', STR_PAD_LEFT) : '999';
@@ -1405,7 +1405,7 @@ class Csv {
$is_newline = ($ch == "\n" && $pch != "\r") || $ch == "\r"; $is_newline = ($ch == "\n" && $pch != "\r") || $ch == "\r";
if ($ch == $enclosure) { if ($ch == $enclosure) {
if (!$enclosed || $nch != $enclosure) { if (!$enclosed || $nch != $enclosure) {
$enclosed = $enclosed ? false : true; $enclosed = !$enclosed;
} elseif ($enclosed) { } elseif ($enclosed) {
$i++; $i++;
} }

View File

@@ -0,0 +1 @@
C1,C2,C3
1 C1 C2 C3

View File

@@ -121,6 +121,15 @@ class ParseTest extends TestCase {
self::assertEquals($expected, $this->csv->data); self::assertEquals($expected, $this->csv->data);
} }
public function testSingleRow() {
$this->csv->auto(__DIR__ . '/../example_files/single_row.csv');
self::assertEquals([], $this->csv->data, 'Single row is detected as header');
$this->csv->heading = false;
$this->csv->auto(__DIR__ . '/../example_files/single_row.csv');
$expected = [['C1', 'C2', 'C3']];
self::assertEquals($expected, $this->csv->data);
}
public function testMatomoData() { public function testMatomoData() {
// Matomo (Piwik) export cannot be read with // Matomo (Piwik) export cannot be read with
$this->csv->use_mb_convert_encoding = true; $this->csv->use_mb_convert_encoding = true;