assignable_values 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 974063fe5e304e09553d556f1eae415a7908f16bc026e713e811cb8180bc7510
4
- data.tar.gz: 5754483e8d63baace26522a6e7885c750e0010a21ee87ce795421a917e0823d6
3
+ metadata.gz: 50d91e6c4106d54f8633e3a77ccb71e8965e4c22201574980eaf15ffea0ed7ac
4
+ data.tar.gz: 57d2765dab9e0b60030c08822ee55e478b5c0acb6e7601047047219da2efcabc
5
5
  SHA512:
6
- metadata.gz: 13628f9ab3a4fbe96db3a2accfd2be3d00ac711994ece3694c3e3e3d15cf46c94def5e6f53270bd1b9242eb6bae40381b545c70ca68f62bc6d032415107d3918
7
- data.tar.gz: 30833906903fb6291aad2157615631e76880a3df3d6342a057fc9993b021caa4d49173c13910aec5349b98d0af4647087fc4e18b26a7c7caba4a34b236cb9c81
6
+ metadata.gz: a32ca256400f51a6d6fd9654cb745003608394aede06a92b58af2de81f1ac42147137c59de775f5d730e882c770fa1921e0f0c3272c7c2307091d08d7b25c9f2
7
+ data.tar.gz: 0a6fb7760c54e0ae6c162002d819d0cae6c39601c5e7851444a1e5773f547b9c5d2c76e15423def89e620f601b4686ad0fd7768c35bcd1534b09856251362f87
@@ -12,7 +12,7 @@ jobs:
12
12
  runs-on: ubuntu-20.04
13
13
  services:
14
14
  mysql:
15
- image: mysql:5.6
15
+ image: mysql:5.7
16
16
  env:
17
17
  MYSQL_ROOT_PASSWORD: password
18
18
  ports:
@@ -69,11 +69,11 @@ jobs:
69
69
  - ruby: 2.7.3
70
70
  gemfile: Gemfile.6.1.pg
71
71
  - ruby: 2.7.3
72
- gemfile: Gemfile.7.0.pg
73
- - ruby: 3.2.0
72
+ gemfile: Gemfile.7.1.pg
73
+ - ruby: 3.3.0
74
74
  gemfile: Gemfile.6.1.pg
75
- - ruby: 3.2.0
76
- gemfile: Gemfile.7.0.pg
75
+ - ruby: 3.3.0
76
+ gemfile: Gemfile.7.1.pg
77
77
  env:
78
78
  BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
79
79
  steps:
@@ -84,6 +84,7 @@ jobs:
84
84
  ruby-version: "${{ matrix.ruby }}"
85
85
  - name: Setup database
86
86
  run: |
87
+ sudo apt-get update
87
88
  sudo apt-get install -y postgresql-client
88
89
  PGPASSWORD=postgres psql -c 'create database assignable_values_test;' -U postgres -p 5432 -h localhost
89
90
  - name: Bundle
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.2.0
1
+ 3.3.0
data/CHANGELOG.md CHANGED
@@ -12,6 +12,16 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html
12
12
 
13
13
  -
14
14
 
15
+ ## 1.1.0 - 2024-12-05
16
+
17
+ ### Compatible changes
18
+
19
+ - Add complete support for attributes that are available through store accessors
20
+
21
+ ## 1.0.1 - 2024-08-27
22
+
23
+ - Hook into railties correctly
24
+
15
25
  ## 1.0.0 - 2024-02-14
16
26
 
17
27
  - This gem has been in productive use for 12 years now, time for a 1.0 release! 🥳
data/Gemfile CHANGED
@@ -1 +1 @@
1
- Gemfile.7.0.pg
1
+ Gemfile.7.1.pg
data/Gemfile.5.0.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- assignable_values (1.0.0)
4
+ assignable_values (1.1.0)
5
5
  activerecord (>= 2.3)
6
6
 
7
7
  GEM
data/Gemfile.5.1.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- assignable_values (1.0.0)
4
+ assignable_values (1.1.0)
5
5
  activerecord (>= 2.3)
6
6
 
7
7
  GEM
data/Gemfile.5.1.pg.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- assignable_values (1.0.0)
4
+ assignable_values (1.1.0)
5
5
  activerecord (>= 2.3)
