Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ jobs:
extensions: iconv, imagick, gd
coverage: xdebug

- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: 24

- name: Get composer cache directory
id: composer-cache
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
Expand All @@ -47,9 +52,12 @@ jobs:
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
restore-keys: ${{ runner.os }}-composer-

- name: Install dependencies
- name: Install PHP dependencies
run: composer install --no-progress --prefer-dist --optimize-autoloader

- name: Install Node dependencies
run: npm install

- name: Test with phpunit
run: vendor/bin/phpunit --coverage-clover clover.xml

Expand All @@ -58,7 +66,7 @@ jobs:
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./clover.xml

release:
needs: [lint, test]
runs-on: ubuntu-latest
Expand Down
12 changes: 10 additions & 2 deletions .github/workflows/pull-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
strategy:
matrix:
operating-system: [ubuntu-latest]
php-versions: ['8.1', '8.2', '8.3']
php-versions: ['8.1', '8.2', '8.3', '8.4']
runs-on: ${{ matrix.operating-system }}
steps:
- uses: actions/checkout@v4
Expand All @@ -36,6 +36,11 @@ jobs:
extensions: iconv, imagick
coverage: xdebug

- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: 24

- name: Get composer cache directory
id: composer-cache
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
Expand All @@ -47,9 +52,12 @@ jobs:
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
restore-keys: ${{ runner.os }}-composer-

- name: Install dependencies
- name: Install PHP dependencies
run: composer install --no-progress --prefer-dist --optimize-autoloader

- name: Install Node dependencies
run: npm install

- name: Test with phpunit
run: vendor/bin/phpunit --coverage-clover clover.xml

Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/composer.lock
/vendor
/node_modules
/.phpunit.result.cache
/.phpunit.cache
8 changes: 0 additions & 8 deletions Dockerfile

This file was deleted.

2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Copyright (c) 2017, Ben Scholzen 'DASPRiD'
Copyright (c) 2017-present, Ben Scholzen 'DASPRiD'
All rights reserved.

