Skip to content

Commit aa56161

Browse files
authored
Merge pull request #195 from afu-dev/dockerfile-enhancements
feat: Dockerfile enhancements
2 parents 34249c4 + d1d6e85 commit aa56161

6 files changed

Lines changed: 139 additions & 0 deletions

File tree

src/Languages/Dockerfile/DockerfileLanguage.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@
66

77
use Override;
88
use Tempest\Highlight\Languages\Base\BaseLanguage;
9+
use Tempest\Highlight\Languages\Dockerfile\Patterns\CommentPattern;
10+
use Tempest\Highlight\Languages\Dockerfile\Patterns\DoubleQuoteValuePattern;
911
use Tempest\Highlight\Languages\Dockerfile\Patterns\ImageAliasKeywordPattern;
1012
use Tempest\Highlight\Languages\Dockerfile\Patterns\ImageAliasNamePattern;
1113
use Tempest\Highlight\Languages\Dockerfile\Patterns\ImageNamePattern;
1214
use Tempest\Highlight\Languages\Dockerfile\Patterns\ImageTagPattern;
1315
use Tempest\Highlight\Languages\Dockerfile\Patterns\KeywordPattern;
16+
use Tempest\Highlight\Languages\Dockerfile\Patterns\SingleQuoteValuePattern;
1417

1518
class DockerfileLanguage extends BaseLanguage
1619
{
@@ -54,6 +57,9 @@ public function getPatterns(): array
5457
new ImageAliasKeywordPattern(),
5558
new ImageAliasNamePattern(),
5659
new ImageTagPattern(),
60+
new SingleQuoteValuePattern(),
61+
new DoubleQuoteValuePattern(),
62+
new CommentPattern(),
5763
];
5864
}
5965
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Dockerfile\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenType;
11+
use Tempest\Highlight\Tokens\TokenTypeEnum;
12+
13+
#[PatternTest(input: '# Hello world!', output: '# Hello world!')]
14+
final class CommentPattern implements Pattern
15+
{
16+
use IsPattern;
17+
18+
public function getPattern(): string
19+
{
20+
return '/(?<match>\#.*)/';
21+
}
22+
23+
public function getTokenType(): TokenType
24+
{
25+
return TokenTypeEnum::COMMENT;
26+
}
27+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Dockerfile\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: 'RUN ["php"]', output: '"php"')]
13+
#[PatternTest(input: 'RUN ["php", "test.php"]', output: ['"php"', '"test.php"'])]
14+
final readonly class DoubleQuoteValuePattern implements Pattern
15+
{
16+
use IsPattern;
17+
18+
public function getPattern(): string
19+
{
20+
return '(?<match>"(\\\"|.)*?")';
21+
}
22+
23+
public function getTokenType(): TokenTypeEnum
24+
{
25+
return TokenTypeEnum::VALUE;
26+
}
27+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Dockerfile\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: "RUN ['php']", output: "'php'")]
13+
final readonly class SingleQuoteValuePattern implements Pattern
14+
{
15+
use IsPattern;
16+
17+
public function getPattern(): string
18+
{
19+
return "(?<match>'(\\\'|.)*?')";
20+
}
21+
22+
public function getTokenType(): TokenTypeEnum
23+
{
24+
return TokenTypeEnum::VALUE;
25+
}
26+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Languages\Dockerfile;
6+
7+
use PHPUnit\Framework\Attributes\DataProvider;
8+
use PHPUnit\Framework\TestCase;
9+
use Tempest\Highlight\Highlighter;
10+
11+
class DockerfileLanguageTest extends TestCase
12+
{
13+
#[DataProvider('provide_highlight_cases')]
14+
public function test_highlight(string $content, string $expected): void
15+
{
16+
$highlighter = new Highlighter();
17+
18+
$this->assertSame(
19+
$expected,
20+
$highlighter->parse($content, 'dockerfile'),
21+
);
22+
}
23+
24+
public static function provide_highlight_cases(): iterable
25+
{
26+
return [
27+
['FROM python:3.13', '<span class="hl-keyword">FROM</span> <span class="hl-value">python</span>:<span class="hl-value">3.13</span>'],
28+
['FROM php AS stage-one', '<span class="hl-keyword">FROM</span> <span class="hl-value">php</span> <span class="hl-keyword">AS</span> <span class="hl-value">stage-one</span>'],
29+
['WORKDIR /usr/local/app', '<span class="hl-keyword">WORKDIR</span> /usr/local/app'],
30+
['CMD ["node", "./src/index.js"]', '<span class="hl-keyword">CMD</span> [<span class="hl-value">&quot;node&quot;</span>, <span class="hl-value">&quot;./src/index.js&quot;</span>]'],
31+
["CMD ['php', 'index.php']", '<span class="hl-keyword">CMD</span> [<span class="hl-value">\'php\'</span>, <span class="hl-value">\'index.php\'</span>]'],
32+
['# This is a comment', '<span class="hl-comment"># This is a comment</span>'],
33+
];
34+
}
35+
}

tests/targets/dockerfile.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
```dockerfile
2+
FROM python:3.13
3+
WORKDIR /usr/local/app
4+
5+
# Install the application dependencies
6+
COPY requirements.txt ./
7+
RUN pip install --no-cache-dir -r requirements.txt
8+
9+
# Copy in the source code
10+
COPY src ./src
11+
EXPOSE 8080
12+
13+
# Setup an app user so the container doesn't run as the root user
14+
RUN useradd app
15+
USER app
16+
17+
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]
18+
```

0 commit comments

Comments
 (0)