final tweaks before testing

This commit is contained in:
Adam Weston
2023-07-16 10:17:14 -04:00
parent af17c6f6ae
commit a76b5a4634
17 changed files with 186 additions and 166 deletions

15
.gitattributes vendored
View File

@@ -10,17 +10,18 @@
/.package-lock.json export-ignore
/.editorconfig export-ignore
/.php_cs.dist.php export-ignore
/phpunit.xml.dist export-ignore
/.vscode export-ignore
/art export-ignore
/docs export-ignore
/images export-ignore
/tests export-ignore
/package.json export-ignore
/phpstan-baseline.neon export-ignore
/phpstan.neon.dist export-ignore
/postcss.config.js export-ignore
/phpunit.xml.dist export-ignore
/psalm.xml export-ignore
/psalm.xml.dist export-ignore
/tailwind.config.js export-ignore
/testbench.yaml export-ignore
/UPGRADING.md export-ignore
/phpstan.neon.dist export-ignore
/phpstan-baseline.neon export-ignore
/images export-ignore
/package.json export-ignore
/postcss.config.js export-ignore
/tailwind.config.js export-ignore

View File

@@ -14,7 +14,7 @@ Please be considerate towards maintainers when raising issues or presenting pull
world that developers are civilized and selfless people.
It's the duty of the maintainer to ensure that all submissions to the project are of sufficient
quality to benefit the project. Many developers have different skillsets, strengths, and weaknesses. Respect the maintainer's decision, and do not be upset or abusive if your submission is not used.
quality to benefit the project. Many developers have different skills, strengths, and weaknesses. Respect the maintainer's decision, and do not be upset or abusive if your submission is not used.
## Viability

66
.github/ISSUE_TEMPLATE/bug.yml vendored Normal file
View File

@@ -0,0 +1,66 @@
name: Bug Report
description: Report an Issue or Bug with the Package
title: "[Bug]: "
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
We're sorry to hear you have a problem. Can you help us solve it by providing the following details.
- type: textarea
id: what-happened
attributes:
label: What happened?
description: What did you expect to happen?
placeholder: I cannot currently do X thing because when I do, it breaks X thing.
validations:
required: true
- type: textarea
id: how-to-reproduce
attributes:
label: How to reproduce the bug
description: How did this occur, please add any config values used and provide a set of reliable steps if possible.
placeholder: When I do X I see Y.
validations:
required: true
- type: input
id: package-version
attributes:
label: Package Version
description: What version of our Package are you running? Please be as specific as possible
placeholder: 2.0.0
validations:
required: true
- type: input
id: php-version
attributes:
label: PHP Version
description: What version of PHP are you running? Please be as specific as possible
placeholder: 8.2.0
validations:
required: true
- type: input
id: laravel-version
attributes:
label: Laravel Version
description: What version of Laravel are you running? Please be as specific as possible
placeholder: 9.0.0
validations:
required: true
- type: dropdown
id: operating-systems
attributes:
label: Which operating systems does with happen with?
description: You may select more than one.
multiple: true
options:
- macOS
- Windows
- Linux
- type: textarea
id: notes
attributes:
label: Notes
description: Use this field to provide any other notes that you feel might be relevant to the issue.
validations:
required: false

View File

@@ -9,6 +9,3 @@ contact_links:
- name: Report a security issue
url: https://github.com/:vendor_name/:package_name/security/policy
about: Learn how to notify us for sensitive bugs
- name: Report a bug
url: https://github.com/:vendor_name/:package_name/issues/new
about: Report a reproducible bug

View File

@@ -1,4 +1,4 @@
name: Dependabot Auto Merge
name: "Dependabot Auto-Merge"
on: pull_request_target
@@ -14,7 +14,7 @@ jobs:
- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@v1.4.0
uses: dependabot/fetch-metadata@v1.6.0
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"

View File