6
6
 
7
7
  GEM
data/Gemfile.6.1.pg.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- assignable_values (1.0.0)
4
+ assignable_values (1.1.0)
5
5
  activerecord (>= 2.3)
6
6
 
7
7
  GEM
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Runtime dependencies
4
- gem 'activerecord', '~>7.0.1'
4
+ gem 'activerecord', '~>7.1.3'
5
5
  gem 'i18n'
6
6
  gem 'pg', '~> 1.3.5'
7
7
 
@@ -1,29 +1,46 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- assignable_values (1.0.0)
4
+ assignable_values (1.1.0)
5
5
  activerecord (>= 2.3)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activemodel (7.0.4.1)
11
- activesupport (= 7.0.4.1)
12
- activerecord (7.0.4.1)
13
- activemodel (= 7.0.4.1)
14
- activesupport (= 7.0.4.1)
15
- activesupport (7.0.4.1)
10
+ activemodel (7.1.3)
11
+ activesupport (= 7.1.3)
12
+ activerecord (7.1.3)
13
+ activemodel (= 7.1.3)
14
+ activesupport (= 7.1.3)
15
+ timeout (>= 0.4.0)
16
+ activesupport (7.1.3)
17
+ base64
18
+ bigdecimal
16
19
  concurrent-ruby (~> 1.0, >= 1.0.2)
20
+ connection_pool (>= 2.2.5)
21
+ drb
17
22
  i18n (>= 1.6, < 2)
18
23
  minitest (>= 5.1)
24
+ mutex_m
19
25
  tzinfo (~> 2.0)
20
- concurrent-ruby (1.2.0)
21
- database_cleaner (1.7.0)
26
+ base64 (0.2.0)
27
+ bigdecimal (3.1.6)
28
+ concurrent-ruby (1.2.3)
29
+ connection_pool (2.4.1)
30
+ database_cleaner (2.0.2)
31
+ database_cleaner-active_record (>= 2, < 3)
32
+ database_cleaner-active_record (2.1.0)
33
+ activerecord (>= 5.a)
34
+ database_cleaner-core (~> 2.0.0)
35
+ database_cleaner-core (2.0.1)
22
36
  diff-lcs (1.3)
37
+ drb (2.2.0)
38
+ ruby2_keywords
23
39
  gemika (0.8.0)
24
- i18n (1.12.0)
40
+ i18n (1.14.1)
25
41
  concurrent-ruby (~> 1.0)
26
- minitest (5.17.0)
42
+ minitest (5.22.2)
43
+ mutex_m (0.2.0)
27
44
  pg (1.3.5)
28
45
  rake (12.3.2)
29
46
  rspec (3.8.0)
@@ -42,16 +59,18 @@ GEM
42
59
  rspec_candy (0.5.1)
43
60
  rspec
44
61
  sneaky-save
62
+ ruby2_keywords (0.0.5)
45
63
  sneaky-save (0.1.3)
46
64
  activerecord (>= 3.2.0)
47
- tzinfo (2.0.5)
65
+ timeout (0.4.1)
66
+ tzinfo (2.0.6)
48
67
  concurrent-ruby (~> 1.0)
49
68
 
50
69
  PLATFORMS
51
70
  ruby
52
71
 
53
72
  DEPENDENCIES
54
- activerecord (~> 7.0.1)
73
+ activerecord (~> 7.1.3)
55
74
  assignable_values!
56
75
  database_cleaner
57
76
  gemika (~> 0.8.0)
