rascal 0.3.8 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +3 -3
- data/.ruby-version +1 -1
- data/CHANGELOG.md +14 -0
- data/Gemfile.common +1 -0
- data/Gemfile.lock +4 -2
- data/README.md +48 -1
- data/lib/rascal/cli/environments.rb +15 -0
- data/lib/rascal/cli/main.rb +18 -0
- data/lib/rascal/cli/run.rb +29 -0
- data/lib/rascal/cli.rb +7 -5
- data/lib/rascal/docker/container.rb +2 -4
- data/lib/rascal/docker/interface.rb +1 -0
- data/lib/rascal/environment.rb +36 -0
- data/lib/rascal/environments_definition/gitlab.rb +1 -2
- data/lib/rascal/version.rb +1 -1
- data/media/logo.dark.shapes.svg +125 -0
- data/media/logo.dark.text.svg +107 -0
- data/media/logo.light.shapes.svg +125 -0
- data/media/logo.light.text.svg +107 -0
- data/media/makandra-with-bottom-margin.dark.svg +180 -0
- data/media/makandra-with-bottom-margin.light.svg +180 -0
- metadata +11 -5
- data/Gemfile.2.5 +0 -1
- data/Gemfile.2.5.lock +0 -125
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d916ce222f77cd89927ad3ac8ceb56da9d34d87f2f808938b6c796ce92ab3d8b
|
|
4
|
+
data.tar.gz: 070e9c46b5f33074260638ba1b2e5bb19844c515461788ae904d4b1e72690a7e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7cd38cd621c764d5d8548e4093abc1be639713efc2294b7e80b7fec5d7cdb37648569258c6b8725b604ddcbc756b5916d26b2e6577f8e33a03b100d522b5d957
|
|
7
|
+
data.tar.gz: '00299e9e4c118a754e0b5227c04d2400d7424a551cddaebc24a1fb85c5649e6c7913835e26754f73d663a4ab50b345ed322198f6f4552c3e3f21d318196cf511'
|
data/.github/workflows/test.yml
CHANGED
|
@@ -8,17 +8,17 @@ on:
|
|
|
8
8
|
- main
|
|
9
9
|
jobs:
|
|
10
10
|
test:
|
|
11
|
-
runs-on: ubuntu-
|
|
11
|
+
runs-on: ubuntu-24.04
|
|
12
12
|
strategy:
|
|
13
13
|
fail-fast: false
|
|
14
14
|
matrix:
|
|
15
15
|
include:
|
|
16
|
-
- ruby: 2.5.8
|
|
17
|
-
gemfile: Gemfile.2.5
|
|
18
16
|
- ruby: 3.2.0
|
|
19
17
|
gemfile: Gemfile
|
|
20
18
|
- ruby: 3.4.1
|
|
21
19
|
gemfile: Gemfile
|
|
20
|
+
- ruby: 4.0.6
|
|
21
|
+
gemfile: Gemfile
|
|
22
22
|
env:
|
|
23
23
|
BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
|
|
24
24
|
steps:
|
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.4.
|
|
1
|
+
3.4.8
|
data/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,20 @@ All notable changes to this project will be documented here.
|
|
|
4
4
|
|
|
5
5
|
Rascal follows semantic versioning. This has little consequence pre 1.0, so expect breaking changes.
|
|
6
6
|
|
|
7
|
+
## 0.4.0 (2026-07-30)
|
|
8
|
+
|
|
9
|
+
- Add `rascal run ENVIRONMENT -- COMMAND`, which runs a single command in an
|
|
10
|
+
environment without a TTY and exits with the command's status. Useful for
|
|
11
|
+
scripts, git hooks and AI agents, which cannot drive `rascal shell`.
|
|
12
|
+
- Add `rascal environments`, which lists available environment names on stdout.
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## 0.3.9 (2026-06-19)
|
|
16
|
+
|
|
17
|
+
- Support variables within service definitions.
|
|
18
|
+
- Drop support for Ruby < 3.
|
|
19
|
+
|
|
20
|
+
|
|
7
21
|
## 0.3.8 (2025-02-10)
|
|
8
22
|
|
|
9
23
|
- Ruby 3.4 support.
|
data/Gemfile.common
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
rascal (0.
|
|
4
|
+
rascal (0.4.0)
|
|
5
5
|
thor (>= 1.0.0)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
@@ -18,7 +18,7 @@ GEM
|
|
|
18
18
|
builder (3.3.0)
|
|
19
19
|
childprocess (3.0.0)
|
|
20
20
|
coderay (1.1.3)
|
|
21
|
-
contracts (0.17)
|
|
21
|
+
contracts (0.17.3)
|
|
22
22
|
cucumber (9.2.1)
|
|
23
23
|
builder (~> 3.2)
|
|
24
24
|
cucumber-ci-environment (> 9, < 11)
|
|
@@ -67,6 +67,7 @@ GEM
|
|
|
67
67
|
listen (3.8.0)
|
|
68
68
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
|
69
69
|
rb-inotify (~> 0.9, >= 0.9.10)
|
|
70
|
+
logger (1.7.0)
|
|
70
71
|
lumberjack (1.2.8)
|
|
71
72
|
method_source (1.0.0)
|
|
72
73
|
mini_mime (1.1.5)
|
|
@@ -108,6 +109,7 @@ DEPENDENCIES
|
|
|
108
109
|
cucumber
|
|
109
110
|
guard-cucumber
|
|
110
111
|
guard-rspec
|
|
112
|
+
logger
|
|
111
113
|
rake (~> 13.0)
|
|
112
114
|
rascal!
|
|
113
115
|
rspec
|
data/README.md
CHANGED
|
@@ -1,4 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
<p>
|
|
2
|
+
<a href="https://makandra.de/">
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: light)" srcset="media/makandra-with-bottom-margin.light.svg">
|
|
5
|
+
<source media="(prefers-color-scheme: dark)" srcset="media/makandra-with-bottom-margin.dark.svg">
|
|
6
|
+
<img align="right" width="25%" alt="makandra" src="media/makandra-with-bottom-margin.light.svg">
|
|
7
|
+
</picture>
|
|
8
|
+
</a>
|
|
9
|
+
|
|
10
|
+
<picture>
|
|
11
|
+
<source media="(prefers-color-scheme: light)" srcset="media/logo.light.shapes.svg">
|
|
12
|
+
<source media="(prefers-color-scheme: dark)" srcset="media/logo.dark.shapes.svg">
|
|
13
|
+
<img width="145" alt="rascal" role="heading" aria-level="1" src="media/logo.light.shapes.svg">
|
|
14
|
+
</picture>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
[](https://github.com/makandra/rascal/actions)
|
|
2
18
|
|
|
3
19
|
### Use CI environments locally. Not quite a vagrant.
|
|
4
20
|
|
|
@@ -85,6 +101,37 @@ Start a docker container (plus required services) and open an interactive shell.
|
|
|
85
101
|
Currently requires a "bash" to exist.
|
|
86
102
|
|
|
87
103
|
|
|
104
|
+
#### rascal run <job> -- <command>
|
|
105
|
+
|
|
106
|
+
Run a single command in a docker container (plus required services), then exit
|
|
107
|
+
with the command's exit status.
|
|
108
|
+
|
|
109
|
+
```sh
|
|
110
|
+
rascal run rspec -- bundle exec rspec spec/models/user_spec.rb
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Unlike `rascal shell`, this allocates no TTY and needs no interaction, so it can
|
|
114
|
+
be used from scripts, git hooks, editors and AI agents. Everything after `--` is
|
|
115
|
+
passed through as a list of arguments, so arguments may contain spaces (`-n 'a
|
|
116
|
+
test name'`). To use shell syntax such as `&&` or `cd`, wrap it explicitly:
|
|
117
|
+
|
|
118
|
+
```sh
|
|
119
|
+
rascal run rspec -- bash -c 'cd subproject && bundle exec rspec'
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
`before_shell` and `after_shell` still run around the command, but do not affect
|
|
123
|
+
the exit status. Note that a failing `before_shell` command (e.g. `bundle check`
|
|
124
|
+
in an environment that was never bundled) does not abort the run.
|
|
125
|
+
|
|
126
|
+
Currently requires a "bash" to exist.
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
#### rascal environments
|
|
130
|
+
|
|
131
|
+
Print the names of all available (non-hidden) environments, one per line, so that
|
|
132
|
+
scripts can discover them without parsing an error message.
|
|
133
|
+
|
|
134
|
+
|
|
88
135
|
#### rascal clean <job> | --all [--volumes]
|
|
89
136
|
|
|
90
137
|
Stop and remove all created containers, services, networks for either the given or all jobs.
|
data/lib/rascal/cli/main.rb
CHANGED
|
@@ -36,6 +36,24 @@ module Rascal
|
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
+
desc 'environments', 'List the names of all available environments'
|
|
40
|
+
def environments
|
|
41
|
+
handle_error do
|
|
42
|
+
Environments.new(self, options).run
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Thor::Actions already defines #run, hence the mapping.
|
|
47
|
+
map 'run' => '_run'
|
|
48
|
+
stop_on_unknown_option! :_run
|
|
49
|
+
desc 'run ENVIRONMENT COMMAND', 'Run a command in the given environment and exit with its status'
|
|
50
|
+
def _run(environment_name = nil, *command)
|
|
51
|
+
handle_error do
|
|
52
|
+
command = command.drop(1) if command.first == '--'
|
|
53
|
+
Run.new(self, options, environment_name, command).run
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
39
57
|
desc 'clean ENVIRONMENT', 'Stop and remove docker containers for the given environment'
|
|
40
58
|
method_option :volumes, type: :boolean, default: false, desc: 'Remove (cache) volumes'
|
|
41
59
|
method_option :all, type: :boolean, default: false, desc: 'Clean all environments'
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'rascal'
|
|
2
|
+
|
|
3
|
+
module Rascal
|
|
4
|
+
module CLI
|
|
5
|
+
class Run < Base
|
|
6
|
+
def initialize(thor, options, environment_name, command)
|
|
7
|
+
@environment_name = environment_name
|
|
8
|
+
@command = command
|
|
9
|
+
super(thor, options)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def run
|
|
13
|
+
if (environment = find_environment(@environment_name))
|
|
14
|
+
fail_with_error('Missing command. Example: rascal run job -- bundle exec rake') if @command.empty?
|
|
15
|
+
status = environment.run_command(*@command)
|
|
16
|
+
exit(exit_code_for(status))
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
# A command killed by a signal has no exit status. Report it the way a
|
|
23
|
+
# shell would, so callers still see a non-zero status.
|
|
24
|
+
def exit_code_for(status)
|
|
25
|
+
status.exitstatus || (status.termsig ? 128 + status.termsig : 1)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
data/lib/rascal/cli.rb
CHANGED
|
@@ -2,10 +2,12 @@ require 'thor'
|
|
|
2
2
|
|
|
3
3
|
module Rascal
|
|
4
4
|
module CLI
|
|
5
|
-
autoload :Base,
|
|
6
|
-
autoload :Clean,
|
|
7
|
-
autoload :
|
|
8
|
-
autoload :
|
|
9
|
-
autoload :
|
|
5
|
+
autoload :Base, 'rascal/cli/base'
|
|
6
|
+
autoload :Clean, 'rascal/cli/clean'
|
|
7
|
+
autoload :Environments, 'rascal/cli/environments'
|
|
8
|
+
autoload :Main, 'rascal/cli/main'
|
|
9
|
+
autoload :Run, 'rascal/cli/run'
|
|
10
|
+
autoload :Shell, 'rascal/cli/shell'
|
|
11
|
+
autoload :Update, 'rascal/cli/update'
|
|
10
12
|
end
|
|
11
13
|
end
|
|
@@ -65,16 +65,14 @@ module Rascal
|
|
|
65
65
|
)
|
|
66
66
|
end
|
|
67
67
|
|
|
68
|
-
def run_and_attach(*command, env: {}, network: nil, volumes: [], working_dir: nil, allow_failure: false)
|
|
68
|
+
def run_and_attach(*command, env: {}, network: nil, volumes: [], working_dir: nil, allow_failure: false, tty: true)
|
|
69
69
|
Docker.interface.run_and_attach(
|
|
70
70
|
'container',
|
|
71
71
|
'run',
|
|
72
72
|
'--rm',
|
|
73
73
|
'-a', 'STDOUT',
|
|
74
74
|
'-a', 'STDERR',
|
|
75
|
-
'-a', 'STDIN',
|
|
76
|
-
'--interactive',
|
|
77
|
-
'--tty',
|
|
75
|
+
*(['-a', 'STDIN', '--interactive', '--tty'] if tty),
|
|
78
76
|
*(['-w', working_dir] if working_dir),
|
|
79
77
|
*(volumes.flat_map { |v| ['-v', v.to_param] }),
|
|
80
78
|
*env_args(env),
|
data/lib/rascal/environment.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'shellwords'
|
|
2
|
+
|
|
1
3
|
module Rascal
|
|
2
4
|
class Environment
|
|
3
5
|
attr_reader :name, :network, :container, :env_variables, :services, :volumes, :working_dir, :before_shell
|
|
@@ -27,6 +29,27 @@ module Rascal
|
|
|
27
29
|
)
|
|
28
30
|
end
|
|
29
31
|
|
|
32
|
+
# Runs a single command in the environment, without a TTY, and returns its
|
|
33
|
+
# Process::Status. Unlike #run_shell this is suitable for non-interactive
|
|
34
|
+
# use (scripts, CI-like runs, AI agents), which need the command's real
|
|
35
|
+
# exit status.
|
|
36
|
+
#
|
|
37
|
+
# The command is a list of arguments, which is escaped before being handed
|
|
38
|
+
# to bash, so arguments may contain spaces and shell metacharacters. Use
|
|
39
|
+
# e.g. `bash -c "foo && bar"` to run something the shell must interpret.
|
|
40
|
+
def run_command(*command)
|
|
41
|
+
download_missing
|
|
42
|
+
start_services
|
|
43
|
+
@container.run_and_attach('bash', '-c', command_script(Shellwords.join(command)),
|
|
44
|
+
env: @env_variables,
|
|
45
|
+
network: @network,
|
|
46
|
+
volumes: @volumes,
|
|
47
|
+
working_dir: @working_dir,
|
|
48
|
+
allow_failure: true,
|
|
49
|
+
tty: false
|
|
50
|
+
)
|
|
51
|
+
end
|
|
52
|
+
|
|
30
53
|
def clean(clean_volumes: false)
|
|
31
54
|
@services.each(&:clean)
|
|
32
55
|
@network.clean
|
|
@@ -42,6 +65,19 @@ module Rascal
|
|
|
42
65
|
|
|
43
66
|
private
|
|
44
67
|
|
|
68
|
+
# Runs before_shell/after_shell around the given command, but exits with the
|
|
69
|
+
# command's status. Without saving it, an `after_shell` entry would determine
|
|
70
|
+
# the exit status, and failures would go unnoticed.
|
|
71
|
+
def command_script(command)
|
|
72
|
+
[
|
|
73
|
+
*@before_shell,
|
|
74
|
+
command,
|
|
75
|
+
'__rascal_status=$?',
|
|
76
|
+
*@after_shell,
|
|
77
|
+
'exit $__rascal_status',
|
|
78
|
+
].join(';')
|
|
79
|
+
end
|
|
80
|
+
|
|
45
81
|
def download_missing
|
|
46
82
|
@container.download_missing
|
|
47
83
|
@services.each(&:download_missing)
|
|
@@ -122,7 +122,7 @@ module Rascal
|
|
|
122
122
|
alias_name: service_config['alias'],
|
|
123
123
|
image: service_config['name'],
|
|
124
124
|
volumes: volumes,
|
|
125
|
-
env_variables: env_variables,
|
|
125
|
+
env_variables: env_variables.merge(service_config.fetch('variables', {})),
|
|
126
126
|
command: service_config['command'],
|
|
127
127
|
)
|
|
128
128
|
end
|
|
@@ -144,4 +144,3 @@ module Rascal
|
|
|
144
144
|
end
|
|
145
145
|
end
|
|
146
146
|
end
|
|
147
|
-
|
data/lib/rascal/version.rb
CHANGED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
3
|
+
|
|
4
|
+
<svg
|
|
5
|
+
width="37.115643mm"
|
|
6
|
+
height="14.056203mm"
|
|
7
|
+
viewBox="0 0 37.115641 14.056203"
|
|
8
|
+
version="1.1"
|
|
9
|
+
id="svg838"
|
|
10
|
+
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
|
11
|
+
sodipodi:docname="logo.dark.shapes.svg"
|
|
12
|
+
inkscape:export-xdpi="196"
|
|
13
|
+
inkscape:export-ydpi="196"
|
|
14
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
15
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
16
|
+
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
17
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
18
|
+
xmlns:svg="http://www.w3.org/2000/svg"
|
|
19
|
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
20
|
+
xmlns:cc="http://creativecommons.org/ns#"
|
|
21
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
|
22
|
+
<defs
|
|
23
|
+
id="defs832">
|
|
24
|
+
<linearGradient
|
|
25
|
+
inkscape:collect="always"
|
|
26
|
+
id="linearGradient1406">
|
|
27
|
+
<stop
|
|
28
|
+
style="stop-color:#ff0844;stop-opacity:1"
|
|
29
|
+
offset="0"
|
|
30
|
+
id="stop1402" />
|
|
31
|
+
<stop
|
|
32
|
+
style="stop-color:#ffb199;stop-opacity:1"
|
|
33
|
+
offset="1"
|
|
34
|
+
id="stop1404" />
|
|
35
|
+
</linearGradient>
|
|
36
|
+
<linearGradient
|
|
37
|
+
inkscape:collect="always"
|
|
38
|
+
xlink:href="#linearGradient1406"
|
|
39
|
+
id="linearGradient1408"
|
|
40
|
+
x1="22.054907"
|
|
41
|
+
y1="91.071762"
|
|
42
|
+
x2="88.956696"
|
|
43
|
+
y2="91.071762"
|
|
44
|
+
gradientUnits="userSpaceOnUse"
|
|
45
|
+
gradientTransform="matrix(0.55486097,0,0,0.08820435,-12.237407,57.908781)" />
|
|
46
|
+
</defs>
|
|
47
|
+
<sodipodi:namedview
|
|
48
|
+
id="base"
|
|
49
|
+
pagecolor="#ffffff"
|
|
50
|
+
bordercolor="#666666"
|
|
51
|
+
borderopacity="1.0"
|
|
52
|
+
inkscape:pageopacity="0.0"
|
|
53
|
+
inkscape:pageshadow="2"
|
|
54
|
+
inkscape:zoom="3.959798"
|
|
55
|
+
inkscape:cx="215.41503"
|
|
56
|
+
inkscape:cy="25.885159"
|
|
57
|
+
inkscape:document-units="mm"
|
|
58
|
+
inkscape:current-layer="layer1"
|
|
59
|
+
showgrid="false"
|
|
60
|
+
fit-margin-top="0"
|
|
61
|
+
fit-margin-left="0"
|
|
62
|
+
fit-margin-right="0"
|
|
63
|
+
fit-margin-bottom="0"
|
|
64
|
+
inkscape:window-width="1920"
|
|
65
|
+
inkscape:window-height="1131"
|
|
66
|
+
inkscape:window-x="1920"
|
|
67
|
+
inkscape:window-y="0"
|
|
68
|
+
inkscape:window-maximized="1"
|
|
69
|
+
inkscape:pagecheckerboard="true"
|
|
70
|
+
inkscape:showpageshadow="2"
|
|
71
|
+
inkscape:deskcolor="#d1d1d1" />
|
|
72
|
+
<metadata
|
|
73
|
+
id="metadata835">
|
|
74
|
+
<rdf:RDF>
|
|
75
|
+
<cc:Work
|
|
76
|
+
rdf:about="">
|
|
77
|
+
<dc:format>image/svg+xml</dc:format>
|
|
78
|
+
<dc:type
|
|
79
|
+
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
80
|
+
</cc:Work>
|
|
81
|
+
</rdf:RDF>
|
|
82
|
+
</metadata>
|
|
83
|
+
<g
|
|
84
|
+
inkscape:label="Layer 1"
|
|
85
|
+
inkscape:groupmode="layer"
|
|
86
|
+
id="layer1"
|
|
87
|
+
transform="translate(0,-52.518974)">
|
|
88
|
+
<g
|
|
89
|
+
aria-label="RASCAL"
|
|
90
|
+
id="text1385"
|
|
91
|
+
style="font-size:10.5833px;line-height:1.25;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';letter-spacing:0px;word-spacing:0px;fill:#ffffff;stroke-width:0.264583">
|
|
92
|
+
<path
|
|
93
|
+
d="M 0.13229038,52.645973 H 2.979198 q 0.6085397,0 1.0847882,0.253999 0.4762485,0.254 0.7514143,0.73554 0.2804574,0.476248 0.2804574,1.137704 0,0.661457 -0.2381242,1.084789 -0.2328326,0.41804 -0.5609149,0.629706 -0.3280823,0.206374 -0.6085397,0.248707 l 1.6986195,2.894533 H 3.6089043 L 2.0954925,56.858126 H 1.7144937 v 2.772825 H 0.13229038 Z m 1.58220332,3.116782 h 0.6984977 q 0.423332,0 0.740831,-0.206374 0.317499,-0.206375 0.317499,-0.730248 0,-0.523873 -0.3122073,-0.724956 -0.3122074,-0.206374 -0.7355394,-0.206374 h -0.709081 z"
|
|
94
|
+
style="font-weight:bold"
|
|
95
|
+
id="path286" />
|
|
96
|
+
<path
|
|
97
|
+
d="m 8.1808791,52.645973 h 1.57162 l 2.7569499,6.984978 H 10.821412 L 10.313414,58.228664 H 7.6252559 l -0.51329,1.402287 h -1.693328 z m -0.026458,4.196278 H 9.7895407 L 8.9799182,54.550967 h -0.015875 z"
|
|
98
|
+
style="font-weight:bold"
|
|
99
|
+
id="path288" />
|
|
100
|
+
<path
|
|
101
|
+
d="m 15.610365,52.518974 q 0.650873,0 1.137705,0.142874 0.486831,0.142875 0.783164,0.301624 0.296332,0.15875 0.359832,0.211666 l -0.761998,1.275288 q -0.08467,-0.0635 -0.29104,-0.185208 -0.201083,-0.121708 -0.481541,-0.216958 -0.275165,-0.09525 -0.576789,-0.09525 -0.407457,0 -0.661457,0.148166 -0.248707,0.142874 -0.248707,0.428624 0,0.195791 0.132291,0.35454 0.137583,0.153458 0.412749,0.296332 0.280457,0.137583 0.709081,0.301624 0.391582,0.142875 0.735539,0.338666 0.343957,0.195791 0.603248,0.465665 0.264583,0.264583 0.418041,0.613832 0.153457,0.349249 0.153457,0.793747 0,0.529165 -0.216957,0.920747 -0.216958,0.386291 -0.592665,0.64029 -0.370415,0.253999 -0.846664,0.375707 -0.470957,0.127 -0.978955,0.127 -0.719665,0 -1.291163,-0.164042 -0.566206,-0.164041 -0.915455,-0.35454 -0.349249,-0.1905 -0.41804,-0.253999 l 0.788455,-1.328204 q 0.0635,0.04762 0.243416,0.153457 0.185208,0.105833 0.449791,0.22225 0.264582,0.111124 0.560914,0.190499 0.301624,0.07937 0.592665,0.07937 0.486832,0 0.730248,-0.185208 0.243416,-0.190499 0.243416,-0.497415 0,-0.227541 -0.153458,-0.407457 -0.153458,-0.179916 -0.460374,-0.338666 -0.306915,-0.164041 -0.767289,-0.343957 -0.460373,-0.185208 -0.862539,-0.44979 -0.396874,-0.264583 -0.645581,-0.661456 -0.248708,-0.396874 -0.248708,-0.984247 0,-0.587373 0.328083,-1.015997 0.333374,-0.433915 0.873122,-0.666748 0.54504,-0.232832 1.164163,-0.232832 z"
|
|
102
|
+
style="font-weight:bold"
|
|
103
|
+
id="path290" />
|
|
104
|
+
<path
|
|
105
|
+
d="m 22.685299,58.191622 q 0.486832,0 0.883705,-0.142874 0.402166,-0.142875 0.597957,-0.280458 l 0.677331,1.344079 q -0.248708,0.211666 -0.851956,0.428624 -0.597956,0.216958 -1.423453,0.216958 -0.772581,0 -1.449913,-0.269875 -0.677331,-0.269874 -1.195912,-0.756706 -0.51329,-0.492123 -0.809623,-1.148288 -0.291041,-0.661456 -0.291041,-1.434037 0,-0.772581 0.291041,-1.434037 0.291041,-0.666748 0.804331,-1.158871 0.518582,-0.492123 1.195913,-0.761998 0.682623,-0.275165 1.455204,-0.275165 0.825497,0 1.423453,0.216957 0.603248,0.216958 0.851956,0.428624 l -0.677331,1.344079 q -0.195791,-0.142875 -0.597957,-0.280458 -0.396873,-0.142874 -0.883705,-0.142874 -0.539748,0 -0.941914,0.169333 -0.402165,0.164041 -0.672039,0.455082 -0.269875,0.29104 -0.402166,0.656164 -0.132291,0.365124 -0.132291,0.767289 0,0.407457 0.132291,0.777873 0.132291,0.365124 0.402166,0.656164 0.269874,0.291041 0.672039,0.460374 0.402166,0.164041 0.941914,0.164041 z"
|
|
106
|
+
style="font-weight:bold"
|
|
107
|
+
id="path292" />
|
|
108
|
+
<path
|
|
109
|
+
d="m 28.072206,52.645973 h 1.57162 l 2.756949,6.984978 H 30.712739 L 30.20474,58.228664 h -2.688158 l -0.51329,1.402287 h -1.693328 z m -0.02646,4.196278 h 1.63512 l -0.809622,-2.291284 h -0.01587 z"
|
|
110
|
+
style="font-weight:bold"
|
|
111
|
+
id="path294" />
|
|
112
|
+
<path
|
|
113
|
+
d="m 32.99874,52.645973 h 1.582203 v 5.598566 h 2.5347 v 1.386412 H 32.99874 Z"
|
|
114
|
+
style="font-weight:bold"
|
|
115
|
+
id="path296" />
|
|
116
|
+
</g>
|
|
117
|
+
<rect
|
|
118
|
+
style="fill:url(#linearGradient1408);fill-opacity:1;stroke:none;stroke-width:0.0221227;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
119
|
+
id="rect1387"
|
|
120
|
+
width="37.121189"
|
|
121
|
+
height="1.2668874"
|
|
122
|
+
x="-3.5874547e-15"
|
|
123
|
+
y="65.308289" />
|
|
124
|
+
</g>
|
|
125
|
+
</svg>
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
3
|
+
|
|
4
|
+
<svg
|
|
5
|
+
width="37.115643mm"
|
|
6
|
+
height="14.056203mm"
|
|
7
|
+
viewBox="0 0 37.115641 14.056203"
|
|
8
|
+
version="1.1"
|
|
9
|
+
id="svg838"
|
|
10
|
+
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
|
11
|
+
sodipodi:docname="logo.dark.text.svg"
|
|
12
|
+
inkscape:export-xdpi="196"
|
|
13
|
+
inkscape:export-ydpi="196"
|
|
14
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
15
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
16
|
+
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
17
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
18
|
+
xmlns:svg="http://www.w3.org/2000/svg"
|
|
19
|
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
20
|
+
xmlns:cc="http://creativecommons.org/ns#"
|
|
21
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
|
22
|
+
<defs
|
|
23
|
+
id="defs832">
|
|
24
|
+
<linearGradient
|
|
25
|
+
inkscape:collect="always"
|
|
26
|
+
id="linearGradient1406">
|
|
27
|
+
<stop
|
|
28
|
+
style="stop-color:#ff0844;stop-opacity:1"
|
|
29
|
+
offset="0"
|
|
30
|
+
id="stop1402" />
|
|
31
|
+
<stop
|
|
32
|
+
style="stop-color:#ffb199;stop-opacity:1"
|
|
33
|
+
offset="1"
|
|
34
|
+
id="stop1404" />
|
|
35
|
+
</linearGradient>
|
|
36
|
+
<linearGradient
|
|
37
|
+
inkscape:collect="always"
|
|
38
|
+
xlink:href="#linearGradient1406"
|
|
39
|
+
id="linearGradient1408"
|
|
40
|
+
x1="22.054907"
|
|
41
|
+
y1="91.071762"
|
|
42
|
+
x2="88.956696"
|
|
43
|
+
y2="91.071762"
|
|
44
|
+
gradientUnits="userSpaceOnUse"
|
|
45
|
+
gradientTransform="matrix(0.55486097,0,0,0.08820435,-12.237407,57.908781)" />
|
|
46
|
+
</defs>
|
|
47
|
+
<sodipodi:namedview
|
|
48
|
+
id="base"
|
|
49
|
+
pagecolor="#ffffff"
|
|
50
|
+
bordercolor="#666666"
|
|
51
|
+
borderopacity="1.0"
|
|
52
|
+
inkscape:pageopacity="0.0"
|
|
53
|
+
inkscape:pageshadow="2"
|
|
54
|
+
inkscape:zoom="3.959798"
|
|
55
|
+
inkscape:cx="215.41503"
|
|
56
|
+
inkscape:cy="25.885159"
|
|
57
|
+
inkscape:document-units="mm"
|
|
58
|
+
inkscape:current-layer="layer1"
|
|
59
|
+
showgrid="false"
|
|
60
|
+
fit-margin-top="0"
|
|
61
|
+
fit-margin-left="0"
|
|
62
|
+
fit-margin-right="0"
|
|
63
|
+
fit-margin-bottom="0"
|
|
64
|
+
inkscape:window-width="1920"
|
|
65
|
+
inkscape:window-height="1131"
|
|
66
|
+
inkscape:window-x="1920"
|
|
67
|
+
inkscape:window-y="0"
|
|
68
|
+
inkscape:window-maximized="1"
|
|
69
|
+
inkscape:pagecheckerboard="true"
|
|
70
|
+
inkscape:showpageshadow="2"
|
|
71
|
+
inkscape:deskcolor="#d1d1d1" />
|
|
72
|
+
<metadata
|
|
73
|
+
id="metadata835">
|
|
74
|
+
<rdf:RDF>
|
|
75
|
+
<cc:Work
|
|
76
|
+
rdf:about="">
|
|
77
|
+
<dc:format>image/svg+xml</dc:format>
|
|
78
|
+
<dc:type
|
|
79
|
+
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
80
|
+
</cc:Work>
|
|
81
|
+
</rdf:RDF>
|
|
82
|
+
</metadata>
|
|
83
|
+
<g
|
|
84
|
+
inkscape:label="Layer 1"
|
|
85
|
+
inkscape:groupmode="layer"
|
|
86
|
+
id="layer1"
|
|
87
|
+
transform="translate(0,-52.518974)">
|
|
88
|
+
<text
|
|
89
|
+
xml:space="preserve"
|
|
90
|
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583"
|
|
91
|
+
x="-0.27516666"
|
|
92
|
+
y="59.630951"
|
|
93
|
+
id="text1385"><tspan
|
|
94
|
+
sodipodi:role="line"
|
|
95
|
+
id="tspan1383"
|
|
96
|
+
x="-0.27516666"
|
|
97
|
+
y="59.630951"
|
|
98
|
+
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.264583">RASCAL</tspan></text>
|
|
99
|
+
<rect
|
|
100
|
+
style="fill:url(#linearGradient1408);fill-opacity:1;stroke:none;stroke-width:0.0221227;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
101
|
+
id="rect1387"
|
|
102
|
+
width="37.121189"
|
|
103
|
+
height="1.2668874"
|
|
104
|
+
x="-3.5874547e-15"
|
|
105
|
+
y="65.308289" />
|
|
106
|
+
</g>
|
|
107
|
+
</svg>
|