@@ -1,6 +1,12 @@
name: Fix PHP Code Styling
name: "Fix PHP Code Styling"
on: [push]
on:
push:
paths:
- '**.php'
permissions:
contents: write
jobs:
php-code-styling:

View File

@@ -1,8 +1,10 @@
name: Run Tests
name: run-tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
@@ -12,13 +14,12 @@ jobs:
matrix:
os: [ubuntu-latest, windows-latest]
php: [8.2, 8.1]
laravel: [10.*, 9.*]
stability: [prefer-stable]
laravel: [10.*]
stability: [prefer-lowest, prefer-stable]
include:
- laravel: 10.*
testbench: 8.*
- laravel: 9.*
testbench: 7.*
carbon: ^2.63
name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.stability }} - ${{ matrix.os }}
@@ -40,8 +41,11 @@ jobs:
- name: Install dependencies
run: |
composer require "laravel/framework:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" --no-interaction --no-update
composer require "laravel/framework:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" "nesbot/carbon:${{ matrix.carbon }}" --no-interaction --no-update
composer update --${{ matrix.stability }} --prefer-dist --no-interaction
- name: List Installed Dependencies
run: composer show -D
- name: Execute tests
run: ./vendor/bin/pest --verbose
run: vendor/bin/pest --ci

View File

@@ -1,9 +1,12 @@
name: Update Changelog
name: "Update Changelog"
on:
release:
types: [released]
permissions:
contents: write
jobs:
update:
runs-on: ubuntu-latest
@@ -11,6 +14,8 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
ref: main
- name: Update Changelog
uses: stefanzweifel/changelog-updater-action@v1
@@ -21,5 +26,6 @@ jobs:
- name: Commit updated CHANGELOG
uses: stefanzweifel/git-auto-commit-action@v4
with:
branch: main
commit_message: Update CHANGELOG
file_pattern: CHANGELOG.md

5
.gitignore vendored
View File

@@ -1,12 +1,13 @@
.DS_Store
.idea
.phpunit.result.cache
.DS_Store
.vscode
build
composer.lock
coverage
docs
node_modules
phpunit.xml
phpstan.neon
testbench.yaml
vendor
node_modules

View File

