Skip to content

Commit

Permalink
Merge pull request #33 from ergebnis/feature/file
Browse files Browse the repository at this point in the history
Enhancement: Add File
  • Loading branch information
localheinz authored Jan 19, 2020
2 parents 2835ded + ddbf004 commit 65a979f
Show file tree
Hide file tree
Showing 7 changed files with 230 additions and 10 deletions.
15 changes: 8 additions & 7 deletions .php_cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,18 @@ $range = License\Range::since(
$url = License\Url::fromString('https://github.com/ergebnis/license');

$headerTemplate = License\Template::fromFile(__DIR__ . '/.license/header-template.txt');
$fileTemplate = License\Template::fromFile(__DIR__ . '/.license/file-template.txt');

$file = __DIR__ . '/LICENSE';
$file = License\File::create(
__DIR__ . '/LICENSE',
License\Template::fromFile(__DIR__ . '/resource/license/MIT.txt'),
$range,
$holder
);

\file_put_contents($file, $fileTemplate->toString([
'<holder>' => $holder->toString(),
'<range>' => $range->toString(),
]));
$file->save();

$header = $headerTemplate->toString([
'<file>' => \basename($file),
'<file>' => \basename($file->name()),
'<holder>' => $holder->toString(),
'<range>' => $range->toString(),
'<url>' => $url->toString(),
Expand Down
6 changes: 4 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@ For a full diff see [`675601b...master`][675601b...master].
* Added `Range` ([#12]), by [@localheinz]
* Added `Url` ([#19]), by [@localheinz]
* Added `Template` ([#20]), by [@localheinz]
* Added `File` ([#33]), by [@localheinz]

[675601b...master]: https://github.com/ergebnis/license/compare/675601b...master

[#7]: https://github.com/ergebnis/license/pull/7
[#10]: https://github.com/ergebnis/license/pull/10
[#12]: https://github.com/ergebnis/license/pull/12
[#19]: https://github.com/ergebnis/license/pull/18
[#20]: https://github.com/ergebnis/license/pull/18
[#19]: https://github.com/ergebnis/license/pull/19
[#20]: https://github.com/ergebnis/license/pull/20
[#33]: https://github.com/ergebnis/license/pull/33

[@localheinz]: https://github.com/localheinz
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"phpstan/phpstan-strict-rules": "~0.12.1",
"phpunit/phpunit": "^7.5.20",
"psalm/plugin-phpunit": "~0.8.1",
"symfony/filesystem": "^4.4.0",
"vimeo/psalm": "^3.8.3"
},
"config": {
Expand Down
2 changes: 1 addition & 1 deletion composer.lock

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

File renamed without changes.
70 changes: 70 additions & 0 deletions src/File.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

declare(strict_types=1);

/**
* Copyright (c) 2020 Andreas Möller
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*
* @see https://github.com/ergebnis/license
*/

namespace Ergebnis\License;

final class File
{
private $name;

private $template;

private $period;

private $holder;

private function __construct(string $name, Template $template, Period $period, Holder $holder)
{
$this->name = $name;
$this->period = $period;
$this->holder = $holder;
$this->template = $template;
}

/**
* @param string $name
* @param Template $template
* @param Period $period
* @param Holder $holder
*
* @throws Exception\InvalidFile
*
* @return self
*/
public static function create(string $name, Template $template, Period $period, Holder $holder): self
{
if ('' === \trim($name)) {
throw Exception\InvalidFile::emptyFileName();
}

return new self(
$name,
$template,
$period,
$holder
);
}

public function name(): string
{
return $this->name;
}

public function save(): void
{
\file_put_contents($this->name, $this->template->toString([
'<holder>' => $this->holder->toString(),
'<range>' => $this->period->toString(),
]));
}
}
146 changes: 146 additions & 0 deletions test/Unit/FileTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
<?php

declare(strict_types=1);

/**
* Copyright (c) 2020 Andreas Möller
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*
* @see https://github.com/ergebnis/license
*/

namespace Ergebnis\License\Test\Unit;

use Ergebnis\License\Exception;
use Ergebnis\License\File;
use Ergebnis\License\Holder;
use Ergebnis\License\Range;
use Ergebnis\License\Template;
use Ergebnis\License\Year;
use Ergebnis\Test\Util\Helper;
use PHPUnit\Framework;
use Symfony\Component\Filesystem;

/**
* @internal
*
* @covers \Ergebnis\License\File
*
* @uses \Ergebnis\License\Exception\InvalidFile
* @uses \Ergebnis\License\Holder
* @uses \Ergebnis\License\Range
* @uses \Ergebnis\License\Template
* @uses \Ergebnis\License\Year
*/
final class FileTest extends Framework\TestCase
{
use Helper;

protected function setUp(): void
{
$filesystem = new Filesystem\Filesystem();

$filesystem->mkdir(self::workspaceDirectory());
}

protected function tearDown(): void
{
$filesystem = new Filesystem\Filesystem();

$filesystem->remove(self::workspaceDirectory());
}

/**
* @dataProvider \Ergebnis\License\Test\Util\DataProvider\Text::blankOrEmptyString()
*
* @param string $name
*/
public function testCreateRejectsBlankOrEmptyName(string $name): void
{
$faker = self::faker();

$template = Template::fromFile(__DIR__ . '/../../resource/license/MIT.txt');
$range = Range::since(
Year::fromString($faker->year),
new \DateTimeZone($faker->timezone)
);
$holder = Holder::fromString($faker->name);

$this->expectException(Exception\InvalidFile::class);

File::create(
$name,
$template,
$range,
$holder
);
}

public function testNameReturnsName(): void
{
$faker = self::faker();

$name = \sprintf(
'%s/%s.txt',
__DIR__,
$faker->slug
);
$template = Template::fromFile(__DIR__ . '/../../resource/license/MIT.txt');
$range = Range::since(
Year::fromString($faker->year),
new \DateTimeZone($faker->timezone)
);
$holder = Holder::fromString($faker->name);

$file = File::create(
$name,
$template,
$range,
$holder
);

self::assertSame($name, $file->name());
}

public function testSaveSavesFile(): void
{
$faker = self::faker();

$name = \sprintf(
'%s/%s.txt',
self::workspaceDirectory(),
$faker->slug
);
$template = Template::fromFile(__DIR__ . '/../../resource/license/MIT.txt');
$range = Range::since(
Year::fromString($faker->year),
new \DateTimeZone($faker->timezone)
);
$holder = Holder::fromString($faker->name);

$file = File::create(
$name,
$template,
$range,
$holder
);

$file->save();

self::assertFileExists($file->name());

$expected = $template->toString([
'<holder>' => $holder->toString(),
'<range>' => $range->toString(),
]);

self::assertSame($expected, \file_get_contents($file->name()));
}

private static function workspaceDirectory(): string
{
return __DIR__ . '/../../.build/test';
}
}

0 comments on commit 65a979f

Please # to comment.