data/Gemfile.lock CHANGED
@@ -1 +1 @@
1
- Gemfile.7.0.pg.lock
1
+ Gemfile.7.1.pg.lock
data/README.md CHANGED
@@ -1,11 +1,27 @@
1
- assignable_values - Enums on vitamins [![Tests](https://github.com/makandra/assignable_values/workflows/Tests/badge.svg)](https://github.com/makandra/assignable_values/actions)
2
- =====================================
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="400" alt="assignable_values" role="heading" aria-level="1" src="media/logo.light.shapes.svg">
14
+ </picture>
15
+ </p>
16
+
17
+ [![Tests](https://github.com/makandra/assignable_values/workflows/Tests/badge.svg)](https://github.com/makandra/assignable_values/actions)
18
+
3
19
 
4
20
  `assignable_values` lets you restrict the values that can be assigned to attributes or associations of ActiveRecord models. You can think of it as enums where the list of allowed values is generated at runtime and the value is checked during validation.
5
21
 
6
22
  We carefully enhanced the core enum functionality with small tweaks that are useful for web forms, internationalized applications and common authorization patterns.
7
23
 
8
- `assignable_values` is tested with Rails 5.1 and 6.1 on Ruby 2.5, 2.7 and 3.0.
24
+ `assignable_values` is tested with Rails 5.1, 6.1 and 7.1 on Ruby 2.5, 2.7 and 3.3.
9
25
 
10
26
 
11
27
  Restricting scalar attributes
@@ -107,10 +107,10 @@ module AssignableValues
107
107
  end
108
108
 
109
109
  def has_previously_saved_value?(record)
110
- if record.respond_to?(:attribute_in_database)
111
- !record.new_record? # Rails >= 5.1
112
- else
113
- !record.new_record? && record.respond_to?(value_was_method) # Rails <= 5.0
110
+ if record.respond_to?(:attribute_in_database) # Rails >= 5.1
111
+ !record.new_record?
112
+ else # Rails <= 5.0
113
+ !record.new_record? && record.respond_to?(value_was_method)
114
114
  end
115
115
  end
116
116
 
@@ -119,10 +119,10 @@ module AssignableValues
119
119
  end
120
120
 
121
121
  def value_was(record)
122
- if record.respond_to?(:attribute_in_database)
123
- record.attribute_in_database(:"#{property}") # Rails >= 5.1
124
- else
125
- record.send(value_was_method) # Rails <= 5.0
122
+ if record.respond_to?(:attribute_in_database) # Rails >= 5.1
123
+ record.attribute_in_database(:"#{property}")
124
+ else # Rails <= 5.0
125
+ record.send(value_was_method)
126
126
  end
127
127
  end
128
128
 
@@ -0,0 +1,29 @@
1
+ module AssignableValues
2
+ module ActiveRecord
3
+ module Restriction
4
+ class StoreAccessorAttribute < ScalarAttribute
5
+
6
+ private
7
+
8
+ def store_identifier
9
+ @model.stored_attributes.find { |_, attrs| attrs.include?(property.to_sym) }&.first
10
+ end
11
+
12
+ def value_was_method
13
+ :"#{store_identifier}_was"
14
+ end
15
+
16
+ def value_was(record)
17
+ accessor = if record.respond_to?(:attribute_in_database) # Rails >= 5.1
18
+ record.attribute_in_database(:"#{store_identifier}")
19
+ else # Rails <= 5.0
20
+ record.send(value_was_method)
21
+ end
22
+
23
+ accessor.with_indifferent_access[property]
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
@@ -4,7 +4,14 @@ module AssignableValues
4
4
  private
5
5
 
6
6
  def assignable_values_for(property, options = {}, &values)
7
- restriction_type = belongs_to_association?(property) ? Restriction::BelongsToAssociation : Restriction::ScalarAttribute
7
+ restriction_type = if belongs_to_association?(property)
8
+ Restriction::BelongsToAssociation
9
+ elsif store_accessor_attribute?(property)
10
+ Restriction::StoreAccessorAttribute
11
+ else
12
+ Restriction::ScalarAttribute
13
+ end
14
+
8
15
  restriction_type.new(self, property, options, &values)
9
16
  end
10
17
 
@@ -13,8 +20,17 @@ module AssignableValues
13
20
  reflection && reflection.macro == :belongs_to
14
21
  end
15
22
 
23
+ def store_accessor_attribute?(property)
24
+ store_identifier_of(property).present?
25
+ end
26
+
27
+ def store_identifier_of(property)
28
+ stored_attributes.find { |_, attrs| attrs.include?(property.to_sym) }&.first
29
+ end
30
+
16
31
  end
17
32
  end
18
33
 
19
- ActiveRecord::Base.send(:extend, AssignableValues::ActiveRecord)
20
-
34
+ ActiveSupport.on_load(:active_record) do
35
+ extend(AssignableValues::ActiveRecord)
36
+ end
@@ -1,3 +1,3 @@
1
1
  module AssignableValues
2
- VERSION = '1.0.0'
2
+ VERSION = '1.1.0'
3
3
  end
@@ -5,5 +5,6 @@ require 'assignable_values/active_record'
5
5
  require 'assignable_values/active_record/restriction/base'
6
6
  require 'assignable_values/active_record/restriction/belongs_to_association'
7
7
  require 'assignable_values/active_record/restriction/scalar_attribute'
8
+ require 'assignable_values/active_record/restriction/store_accessor_attribute'
8
9
  require 'assignable_values/humanized_value'
9
10
  require 'assignable_values/humanizable_string'
@@ -0,0 +1,169 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:xlink="http://www.w3.org/1999/xlink"
11
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13
+ width="101.85382mm"
14
+ height="14.056225mm"
15
+ viewBox="0 0 101.85382 14.056225"
16
+ version="1.1"
17
+ id="svg838"
18
+ inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
19
+ sodipodi:docname="logo.dark.shapes.svg"
20
+ inkscape:export-filename="/home/henning/Projects/capybara-lockstep/media/capybara-lockstep.dark.png"
21
+ inkscape:export-xdpi="196"
22
+ inkscape:export-ydpi="196">
23
+ <defs
24
+ id="defs832">
25
+ <linearGradient
26
+ inkscape:collect="always"
27
+ id="linearGradient1406">
28
+ <stop
29
+ style="stop-color:#ff0844;stop-opacity:1"
30
+ offset="0"
31
+ id="stop1402" />
32
+ <stop
33
+ style="stop-color:#ffb199;stop-opacity:1"
34
+ offset="1"
35
+ id="stop1404" />
36
+ </linearGradient>
37
+ <linearGradient
38
+ inkscape:collect="always"
39
+ xlink:href="#linearGradient1406"
40
+ id="linearGradient1408"
41
+ x1="22.054907"
42
+ y1="91.071762"
43
+ x2="88.956696"
44
+ y2="91.071762"
45
+ gradientUnits="userSpaceOnUse"
46
+ gradientTransform="matrix(1.5174713,0,0,0.08820435,-33.467691,57.908781)" />
47
+ </defs>
48
+ <sodipodi:namedview
49
+ id="base"
50
+ pagecolor="#ffffff"
51
+ bordercolor="#666666"
52
+ borderopacity="1.0"
53
+ inkscape:pageopacity="0.0"
54
+ inkscape:pageshadow="2"
55
+ inkscape:zoom="5.6"
56
+ inkscape:cx="436.45379"
57
+ inkscape:cy="-41.725401"
58
+ inkscape:document-units="mm"
59
+ inkscape:current-layer="layer1"
60
+ showgrid="false"
61
+ fit-margin-top="0"
62
+ fit-margin-left="0"
63
+ fit-margin-right="0"
64
+ fit-margin-bottom="0"
65
+ inkscape:window-width="2560"
66
+ inkscape:window-height="1391"
67
+ inkscape:window-x="1920"
68
+ inkscape:window-y="0"
69
+ inkscape:window-maximized="1"
70
+ inkscape:pagecheckerboard="true" />
71
+ <metadata
72
+ id="metadata835">
73
+ <rdf:RDF>
74
+ <cc:Work
75
+ rdf:about="">
76
+ <dc:format>image/svg+xml</dc:format>
77
+ <dc:type
78
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
79
+ <dc:title></dc:title>
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.33337499,-52.518951)">
88
+ <g
89
+ aria-label="ASSIGNABLE_VALUES"
90
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;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.26458332"
91
+ id="text1385">
92
+ <path
93
+ d="m 2.4288749,52.645951 h 1.571625 l 2.7569582,6.985 H 5.0694165 l -0.508,-1.402292 H 1.8732499 l -0.5132916,1.402292 h -1.69333329 z m -0.026458,4.196292 H 4.0375415 L 3.2279166,54.550951 h -0.015875 z"
94
+ 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.26458332"
95
+ id="path822" />
96
+ <path
97
+ d="m 9.8583639,52.518951 q 0.6508751,0 1.1377081,0.142875 0.486834,0.142875 0.783167,0.301625 0.296333,0.15875 0.359833,0.211667 l -0.762,1.275291 q -0.08467,-0.0635 -0.291041,-0.185208 -0.201084,-0.121708 -0.481542,-0.216958 -0.275167,-0.09525 -0.576792,-0.09525 -0.4074581,0 -0.661458,0.148166 -0.2487084,0.142875 -0.2487084,0.428625 0,0.195792 0.1322917,0.354542 0.1375833,0.153458 0.41275,0.296333 0.2804583,0.137584 0.7090837,0.301625 0.391583,0.142875 0.735541,0.338667 0.343959,0.195792 0.60325,0.465667 0.264584,0.264583 0.418042,0.613833 0.153458,0.34925 0.153458,0.79375 0,0.529167 -0.216958,0.92075 -0.216958,0.386292 -0.592667,0.640292 -0.370416,0.254 -0.846666,0.375708 -0.470959,0.127 -0.9789587,0.127 -0.7196667,0 -1.2911667,-0.164042 -0.5662083,-0.164041 -0.9154583,-0.354541 -0.3492499,-0.1905 -0.4180416,-0.254 L 7.810489,57.657159 q 0.0635,0.04762 0.2434167,0.153459 0.1852083,0.105833 0.4497916,0.22225 0.2645833,0.111125 0.5609167,0.1905 0.301625,0.07937 0.5926666,0.07937 0.4868334,0 0.7302504,-0.185209 0.243416,-0.1905 0.243416,-0.497416 0,-0.227542 -0.153458,-0.407459 Q 10.324031,57.032743 10.017114,56.873993 9.7101973,56.709951 9.2498223,56.530034 8.7894473,56.344826 8.3872806,56.080243 7.9904057,55.815659 7.7416973,55.418784 7.492989,55.021909 7.492989,54.434534 q 0,-0.587375 0.3280833,-1.016 0.333375,-0.433916 0.873125,-0.66675 0.5450417,-0.232833 1.1641666,-0.232833 z"
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.26458332"
99
+ id="path824" />
100
+ <path
101
+ d="m 15.779735,52.518951 q 0.650875,0 1.137709,0.142875 0.486833,0.142875 0.783166,0.301625 0.296334,0.15875 0.359834,0.211667 l -0.762,1.275291 q -0.08467,-0.0635 -0.291042,-0.185208 -0.201083,-0.121708 -0.481542,-0.216958 -0.275166,-0.09525 -0.576791,-0.09525 -0.407459,0 -0.661459,0.148166 -0.248708,0.142875 -0.248708,0.428625 0,0.195792 0.132292,0.354542 0.137583,0.153458 0.41275,0.296333 0.280458,0.137584 0.709083,0.301625 0.391583,0.142875 0.735542,0.338667 0.343958,0.195792 0.60325,0.465667 0.264583,0.264583 0.418041,0.613833 0.153459,0.34925 0.153459,0.79375 0,0.529167 -0.216959,0.92075 -0.216958,0.386292 -0.592666,0.640292 -0.370417,0.254 -0.846667,0.375708 -0.470958,0.127 -0.978958,0.127 -0.719667,0 -1.291167,-0.164042 -0.566208,-0.164041 -0.915458,-0.354541 -0.34925,-0.1905 -0.418042,-0.254 l 0.788458,-1.328209 q 0.0635,0.04762 0.243417,0.153459 0.185208,0.105833 0.449792,0.22225 0.264583,0.111125 0.560916,0.1905 0.301625,0.07937 0.592667,0.07937 0.486833,0 0.73025,-0.185209 0.243417,-0.1905 0.243417,-0.497416 0,-0.227542 -0.153459,-0.407459 -0.153458,-0.179916 -0.460375,-0.338666 -0.306916,-0.164042 -0.767291,-0.343959 -0.460375,-0.185208 -0.862542,-0.449791 -0.396875,-0.264584 -0.645583,-0.661459 -0.248709,-0.396875 -0.248709,-0.98425 0,-0.587375 0.328084,-1.016 0.333375,-0.433916 0.873125,-0.66675 0.545041,-0.232833 1.164166,-0.232833 z"
102
+ 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.26458332"
103
+ id="path826" />
104
+ <path
105
+ d="m 19.214026,52.645951 h 1.582208 v 6.985 h -1.582208 z"
106
+ 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.26458332"
107
+ id="path828" />
108
+ <path
109
+ d="m 25.331172,55.725701 h 3.561292 v 0.4445 q 0,0.751417 -0.254,1.402292 -0.248708,0.650875 -0.714375,1.143 -0.465667,0.492125 -1.11125,0.767291 -0.645583,0.275167 -1.42875,0.275167 -0.809625,0 -1.471083,-0.275167 -0.656167,-0.280458 -1.132417,-0.777875 -0.47625,-0.497416 -0.73025,-1.153583 -0.254,-0.661458 -0.254,-1.418167 0,-0.751416 0.254,-1.407583 0.254,-0.661458 0.73025,-1.153583 0.47625,-0.497417 1.132417,-0.772584 0.661458,-0.280458 1.471083,-0.280458 0.661458,0 1.164167,0.142875 0.508,0.142875 0.873125,0.381 0.365125,0.238125 0.619125,0.523875 0.254,0.280458 0.423333,0.550333 l -1.502833,0.709084 q -0.216959,-0.333375 -0.592667,-0.582084 -0.370417,-0.248708 -0.98425,-0.248708 -0.428625,0 -0.788458,0.169333 -0.354542,0.169334 -0.613834,0.465667 -0.259291,0.291042 -0.402166,0.682625 -0.137584,0.386292 -0.137584,0.820208 0,0.439209 0.137584,0.8255 0.142875,0.386292 0.402166,0.682625 0.259292,0.296334 0.613834,0.465667 0.359833,0.164042 0.788458,0.164042 0.375708,0 0.682625,-0.09525 0.306917,-0.09525 0.529167,-0.275167 0.227541,-0.179917 0.354541,-0.423333 0.132292,-0.248709 0.15875,-0.545042 h -1.778 z"
110
+ 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.26458332"
111
+ id="path830" />
112
+ <path
113
+ d="m 31.263117,54.095868 0.116417,0.02117 v 5.513917 h -1.582209 v -6.985 h 2.159 l 2.831042,5.503333 -0.116417,0.02117 v -5.5245 h 1.582208 v 6.985 h -2.169583 z"
114
+ 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.26458332"
115
+ id="path832" />
116
+ <path
117
+ d="m 39.713905,52.645951 h 1.571625 l 2.756958,6.985 h -1.688041 l -0.508,-1.402292 H 39.15828 l -0.513291,1.402292 h -1.693334 z m -0.02646,4.196292 h 1.635125 l -0.809625,-2.291292 h -0.01587 z"
118
+ 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.26458332"
119
+ id="path834" />
120
+ <path
121
+ d="m 44.640434,52.645951 h 2.397125 q 0.597958,0 1.105958,0.164042 0.513292,0.164041 0.8255,0.53975 0.3175,0.370416 0.3175,1.005416 0,0.418042 -0.15875,0.746125 -0.153458,0.328084 -0.41275,0.53975 -0.254,0.206375 -0.555625,0.275167 0.264584,0.03175 0.513292,0.153458 0.254,0.116417 0.455083,0.328084 0.206375,0.206375 0.322792,0.518583 0.121708,0.306917 0.121708,0.73025 0,0.587375 -0.264583,1.037167 -0.259292,0.4445 -0.762,0.6985 -0.497417,0.248708 -1.222375,0.248708 h -2.682875 z m 1.582208,5.720292 h 0.719667 q 0.338667,0 0.550333,-0.100542 0.216959,-0.105833 0.3175,-0.296333 0.100542,-0.195792 0.100542,-0.465667 0,-0.423333 -0.264583,-0.619125 -0.259292,-0.201083 -0.73025,-0.201083 h -0.693209 z m 0,-2.921 h 0.640292 q 0.280458,0 0.465667,-0.100542 0.1905,-0.100542 0.28575,-0.280458 0.100541,-0.185209 0.100541,-0.423334 0,-0.428625 -0.243416,-0.576791 -0.243417,-0.153459 -0.66675,-0.153459 h -0.582084 z"
122
+ 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.26458332"
123
+ id="path836" />
124
+ <path
125
+ d="m 50.556499,52.645951 h 1.582209 v 5.598583 h 2.534708 v 1.386417 h -4.116917 z"
126
+ 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.26458332"
127
+ id="path838" />
128
+ <path
129
+ d="m 55.699995,52.645951 h 4.460875 v 1.386417 h -2.883958 v 1.423458 h 2.8575 v 1.344083 h -2.8575 v 1.444625 h 2.883958 v 1.386417 h -4.460875 z"
130
+ 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.26458332"
131
+ id="path840" />
132
+ <path
133
+ d="m 60.970476,60.668118 v -0.904875 h 4.323292 v 0.904875 z"
134
+ 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.26458332"
135
+ id="path842" />
136
+ <path
137
+ d="M 69.696424,59.630951 H 67.90784 l -2.487083,-6.985 h 1.783292 l 1.598083,4.968875 1.598083,-4.968875 h 1.783292 z"
138
+ 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.26458332"
139
+ id="path844" />
140
+ <path
141
+ d="m 74.278995,52.645951 h 1.571625 l 2.756959,6.985 h -1.688042 l -0.508,-1.402292 H 73.72337 l -0.513291,1.402292 h -1.693333 z m -0.02646,4.196292 h 1.635125 l -0.809625,-2.291292 h -0.01587 z"
142
+ 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.26458332"
143
+ id="path846" />
144
+ <path
145
+ d="m 79.205528,52.645951 h 1.582208 v 5.598583 h 2.534709 v 1.386417 h -4.116917 z"
146
+ 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.26458332"
147
+ id="path848" />
148
+ <path
149
+ d="m 88.196052,52.645951 h 1.582208 v 4.291542 q 0,0.862541 -0.338666,1.497541 -0.338667,0.629709 -0.968375,0.978959 -0.629709,0.343958 -1.502834,0.343958 -0.878416,0 -1.513416,-0.343958 -0.635,-0.34925 -0.973667,-0.978959 -0.333375,-0.635 -0.333375,-1.497541 v -4.291542 h 1.576917 v 4.206875 q 0,0.47625 0.148166,0.804333 0.153459,0.328084 0.433917,0.497417 0.280458,0.164042 0.661458,0.164042 0.375709,0 0.650875,-0.164042 0.275167,-0.169333 0.423334,-0.497417 0.153458,-0.328083 0.153458,-0.804333 z"
150
+ 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.26458332"
151
+ id="path850" />
152
+ <path
153
+ d="m 90.894793,52.645951 h 4.460875 v 1.386417 h -2.883959 v 1.423458 h 2.8575 v 1.344083 h -2.8575 v 1.444625 h 2.883959 v 1.386417 h -4.460875 z"
154
+ 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.26458332"
155
+ id="path852" />
156
+ <path
157
+ d="m 99.096861,52.518951 q 0.650875,0 1.137709,0.142875 0.48683,0.142875 0.78317,0.301625 0.29633,0.15875 0.35983,0.211667 l -0.762,1.275291 q -0.0847,-0.0635 -0.29104,-0.185208 -0.20109,-0.121708 -0.481544,-0.216958 -0.275167,-0.09525 -0.576792,-0.09525 -0.407458,0 -0.661458,0.148166 -0.248709,0.142875 -0.248709,0.428625 0,0.195792 0.132292,0.354542 0.137583,0.153458 0.41275,0.296333 0.280458,0.137584 0.709083,0.301625 0.391588,0.142875 0.735538,0.338667 0.34396,0.195792 0.60325,0.465667 0.26459,0.264583 0.41805,0.613833 0.15345,0.34925 0.15345,0.79375 0,0.529167 -0.21695,0.92075 -0.21696,0.386292 -0.59267,0.640292 -0.37042,0.254 -0.846668,0.375708 -0.470958,0.127 -0.978958,0.127 -0.719667,0 -1.291167,-0.164042 -0.566208,-0.164041 -0.915458,-0.354541 -0.34925,-0.1905 -0.418042,-0.254 l 0.788459,-1.328209 q 0.0635,0.04762 0.243416,0.153459 0.185209,0.105833 0.449792,0.22225 0.264583,0.111125 0.560917,0.1905 0.301625,0.07937 0.592666,0.07937 0.486834,0 0.73025,-0.185209 0.243417,-0.1905 0.243417,-0.497416 0,-0.227542 -0.153458,-0.407459 -0.153459,-0.179916 -0.460375,-0.338666 -0.306917,-0.164042 -0.767292,-0.343959 -0.460375,-0.185208 -0.862542,-0.449791 -0.396875,-0.264584 -0.645583,-0.661459 -0.248708,-0.396875 -0.248708,-0.98425 0,-0.587375 0.328083,-1.016 0.333375,-0.433916 0.873125,-0.66675 0.545042,-0.232833 1.164167,-0.232833 z"
158
+ 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.26458332"
159
+ id="path854" />
160
+ </g>
161
+ <rect
162
+ style="fill:url(#linearGradient1408);fill-opacity:1;stroke:none;stroke-width:0.03658517;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
163
+ id="rect1387"
164
+ width="101.52154"
165
+ height="1.2668874"
166
+ x="-3.5678506e-15"
167
+ y="65.308289" />
168
+ </g>
169
+ </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
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:xlink="http://www.w3.org/1999/xlink"
11
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13
+ width="101.85382mm"
14
+ height="14.056225mm"
15
+ viewBox="0 0 101.85382 14.056225"
16
+ version="1.1"
17
+ id="svg838"
18
+ inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
19
+ sodipodi:docname="logo.dark.text.svg"
20
+ inkscape:export-filename="/home/henning/Projects/capybara-lockstep/media/capybara-lockstep.dark.png"
21
+ inkscape:export-xdpi="196"
22
+ inkscape:export-ydpi="196">
23
+ <defs
24
+ id="defs832">
25
+ <linearGradient
26
+ inkscape:collect="always"
27
+ id="linearGradient1406">
28
+ <stop
29
+ style="stop-color:#ff0844;stop-opacity:1"
30
+ offset="0"
31
+ id="stop1402" />
32
+ <stop
33
+ style="stop-color:#ffb199;stop-opacity:1"
34
+ offset="1"
35
+ id="stop1404" />
36
+ </linearGradient>
37
+ <linearGradient
38
+ inkscape:collect="always"
39
+ xlink:href="#linearGradient1406"
40
+ id="linearGradient1408"
41
+ x1="22.054907"
42
+ y1="91.071762"
43
+ x2="88.956696"
44
+ y2="91.071762"
45
+ gradientUnits="userSpaceOnUse"
46
+ gradientTransform="matrix(1.5174713,0,0,0.08820435,-33.467691,57.908781)" />
47
+ </defs>
48
+ <sodipodi:namedview
49
+ id="base"
50
+ pagecolor="#ffffff"
51
+ bordercolor="#666666"
52
+ borderopacity="1.0"
53
+ inkscape:pageopacity="0.0"
54
+ inkscape:pageshadow="2"
55
+ inkscape:zoom="5.6"
56
+ inkscape:cx="436.45379"
57
+ inkscape:cy="-41.725401"
58
+ inkscape:document-units="mm"
59
+ inkscape:current-layer="layer1"
60
+ showgrid="false"
61
+ fit-margin-top="0"
62
+ fit-margin-left="0"
63
+ fit-margin-right="0"
64
+ fit-margin-bottom="0"
65
+ inkscape:window-width="2560"
66
+ inkscape:window-height="1391"
67
+ inkscape:window-x="1920"
68
+ inkscape:window-y="0"
69
+ inkscape:window-maximized="1"
70
+ inkscape:pagecheckerboard="true" />
71
+ <metadata
72
+ id="metadata835">
73
+ <rdf:RDF>
74
+ <cc:Work
75
+ rdf:about="">
76
+ <dc:format>image/svg+xml</dc:format>
77
+ <dc:type
78
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
79
+ <dc:title></dc:title>
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.33337499,-52.518951)">
88
+ <text
89
+ xml:space="preserve"
90
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;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.26458332"
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.26458332">ASSIGNABLE_VALUES</tspan></text>
99
+ <rect
100
+ style="fill:url(#linearGradient1408);fill-opacity:1;stroke:none;stroke-width:0.03658517;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
101
+ id="rect1387"
102
+ width="101.52154"
103
+ height="1.2668874"
104
+ x="-3.5678506e-15"
105
+ y="65.308289" />
106
+ </g>
107
+ </svg>