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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 22c78d7c9292f897efdaba2a08b29dfc00d9a2aede627ddd06ca0462bd1236c3
4
- data.tar.gz: 5c5872e06dad5a8cbe24e5db69aa45ec11cf1bfba7908c4a6f72215d4c2e6599
3
+ metadata.gz: d916ce222f77cd89927ad3ac8ceb56da9d34d87f2f808938b6c796ce92ab3d8b
4
+ data.tar.gz: 070e9c46b5f33074260638ba1b2e5bb19844c515461788ae904d4b1e72690a7e
5
5
  SHA512:
6
- metadata.gz: 82ffaf3d2c09d6be60674d5066e5b9694e7be4f3693f68bc8ff96bdbc60c461023a8e60d5d090bb51df89d7a5fdc1c502c24ee8127a6ae1c44c2b81dd77e14b7
7
- data.tar.gz: e2e7f8c122a9e6a97c804502ae81e8143751471f404201aa6b99587d41ff166b87465d31d026809a152f3ba707c7e8a1cd3484f9b6788a0fc2eb22a0a1ec3dc4
6
+ metadata.gz: 7cd38cd621c764d5d8548e4093abc1be639713efc2294b7e80b7fec5d7cdb37648569258c6b8725b604ddcbc756b5916d26b2e6577f8e33a03b100d522b5d957
7
+ data.tar.gz: '00299e9e4c118a754e0b5227c04d2400d7424a551cddaebc24a1fb85c5649e6c7913835e26754f73d663a4ab50b345ed322198f6f4552c3e3f21d318196cf511'
@@ -8,17 +8,17 @@ on:
8
8
  - main
9
9
  jobs:
10
10
  test:
11
- runs-on: ubuntu-20.04
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
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
@@ -9,6 +9,7 @@ gem 'rake', '~> 13.0'
9
9
  gem 'rspec'
10
10
  gem 'cucumber'
11
11
  gem 'aruba'
12
+ gem 'logger'
12
13
 
13
14
  gem 'guard-rspec'
14
15
  gem 'guard-cucumber'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rascal (0.3.8)
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
- # Rascal [![Tests](https://github.com/makandra/rascal/workflows/Tests/badge.svg)](https://github.com/makandra/rascal/actions)
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
+ [![Tests](https://github.com/makandra/rascal/workflows/Tests/badge.svg)](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.
@@ -0,0 +1,15 @@
1
+ require 'rascal'
2
+
3
+ module Rascal
4
+ module CLI
5
+ class Environments < Base
6
+ include IOHelper
7
+
8
+ def run
9
+ environment_definition.available_environment_names.each do |name|
10
+ say name
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -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, 'rascal/cli/base'
6
- autoload :Clean, 'rascal/cli/clean'
7
- autoload :Main, 'rascal/cli/main'
8
- autoload :Shell, 'rascal/cli/shell'
9
- autoload :Update, 'rascal/cli/update'
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),
@@ -30,6 +30,7 @@ module Rascal
30
30
  unless allow_failure || exit_status.success?
31
31
  raise Error, "docker container run failed"
32
32
  end
33
+ exit_status
33
34
  end
34
35
 
35
36
  private
@@ -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
-
@@ -1,3 +1,3 @@
1
1
  module Rascal
2
- VERSION = "0.3.8"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -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>