Redistribution and use in source and binary forms, with or without
Expand Down
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,8 @@ $renderer = new GDLibRenderer(400);
$writer = new Writer($renderer);
$writer->writeFile('Hello World!', 'qrcode.png');
```

## Development

To run unit tests, you need to have [Node.js](https://nodejs.org/en) and the pixelmatch library installed. Running
`npm install` will install this for you.
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
"require-dev": {
"phpunit/phpunit": "^10.5.11 || ^11.0.4",
"spatie/phpunit-snapshot-assertions": "^5.1.5",
"spatie/pixelmatch-php": "^1.2.0",
"squizlabs/php_codesniffer": "^3.9",
"phly/keep-a-changelog": "^2.12"
},
Expand Down
34 changes: 34 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"name": "baconqrcode",
"private": true,
"dependencies": {
"pixelmatch": "^7.1.0"
}
}
12 changes: 2 additions & 10 deletions test/Integration/GDLibRenderingTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,14 @@
namespace BaconQrCodeTest\Integration;

use BaconQrCode\Exception\InvalidArgumentException;
use BaconQrCode\Exception\RuntimeException;
use BaconQrCode\Renderer\Color\Alpha;
use BaconQrCode\Renderer\Color\Rgb;
use BaconQrCode\Renderer\Eye\EyeInterface;
use BaconQrCode\Renderer\Eye\SimpleCircleEye;
use BaconQrCode\Renderer\Eye\SquareEye;
use BaconQrCode\Renderer\GDLibRenderer;
use BaconQrCode\Renderer\ImageRenderer;
use BaconQrCode\Renderer\Image\GDImageBackEnd;
use BaconQrCode\Renderer\Module\DotsModule;
use BaconQrCode\Renderer\Module\RoundnessModule;
use BaconQrCode\Renderer\RendererStyle\EyeFill;
use BaconQrCode\Renderer\RendererStyle\Fill;
use BaconQrCode\Renderer\RendererStyle\Gradient;
use BaconQrCode\Renderer\RendererStyle\GradientType;
use BaconQrCode\Renderer\RendererStyle\RendererStyle;
use BaconQrCode\Writer;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\Attributes\RequiresPhpExtension;
Expand All @@ -40,7 +32,7 @@ public function testGenericQrCode(): void
$tempName = tempnam(sys_get_temp_dir(), 'test') . '.png';
$writer->writeFile('Hello World!', $tempName);

$this->assertMatchesFileSnapshot($tempName);
$this->assertMatchesImageSnapshot($tempName);
unlink($tempName);
}

Expand All @@ -64,7 +56,7 @@ public function testDifferentColorsQrCode(): void
$tempName = tempnam(sys_get_temp_dir(), 'test') . '.png';
$writer->writeFile('Hello World!', $tempName);

$this->assertMatchesFileSnapshot($tempName);
$this->assertMatchesImageSnapshot($tempName);
unlink($tempName);
}

Expand Down
9 changes: 5 additions & 4 deletions test/Integration/ImagickRenderingTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public function testGenericQrCode() : void
$tempName = tempnam(sys_get_temp_dir(), 'test') . '.png';
$writer->writeFile('Hello World!', $tempName);

$this->assertMatchesFileSnapshot($tempName);
$this->assertMatchesImageSnapshot($tempName);
unlink($tempName);
}

Expand All @@ -63,10 +63,11 @@ public function testIssue79() : void
$tempName = tempnam(sys_get_temp_dir(), 'test') . '.png';
$writer->writeFile('https://apiroad.net/very-long-url', $tempName);

$this->assertMatchesFileSnapshot($tempName);
$this->assertMatchesImageSnapshot($tempName);
unlink($tempName);
}

#[RequiresPhpExtension('imagick')]
public function testIssue105() : void
{
$squareModule = SquareModule::instance();
Expand All @@ -86,7 +87,7 @@ public function testIssue105() : void
$tempName1 = tempnam(sys_get_temp_dir(), 'test') . '.png';
$writer1->writeFile('rotation without eye color', $tempName1);

$this->assertMatchesFileSnapshot($tempName1);
$this->assertMatchesImageSnapshot($tempName1);
unlink($tempName1);

$eyeFill = new EyeFill(new Rgb(255, 0, 0), new Rgb(0, 255, 0));
Expand All @@ -105,7 +106,7 @@ public function testIssue105() : void
$tempName2 = tempnam(sys_get_temp_dir(), 'test') . '.png';
$writer2->writeFile('rotation with eye color', $tempName2);

$this->assertMatchesFileSnapshot($tempName2);
$this->assertMatchesImageSnapshot($tempName2);
unlink($tempName2);
}
}
20 changes: 8 additions & 12 deletions test/Integration/SVGRenderingTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,29 +15,29 @@
use BaconQrCode\Writer;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\TestCase;
use Spatie\Snapshots\MatchesSnapshots;

#[Group('integration')]
final class SVGRenderingTest extends TestCase
{
use MatchesSnapshots;

public function testGenericQrCode(): void
{
$renderer = new ImageRenderer(
new RendererStyle(400),
new SvgImageBackEnd()
);
$writer = new Writer($renderer);
$svg = $writer->writeString('Hello World!');

$svgCode = $writer->writeString('Hello World!');
$expected = file_get_contents(__DIR__.'/__snapshots__/files/SVGRenderingTest__testGenericQrCode__1.svg');

$this->assertEquals($expected, $svgCode);
$this->assertMatchesXmlSnapshot($svg);
}

// SVGRenderingTest__testQrWithGradientGeneratesDifferentIdsForDifferentGradients_horizontal
//SVGRenderingTest__testQrWithGradientGeneratesDifferentIdsForDifferentGradients_vertical
public function testQrWithGradientGeneratesDifferentIdsForDifferentGradients()
{
$types = ['HORIZONTAL', 'VERTICAL'];

foreach ($types as $type) {
$gradient = new Gradient(
new Rgb(0, 0, 0),
Expand All @@ -58,13 +58,9 @@ public function testQrWithGradientGeneratesDifferentIdsForDifferentGradients()
new SvgImageBackEnd()
);
$writer = new Writer($renderer);
$qr = $writer->writeString('Hello World!');
$expectedFile = __DIR__ . '/__snapshots__/files/';
$expectedFile .= 'SVGRenderingTest__testQrWithGradientGeneratesDifferentIdsForDifferentGradients__';
$expectedFile .= strtolower($type) . '.svg';
$expected = file_get_contents($expectedFile);
$svg = $writer->writeString('Hello World!');

$this->assertEquals($expected, $qr);
$this->assertMatchesXmlSnapshot($svg);
}
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="400" height="400" viewBox="0 0 400 400">
<rect x="0" y="0" width="400" height="400" fill="#fefefe"/>
<g transform="scale(13.793)">
<g transform="translate(4.000,4.000)">
<path fill-rule="evenodd" d="M8 0L8 1L9 1L9 2L8 2L8 5L11 5L11 4L12 4L12 3L13 3L13 0L12 0L12 3L11 3L11 2L10 2L10 0ZM9 2L9 4L11 4L11 3L10 3L10 2ZM8 6L8 7L9 7L9 8L8 8L8 9L7 9L7 8L6 8L6 9L7 9L7 10L5 10L5 9L4 9L4 8L0 8L0 10L2 10L2 11L0 11L0 13L2 13L2 11L3 11L3 13L8 13L8 14L10 14L10 15L9 15L9 17L8 17L8 21L9 21L9 19L11 19L11 21L12 21L12 19L13 19L13 21L16 21L16 20L17 20L17 19L16 19L16 18L15 18L15 17L14 17L14 18L15 18L15 19L13 19L13 17L12 17L12 16L14 16L14 15L15 15L15 16L16 16L16 15L17 15L17 18L18 18L18 19L19 19L19 18L20 18L20 16L19 16L19 15L17 15L17 14L16 14L16 13L15 13L15 12L16 12L16 10L19 10L19 12L20 12L20 14L21 14L21 12L20 12L20 11L21 11L21 8L20 8L20 10L19 10L19 8L16 8L16 9L14 9L14 8L13 8L13 9L12 9L12 12L10 12L10 9L11 9L11 6L10 6L10 7L9 7L9 6ZM12 6L12 7L13 7L13 6ZM9 8L9 9L8 9L8 10L7 10L7 11L5 11L5 10L3 10L3 11L4 11L4 12L7 12L7 11L9 11L9 9L10 9L10 8ZM14 10L14 11L13 11L13 12L12 12L12 14L11 14L11 15L13 15L13 14L14 14L14 13L13 13L13 12L15 12L15 10ZM17 11L17 12L18 12L18 11ZM8 12L8 13L9 13L9 12ZM18 13L18 14L19 14L19 13ZM10 16L10 17L9 17L9 18L10 18L10 17L11 17L11 19L12 19L12 17L11 17L11 16ZM20 19L20 20L21 20L21 19ZM18 20L18 21L19 21L19 20ZM0 0L0 7L7 7L7 0ZM1 1L1 6L6 6L6 1ZM2 2L2 5L5 5L5 2ZM21 0L14 0L14 7L21 7ZM20 1L15 1L15 6L20 6ZM19 2L16 2L16 5L19 5ZM0 21L7 21L7 14L0 14ZM1 20L6 20L6 15L1 15ZM2 19L5 19L5 16L2 16Z" fill="#000000"/>
</g>
</g>
</svg>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="400" height="400" viewBox="0 0 400 400">
<rect x="0" y="0" width="400" height="400" fill="#ffffff"/>
<g transform="scale(13.793)">
<g transform="translate(4.000,4.000)">
<defs>
<linearGradient gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="21" y2="0" id="g1-a40de6dbf9322546">
<stop offset="0%" stop-color="#000000"/>
<stop offset="100%" stop-color="#ff0000"/>
</linearGradient>
</defs>
<path fill-rule="evenodd" d="M8 0L8 1L9 1L9 2L8 2L8 5L11 5L11 4L12 4L12 3L13 3L13 0L12 0L12 3L11 3L11 2L10 2L10 0ZM9 2L9 4L11 4L11 3L10 3L10 2ZM8 6L8 7L9 7L9 8L8 8L8 9L7 9L7 8L6 8L6 9L7 9L7 10L5 10L5 9L4 9L4 8L0 8L0 10L2 10L2 11L0 11L0 13L2 13L2 11L3 11L3 13L8 13L8 14L10 14L10 15L9 15L9 17L8 17L8 21L9 21L9 19L11 19L11 21L12 21L12 19L13 19L13 21L16 21L16 20L17 20L17 19L16 19L16 18L15 18L15 17L14 17L14 18L15 18L15 19L13 19L13 17L12 17L12 16L14 16L14 15L15 15L15 16L16 16L16 15L17 15L17 18L18 18L18 19L19 19L19 18L20 18L20 16L19 16L19 15L17 15L17 14L16 14L16 13L15 13L15 12L16 12L16 10L19 10L19 12L20 12L20 14L21 14L21 12L20 12L20 11L21 11L21 8L20 8L20 10L19 10L19 8L16 8L16 9L14 9L14 8L13 8L13 9L12 9L12 12L10 12L10 9L11 9L11 6L10 6L10 7L9 7L9 6ZM12 6L12 7L13 7L13 6ZM9 8L9 9L8 9L8 10L7 10L7 11L5 11L5 10L3 10L3 11L4 11L4 12L7 12L7 11L9 11L9 9L10 9L10 8ZM14 10L14 11L13 11L13 12L12 12L12 14L11 14L11 15L13 15L13 14L14 14L14 13L13 13L13 12L15 12L15 10ZM17 11L17 12L18 12L18 11ZM8 12L8 13L9 13L9 12ZM18 13L18 14L19 14L19 13ZM10 16L10 17L9 17L9 18L10 18L10 17L11 17L11 19L12 19L12 17L11 17L11 16ZM20 19L20 20L21 20L21 19ZM18 20L18 21L19 21L19 20ZM0 0L0 7L7 7L7 0ZM1 1L1 6L6 6L6 1ZM2 2L2 5L5 5L5 2ZM21 0L14 0L14 7L21 7ZM20 1L15 1L15 6L20 6ZM19 2L16 2L16 5L19 5ZM0 21L7 21L7 14L0 14ZM1 20L6 20L6 15L1 15ZM2 19L5 19L5 16L2 16Z" fill="url(#g1-a40de6dbf9322546)"/>
</g>
</g>
</svg>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="400" height="400" viewBox="0 0 400 400">
<rect x="0" y="0" width="400" height="400" fill="#ffffff"/>
<g transform="scale(13.793)">
<g transform="translate(4.000,4.000)">
<defs>
<linearGradient gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="0" y2="21" id="g1-a2ca2de96657f016">
<stop offset="0%" stop-color="#000000"/>
<stop offset="100%" stop-color="#ff0000"/>
</linearGradient>
</defs>
<path fill-rule="evenodd" d="M8 0L8 1L9 1L9 2L8 2L8 5L11 5L11 4L12 4L12 3L13 3L13 0L12 0L12 3L11 3L11 2L10 2L10 0ZM9 2L9 4L11 4L11 3L10 3L10 2ZM8 6L8 7L9 7L9 8L8 8L8 9L7 9L7 8L6 8L6 9L7 9L7 10L5 10L5 9L4 9L4 8L0 8L0 10L2 10L2 11L0 11L0 13L2 13L2 11L3 11L3 13L8 13L8 14L10 14L10 15L9 15L9 17L8 17L8 21L9 21L9 19L11 19L11 21L12 21L12 19L13 19L13 21L16 21L16 20L17 20L17 19L16 19L16 18L15 18L15 17L14 17L14 18L15 18L15 19L13 19L13 17L12 17L12 16L14 16L14 15L15 15L15 16L16 16L16 15L17 15L17 18L18 18L18 19L19 19L19 18L20 18L20 16L19 16L19 15L17 15L17 14L16 14L16 13L15 13L15 12L16 12L16 10L19 10L19 12L20 12L20 14L21 14L21 12L20 12L20 11L21 11L21 8L20 8L20 10L19 10L19 8L16 8L16 9L14 9L14 8L13 8L13 9L12 9L12 12L10 12L10 9L11 9L11 6L10 6L10 7L9 7L9 6ZM12 6L12 7L13 7L13 6ZM9 8L9 9L8 9L8 10L7 10L7 11L5 11L5 10L3 10L3 11L4 11L4 12L7 12L7 11L9 11L9 9L10 9L10 8ZM14 10L14 11L13 11L13 12L12 12L12 14L11 14L11 15L13 15L13 14L14 14L14 13L13 13L13 12L15 12L15 10ZM17 11L17 12L18 12L18 11ZM8 12L8 13L9 13L9 12ZM18 13L18 14L19 14L19 13ZM10 16L10 17L9 17L9 18L10 18L10 17L11 17L11 19L12 19L12 17L11 17L11 16ZM20 19L20 20L21 20L21 19ZM18 20L18 21L19 21L19 20ZM0 0L0 7L7 7L7 0ZM1 1L1 6L6 6L6 1ZM2 2L2 5L5 5L5 2ZM21 0L14 0L14 7L21 7ZM20 1L15 1L15 6L20 6ZM19 2L16 2L16 5L19 5ZM0 21L7 21L7 14L0 14ZM1 20L6 20L6 15L1 15ZM2 19L5 19L5 16L2 16Z" fill="url(#g1-a2ca2de96657f016)"/>
</g>
</g>
</svg>

This file was deleted.

This file was deleted.

Loading