@@ -1,8 +1,8 @@
# :package_description
[![Latest Version on Packagist](https://img.shields.io/packagist/v/:vendor_slug/:package_slug.svg?style=flat-square)](https://packagist.org/packages/:vendor_slug/:package_slug)
[![GitHub Tests Action Status](https://img.shields.io/github/workflow/status/:vendor_slug/:package_slug/run-tests?label=tests)](https://github.com/:vendor_slug/:package_slug/actions?query=workflow%3Arun-tests+branch%3Amain)
[![GitHub Code Style Action Status](https://img.shields.io/github/workflow/status/:vendor_slug/:package_slug/Check%20&%20fix%20styling?label=code%20style)](https://github.com/:vendor_slug/:package_slug/actions?query=workflow%3A"Check+%26+fix+styling"+branch%3Amain)
[![GitHub Tests Action Status](https://img.shields.io/github/actions/workflow/status/:vendor_slug/:package_slug/run-tests.yml?branch=main&label=tests&style=flat-square)](https://github.com/:vendor_slug/:package_slug/actions?query=workflow%3Arun-tests+branch%3Amain)
[![GitHub Code Style Action Status](https://img.shields.io/github/actions/workflow/status/:vendor_slug/:package_slug/fix-php-code-style-issues.yml?branch=main&label=code%20style&style=flat-square)](https://github.com/:vendor_slug/:package_slug/actions?query=workflow%3A"Fix+PHP+code+style+issues"+branch%3Amain)
[![Total Downloads](https://img.shields.io/packagist/dt/:vendor_slug/:package_slug.svg?style=flat-square)](https://packagist.org/packages/:vendor_slug/:package_slug)
<!--delete-->
@@ -54,8 +54,8 @@ return [
## Usage
```php
$skeleton = new VendorName\Skeleton();
echo $skeleton->echoPhrase('Hello, VendorName!');
$variable = new VendorName\Skeleton();
echo $variable->echoPhrase('Hello, VendorName!');
```
## Testing

View File

@@ -16,18 +16,20 @@ $authorUsername = ask('Author username', $usernameGuess);
$vendorName = ask('Vendor name', $authorUsername);
$vendorSlug = slugify($vendorName);
$vendorNamespace = ucwords($vendorName);
$vendorNamespace = str_replace('-', '', ucwords($vendorName));
$vendorNamespace = ask('Vendor namespace', $vendorNamespace);
$folderName = basename(getcwd());
$currentDirectory = getcwd();
$folderName = basename($currentDirectory);
$packageName = ask('Package name', $folderName);
$packageSlug = slugify($packageName);
$packageSlugWithoutPrefix = remove_prefix('filament-', $packageSlug);
$packageSlugWithoutPrefix = removePrefix('filament-', $packageSlug);
$className = title_case($packageName);
$className = titleCase($packageName);
$className = ask('Class name', $className);
$description = ask('Package description');
$variableName = lcfirst($className);
$description = ask('Package description', "This is my package $packageSlug");
$usePhpStan = confirm('Enable PhpStan?', true);
$usePint = confirm('Enable Pint?', true);
@@ -41,11 +43,11 @@ $tablesOnly = ! ($isTheme || $formsOnly) && confirm('Is this for Tables only?');
writeln("\r");
writeln('------');
writeln("Author : \e[0;36m{$authorName} ({$authorUsername}, {$authorEmail})\e[0m");
writeln("Vendor : \e[0;36m{$vendorName} ({$vendorSlug})\e[0m");
writeln("Author : \e[0;36m$authorName ($authorUsername, $authorEmail)\e[0m");
writeln("Vendor : \e[0;36m$vendorName ($vendorSlug)\e[0m");
writeln('Package : ' . "\e[0;36m" . $packageSlug . ($description ? ' <{$description}>' : '') . "\e[0m");
writeln("Namespace : \e[0;36m{$vendorNamespace}\\{$className}\e[0m");
writeln("Class name : \e[0;36m{$className}\e[0m");
writeln("Namespace : \e[0;36m$vendorNamespace\\$className\e[0m");
writeln("Class name : \e[0;36m$className\e[0m");
writeln('---');
writeln("\e[1;37mPackages & Utilities\e[0m");
writeln('Larastan/PhpStan : ' . ($usePhpStan ? "\e[0;32mYes" : "\e[0;31mNo") . "\e[0m");
@@ -72,19 +74,21 @@ if (! confirm('Modify files?', true)) {
if ($formsOnly) {
safeUnlink(__DIR__ . '/src/SkeletonTheme.php');
safeUnlink(__DIR__ . '/src/SkeletonPlugin.php');
safeUnlink(__DIR__ . '/package-theme.json');
remove_composer_filament_deps([
removeComposerDeps([
'filament/filament',
'filament/tables',
]);
], 'require');
} elseif ($tablesOnly) {
safeUnlink(__DIR__ . '/src/SkeletonTheme.php');
safeUnlink(__DIR__ . '/src/SkeletonPlugin.php');
safeUnlink(__DIR__ . '/package-theme.json');
remove_composer_filament_deps([
removeComposerDeps([
'filament/filament',
'filament/forms',
]);
], 'require');
} else {
if ($isTheme) {
safeUnlink(__DIR__ . '/src/SkeletonServiceProvider.php');
@@ -103,16 +107,16 @@ if ($formsOnly) {
safeUnlink(__DIR__ . '/src/SkeletonTheme.php');
}
remove_composer_filament_deps([
removeComposerDeps([
'filament/forms',
'filament/tables',
]);
], 'require');
}
$files = (str_starts_with(strtoupper(PHP_OS), 'WIN') ? replaceForWindows() : replaceForAllOtherOSes());
foreach ($files as $file) {
replace_in_file($file, [
replaceInFile($file, [
':author_name' => $authorName,
':author_username' => $authorUsername,
'author@domain.com' => $authorEmail,
@@ -124,6 +128,8 @@ foreach ($files as $file) {
':package_slug_without_prefix' => $packageSlugWithoutPrefix,
'Skeleton' => $className,
'skeleton' => $packageSlug,
'migration_table_name' => titleSnake($packageSlug),
'variable' => $variableName,
':package_description' => $description,
]);
@@ -135,9 +141,10 @@ foreach ($files as $file) {
str_contains($file, determineSeparator('src/Facades/Skeleton.php')) => rename($file, determineSeparator('./src/Facades/' . $className . '.php')),
str_contains($file, determineSeparator('src/Commands/SkeletonCommand.php')) => rename($file, determineSeparator('./src/Commands/' . $className . 'Command.php')),
str_contains($file, determineSeparator('src/Testing/TestsSkeleton.php')) => rename($file, determineSeparator('./src/Testing/Tests' . $className . '.php')),
str_contains($file, determineSeparator('database/migrations/create_skeleton_table.php.stub')) => rename($file, determineSeparator('./database/migrations/create_' . $packageSlugWithoutPrefix . '_table.php.stub')),
str_contains($file, determineSeparator('database/migrations/create_skeleton_table.php.stub')) => rename
($file, determineSeparator('./database/migrations/create_' . titleSnake($packageSlugWithoutPrefix) . '_table.php.stub')),
str_contains($file, determineSeparator('config/skeleton.php')) => rename($file, determineSeparator('./config/' . $packageSlugWithoutPrefix . '.php')),
str_contains($file, 'README.md') => remove_tag($file, 'delete'),
str_contains($file, 'README.md') => removeTag($file, 'delete'),
default => [],
};
}
@@ -148,7 +155,7 @@ if (! $useDependabot) {
}
if (! $useLaravelRay) {
remove_composer_deps(['spatie/laravel-ray']);
removeComposerDeps(['spatie/laravel-ray'], 'require-dev');
}
if (! $usePhpStan) {
@@ -156,32 +163,32 @@ if (! $usePhpStan) {
safeUnlink(__DIR__ . '/phpstan-baseline.neon');
safeUnlink(__DIR__ . '/.github/workflows/phpstan.yml');
remove_composer_deps([
removeComposerDeps([
'phpstan/extension-installer',
'phpstan/phpstan-deprecation-rules',
'phpstan/phpstan-phpunit',
'nunomaduro/larastan',
]);
], 'require-dev');
remove_composer_script(['analyse']);
removeComposerDeps(['analyse'], 'scripts');
}
if (! $usePint) {
safeUnlink(__DIR__ . '/.github/workflows/fix-php-code-style-issues.yml');
safeUnlink(__DIR__ . '/pint.json');
remove_composer_deps([
removeComposerDeps([
'laravel/pint',
]);
], 'require-dev');
remove_composer_script(['format']);
removeComposerDeps(['format'], 'scripts');
}
if (! $useUpdateChangelogWorkflow) {
safeUnlink(__DIR__ . '/.github/workflows/update-changelog.yml');
}
confirm('Execute `composer install` and run tests?') && run('composer install && composer test');
confirm('Execute `composer install`?') && run('composer install');
if (confirm('Let this script delete itself?', true)) {
unlink(__FILE__);
@@ -189,7 +196,7 @@ if (confirm('Let this script delete itself?', true)) {
function ask(string $question, string $default = ''): string
{
$def = $default ? "\e[0;33m ({$default})" : '';
$def = $default ? "\e[0;33m ($default)" : '';
$answer = readline("\e[0;32m" . $question . $def . ": \e[0m");
if (! $answer) {
@@ -217,7 +224,7 @@ function writeln(string $line): void
function run(string $command): string
{
return trim(shell_exec($command));
return trim((string) shell_exec($command));
}
function slugify(string $subject): string
@@ -225,12 +232,17 @@ function slugify(string $subject): string
return strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $subject), '-'));
}
function title_case(string $subject): string
function titleCase(string $subject): string
{
return str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $subject)));
}
function replace_in_file(string $file, array $replacements): void
function titleSnake(string $subject, string $replace = '_'): string
{
return str_replace(['-', '_'], $replace, $subject);
}
function replaceInFile(string $file, array $replacements): void
{
$contents = file_get_contents($file);
@@ -244,7 +256,7 @@ function replace_in_file(string $file, array $replacements): void
);
}
function remove_prefix(string $prefix, string $content): string
function removePrefix(string $prefix, string $content): string
{
if (str_starts_with($content, $prefix)) {
return substr($content, strlen($prefix));
@@ -253,96 +265,20 @@ function remove_prefix(string $prefix, string $content): string
return $content;
}
function remove_composer_deps(array $names): void
function removeComposerDeps(array $names, string $location): void
{
$data = json_decode(file_get_contents(__DIR__ . '/composer.json'), true);
foreach ($data['require-dev'] as $name => $version) {
foreach ($data[$location] as $name => $version) {
if (in_array($name, $names, true)) {
unset($data['require-dev'][$name]);
unset($data[$location][$name]);
}
}
file_put_contents(__DIR__ . '/composer.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
}
function remove_composer_filament_deps(array $names): void
{
$data = json_decode(file_get_contents(__DIR__ . '/composer.json'), true);
foreach ($data['require'] as $name => $version) {
if (in_array($name, $names, true)) {
unset($data['require'][$name]);
}
}
file_put_contents(__DIR__ . '/composer.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
}
function remove_composer_script(array $scriptNames): void
{
$data = json_decode(file_get_contents(__DIR__ . '/composer.json'), true);
foreach ($data['scripts'] as $name => $script) {
if (is_array($script)) {
foreach ($script as $k => $s) {
if (in_array($s, $scriptNames)) {
unset($data['scripts'][$name][$k]);
break;
}
}
} elseif (in_array($name, $scriptNames)) {
unset($data['scripts'][$name]);
break;
}
}
file_put_contents(__DIR__ . '/composer.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
}
function remove_package_script(array $scriptNames): void
{
$data = json_decode(file_get_contents(__DIR__ . '/package.json'), true);
foreach ($data['scripts'] as $name => $script) {
if (is_array($script)) {
foreach ($script as $k => $s) {
if (in_array($s, $scriptNames)) {
unset($data['scripts'][$name][$k]);
break;
}
}
} elseif (in_array($name, $scriptNames)) {
unset($data['scripts'][$name]);
break;
}
}
foreach ($data['devDependencies'] as $name => $script) {
if (is_array($script)) {
foreach ($script as $k => $s) {
if (in_array($s, $scriptNames)) {
unset($data['devDependencies'][$name][$k]);
break;
}
}
} elseif (in_array($name, $scriptNames)) {
unset($data['devDependencies'][$name]);
break;
}
}
file_put_contents(__DIR__ . '/package.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES |
JSON_UNESCAPED_UNICODE));
}
function remove_tag(string $file, string $tag): void
function removeTag(string $file, string $tag): void
{
$contents = file_get_contents($file);
@@ -366,12 +302,12 @@ function determineSeparator(string $path): string
function replaceForWindows(): array
{
return preg_split('/\\r\\n|\\r|\\n/', run('dir /S /B * | findstr /v /i .git\ | findstr /v /i vendor | findstr /v /i ' . basename(__FILE__) . ' | findstr /r /i /M /F:/ ":author :vendor :package VendorName skeleton vendor_name vendor_slug author@domain.com"'));
return preg_split('/\\r\\n|\\r|\\n/', run('dir /S /B * | findstr /v /i .git\ | findstr /v /i vendor | findstr /v /i '.basename(__FILE__).' | findstr /r /i /M /F:/ ":author :vendor :package VendorName skeleton migration_table_name vendor_name vendor_slug author@domain.com"'));
}
function replaceForAllOtherOSes(): array
{
return explode(PHP_EOL, run('grep -E -r -l -i ":author|:vendor|:package|VendorName|skeleton|vendor_name|vendor_slug|author@domain.com" --exclude-dir=vendor ./* ./.github/* | grep -v ' . basename(__FILE__)));
return explode(PHP_EOL, run('grep -E -r -l -i ":author|:vendor|:package|VendorName|skeleton|migration_table_name|vendor_name|vendor_slug|author@domain.com" --exclude-dir=vendor ./* ./.github/* | grep -v '.basename(__FILE__)));
}
function removeDirectory($dir): void

View File

@@ -8,7 +8,7 @@ return new class extends Migration
{
public function up()
{
Schema::create('skeleton_table', function (Blueprint $table) {
Schema::create('migration_table_name_table', function (Blueprint $table) {
$table->id();
// add fields

View File

@@ -5,9 +5,11 @@
"build": "npx tailwindcss -i resources/css/skeleton.css -o resources/dist/skeleton.css --postcss --minify"
},
"devDependencies": {
"autoprefixer": "^10.4.7",
"postcss": "^8.4.14",
"postcss-import": "^15.0.0",
"tailwindcss": "^3.3.2"
"@tailwindcss/forms": "^0.5.4",
"@tailwindcss/typography": "^0.5.9",
"autoprefixer": "^10.4.14",
"postcss": "^8.4.26",
"postcss-import": "^15.1.0",
"tailwindcss": "^3.3.3"
}
}

View File

@@ -11,13 +11,13 @@
},
"devDependencies": {
"@awcodes/filament-plugin-purge": "^1.1.1",
"autoprefixer": "^10.4.7",
"autoprefixer": "^10.4.14",
"esbuild": "^0.17.19",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.14",
"postcss-import": "^15.0.0",
"postcss": "^8.4.26",
"postcss-import": "^15.1.0",
"prettier": "^2.7.1",
"prettier-plugin-tailwindcss": "^0.1.13",
"tailwindcss": "^3.3.2"
"tailwindcss": "^3.3.3"
}
}

View File

@@ -1,14 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.2/phpunit.xsd"
backupGlobals="false"
backupStaticAttributes="false"
bootstrap="vendor/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
executionOrder="random"
@@ -16,7 +12,8 @@
failOnRisky="true"
failOnEmptyTestSuite="true"
beStrictAboutOutputDuringTests="true"
verbose="true"
cacheDirectory=".phpunit.cache"
backupStaticProperties="false"
>
<testsuites>
<testsuite name="VendorName Test Suite">
@@ -24,9 +21,6 @@
</testsuite>
</testsuites>
<coverage>
<include>
<directory suffix=".php">./src</directory>
</include>
<report>
<html outputDirectory="build/coverage"/>
<text outputFile="build/coverage.txt"/>
@@ -36,4 +30,9 @@
<logging>
<junit outputFile="build/report.junit.xml"/>
</logging>
<source>
<include>
<directory suffix=".php">./src</directory>
</include>
</source>
</phpunit>

View File

@@ -59,19 +59,21 @@ class SkeletonServiceProvider extends PackageServiceProvider
}
}
public function boot(): void
public function packageRegistered(): void
{
parent::boot();
}
public function packageBooted(): void
{
// Asset Registration
FilamentAsset::register(
$this->getAssets(),
$this->getAssetPackage()
$this->getAssetPackageName()
);
FilamentAsset::registerScriptData(
$this->getScriptData(),
$this->getAssetPackage()
$this->getAssetPackageName()
);
// Icon Registration
@@ -90,7 +92,7 @@ class SkeletonServiceProvider extends PackageServiceProvider
TestableLivewire::mixin(new TestsSkeleton());
}
protected function getAssetPackage(): ?string
protected function getAssetPackageName(): ?string
{
return ':vendor_slug/:package_slug';
}