minidusen 0.11.1 → 1.0.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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +55 -48
  3. data/.ruby-version +1 -1
  4. data/CHANGELOG.md +6 -0
  5. data/Gemfile.6.1.mysql2.lock +2 -2
  6. data/Gemfile.6.1.pg.lock +2 -2
  7. data/Gemfile.7.0.mysql2.lock +2 -2
  8. data/Gemfile.7.0.pg.lock +2 -2
  9. data/{Gemfile.6.0.mysql2 → Gemfile.7.1.mysql2} +2 -2
  10. data/Gemfile.7.1.mysql2.lock +81 -0
  11. data/{Gemfile.6.0.pg → Gemfile.7.1.pg} +2 -2
  12. data/Gemfile.7.1.pg.lock +81 -0
  13. data/{Gemfile.4.2.mysql2 → Gemfile.7.2.mysql2} +4 -4
  14. data/Gemfile.7.2.mysql2.lock +83 -0
  15. data/{Gemfile.4.2.pg → Gemfile.7.2.pg} +3 -3
  16. data/Gemfile.7.2.pg.lock +83 -0
  17. data/Gemfile.8.0.mysql2 +15 -0
  18. data/Gemfile.8.0.mysql2.lock +87 -0
  19. data/Gemfile.8.0.pg +15 -0
  20. data/Gemfile.8.0.pg.lock +87 -0
  21. data/README.md +21 -6
  22. data/lib/minidusen/parser.rb +4 -2
  23. data/lib/minidusen/syntax.rb +14 -3
  24. data/lib/minidusen/token.rb +5 -0
  25. data/lib/minidusen/util.rb +2 -2
  26. data/lib/minidusen/version.rb +1 -1
  27. data/media/logo.dark.shapes.svg +137 -0
  28. data/media/logo.dark.text.svg +107 -0
  29. data/media/logo.light.shapes.svg +136 -0
  30. data/media/logo.light.text.svg +106 -0
  31. data/media/makandra-with-bottom-margin.dark.svg +180 -0
  32. data/media/makandra-with-bottom-margin.light.svg +180 -0
  33. data/spec/minidusen/filter_spec.rb +8 -0
  34. data/spec/minidusen/parser_spec.rb +8 -0
  35. data/spec/support/database.github.yml +2 -2
  36. metadata +21 -15
  37. data/Gemfile.4.2.mysql2.lock +0 -69
  38. data/Gemfile.4.2.pg.lock +0 -69
  39. data/Gemfile.5.2.mysql2 +0 -16
  40. data/Gemfile.5.2.mysql2.lock +0 -68
  41. data/Gemfile.5.2.pg +0 -16
  42. data/Gemfile.5.2.pg.lock +0 -68
  43. data/Gemfile.6.0.mysql2.lock +0 -67
  44. data/Gemfile.6.0.pg.lock +0 -67
@@ -0,0 +1,87 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ minidusen (0.11.2)
5
+ activerecord (>= 3.2)
6
+ activesupport (>= 3.2)
7
+ edge_rider (>= 0.2.5)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ activemodel (8.0.1)
13
+ activesupport (= 8.0.1)
14
+ activerecord (8.0.1)
15
+ activemodel (= 8.0.1)
16
+ activesupport (= 8.0.1)
17
+ timeout (>= 0.4.0)
18
+ activesupport (8.0.1)
19
+ base64
20
+ benchmark (>= 0.3)
21
+ bigdecimal
22
+ concurrent-ruby (~> 1.0, >= 1.3.1)
23
+ connection_pool (>= 2.2.5)
24
+ drb
25
+ i18n (>= 1.6, < 2)
26
+ logger (>= 1.4.2)
27
+ minitest (>= 5.1)
28
+ securerandom (>= 0.3)
29
+ tzinfo (~> 2.0, >= 2.0.5)
30
+ uri (>= 0.13.1)
31
+ base64 (0.2.0)
32
+ benchmark (0.4.0)
33
+ bigdecimal (3.1.8)
34
+ byebug (11.1.3)
35
+ concurrent-ruby (1.3.4)
36
+ connection_pool (2.4.1)
37
+ database_cleaner (2.0.2)
38
+ database_cleaner-active_record (>= 2, < 3)
39
+ database_cleaner-active_record (2.2.0)
40
+ activerecord (>= 5.a)
41
+ database_cleaner-core (~> 2.0.0)
42
+ database_cleaner-core (2.0.1)
43
+ diff-lcs (1.5.1)
44
+ drb (2.2.1)
45
+ edge_rider (2.3.0)
46
+ activerecord (>= 3.2)
47
+ gemika (0.8.3)
48
+ i18n (1.14.5)
49
+ concurrent-ruby (~> 1.0)
50
+ logger (1.6.1)
51
+ minitest (5.25.1)
52
+ mysql2 (0.5.6)
53
+ rake (13.2.1)
54
+ rspec (3.13.0)
55
+ rspec-core (~> 3.13.0)
56
+ rspec-expectations (~> 3.13.0)
57
+ rspec-mocks (~> 3.13.0)
58
+ rspec-core (3.13.1)
59
+ rspec-support (~> 3.13.0)
60
+ rspec-expectations (3.13.2)
61
+ diff-lcs (>= 1.2.0, < 2.0)
62
+ rspec-support (~> 3.13.0)
63
+ rspec-mocks (3.13.1)
64
+ diff-lcs (>= 1.2.0, < 2.0)
65
+ rspec-support (~> 3.13.0)
66
+ rspec-support (3.13.1)
67
+ securerandom (0.3.1)
68
+ timeout (0.4.3)
69
+ tzinfo (2.0.6)
70
+ concurrent-ruby (~> 1.0)
71
+ uri (1.0.2)
72
+
73
+ PLATFORMS
74
+ x86_64-linux
75
+
76
+ DEPENDENCIES
77
+ activerecord (~> 8.0.1)
78
+ byebug
79
+ database_cleaner
80
+ gemika
81
+ minidusen!
82
+ mysql2 (~> 0.5)
83
+ rake
84
+ rspec (~> 3.5)
85
+
86
+ BUNDLED WITH
87
+ 2.5.6
data/Gemfile.8.0.pg ADDED
@@ -0,0 +1,15 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Runtime dependencies
4
+ gem 'activerecord', '~>8.0.1'
5
+ gem 'pg', '~> 1.4.0'
6
+
7
+ # Development dependencies
8
+ gem 'rake'
9
+ gem 'database_cleaner'
10
+ gem 'rspec', '~>3.5'
11
+ gem 'byebug'
12
+ gem 'gemika'
13
+
14
+ # Gem under test
15
+ gem 'minidusen', :path => '.'
@@ -0,0 +1,87 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ minidusen (0.11.2)
5
+ activerecord (>= 3.2)
6
+ activesupport (>= 3.2)
7
+ edge_rider (>= 0.2.5)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ activemodel (8.0.1)
13
+ activesupport (= 8.0.1)
14
+ activerecord (8.0.1)
15
+ activemodel (= 8.0.1)
16
+ activesupport (= 8.0.1)
17
+ timeout (>= 0.4.0)
18
+ activesupport (8.0.1)
19
+ base64
20
+ benchmark (>= 0.3)
21
+ bigdecimal
22
+ concurrent-ruby (~> 1.0, >= 1.3.1)
23
+ connection_pool (>= 2.2.5)
24
+ drb
25
+ i18n (>= 1.6, < 2)
26
+ logger (>= 1.4.2)
27
+ minitest (>= 5.1)
28
+ securerandom (>= 0.3)
29
+ tzinfo (~> 2.0, >= 2.0.5)
30
+ uri (>= 0.13.1)
31
+ base64 (0.2.0)
32
+ benchmark (0.4.0)
33
+ bigdecimal (3.1.8)
34
+ byebug (11.1.3)
35
+ concurrent-ruby (1.3.4)
36
+ connection_pool (2.4.1)
37
+ database_cleaner (2.0.2)
38
+ database_cleaner-active_record (>= 2, < 3)
39
+ database_cleaner-active_record (2.2.0)
40
+ activerecord (>= 5.a)
41
+ database_cleaner-core (~> 2.0.0)
42
+ database_cleaner-core (2.0.1)
43
+ diff-lcs (1.5.1)
44
+ drb (2.2.1)
45
+ edge_rider (2.3.0)
46
+ activerecord (>= 3.2)
47
+ gemika (0.8.3)
48
+ i18n (1.14.5)
49
+ concurrent-ruby (~> 1.0)
50
+ logger (1.6.1)
51
+ minitest (5.25.1)
52
+ pg (1.4.6)
53
+ rake (13.2.1)
54
+ rspec (3.13.0)
55
+ rspec-core (~> 3.13.0)
56
+ rspec-expectations (~> 3.13.0)
57
+ rspec-mocks (~> 3.13.0)
58
+ rspec-core (3.13.1)
59
+ rspec-support (~> 3.13.0)
60
+ rspec-expectations (3.13.2)
61
+ diff-lcs (>= 1.2.0, < 2.0)
62
+ rspec-support (~> 3.13.0)
63
+ rspec-mocks (3.13.1)
64
+ diff-lcs (>= 1.2.0, < 2.0)
65
+ rspec-support (~> 3.13.0)
66
+ rspec-support (3.13.1)
67
+ securerandom (0.3.1)
68
+ timeout (0.4.3)
69
+ tzinfo (2.0.6)
70
+ concurrent-ruby (~> 1.0)
71
+ uri (1.0.2)
72
+
73
+ PLATFORMS
74
+ ruby
75
+
76
+ DEPENDENCIES
77
+ activerecord (~> 8.0.1)
78
+ byebug
79
+ database_cleaner
80
+ gemika
81
+ minidusen!
82
+ pg (~> 1.4.0)
83
+ rake
84
+ rspec (~> 3.5)
85
+
86
+ BUNDLED WITH
87
+ 2.5.6
data/README.md CHANGED
@@ -1,5 +1,20 @@
1
- Minidusen [![Tests](https://github.com/makandra/minidusen/workflows/Tests/badge.svg)](https://github.com/makandra/minidusen/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="210" alt="Minidusen" role="heading" aria-level="1" src="media/logo.light.shapes.svg">
14
+ </picture>
15
+ </p>
16
+
17
+ [![Tests](https://github.com/makandra/minidusen/workflows/Tests/badge.svg)](https://github.com/makandra/minidusen/actions)
3
18
 
4
19
  Low-tech search solution for ActiveRecord with MySQL or PostgreSQL
5
20
  ------------------------------------------------------------------
@@ -9,7 +24,7 @@ It works with your existing MySQL or PostgreSQL schema by mostly relying on simp
9
24
 
10
25
  This makes Minidusen a quick way to implement find-as-you-type filters for index views:
11
26
 
12
- ![A list of records filtered by a query](https://raw.githubusercontent.com/makandra/minidusen/master/doc/filtered_index_view.cropped.png)
27
+ ![A list of records filtered by a query](https://raw.githubusercontent.com/makandra/minidusen/main/doc/filtered_index_view.cropped.png)
13
28
 
14
29
 
15
30
  ### Supported queries
@@ -219,10 +234,10 @@ Supported Rails versions
219
234
 
220
235
  Minidusen is tested on:
221
236
 
222
- - Rails 4.2
223
- - Rails 5.2
224
- - Rails 6.0
225
237
  - Rails 6.1
238
+ - Rails 7.0
239
+ - Rails 7.1
240
+ - Rails 7.2
226
241
  - MySQL 5.6
227
242
  - PostgreSQL
228
243
 
@@ -42,9 +42,10 @@ module Minidusen
42
42
 
43
43
  def extract_text_query_tokens(query_string, query)
44
44
  while query_string.sub!(TEXT_QUERY, '')
45
+ phrase = !$2.nil?
45
46
  value = "#{$2}#{$4}"
46
47
  exclude = "#{$1}#{$3}" == "-"
47
- options = { :field => 'text', :value => value, :exclude => exclude }
48
+ options = { :field => 'text', :value => value, :exclude => exclude, :phrase => phrase }
48
49
  query << Token.new(options)
49
50
  end
50
51
  end
@@ -52,9 +53,10 @@ module Minidusen
52
53
  def extract_field_query_tokens(query_string, query)
53
54
  while query_string.sub!(FIELD_QUERY, '')
54
55
  field = $2
56
+ phrase = !$4.nil?
55
57
  value = "#{$4}#{$6}"
56
58
  exclude = "#{$1}" == "-"
57
- options = { :field => field, :value => value, :exclude => exclude }
59
+ options = { :field => field, :value => value, :exclude => exclude, :phrase => phrase }
58
60
  query << Token.new(options)
59
61
  end
60
62
  end
@@ -3,6 +3,7 @@ module Minidusen
3
3
 
4
4
  def initialize
5
5
  @scopers = {}
6
+ @alias_count = 0
6
7
  end
7
8
 
8
9
  def learn_field(field, &scoper)
@@ -45,9 +46,19 @@ module Minidusen
45
46
 
46
47
  def append_excludes(instance, matches, exclude_query)
47
48
  excluded_records = apply_query(instance, matches.origin_class, exclude_query)
48
- qualified_id_field = Util.qualify_column_name(excluded_records, excluded_records.primary_key)
49
- exclude_sql = "#{qualified_id_field} NOT IN (#{excluded_records.select(qualified_id_field).to_sql})"
50
- matches.where(exclude_sql)
49
+ primary_key = excluded_records.primary_key
50
+ join_alias = "exclude_#{@alias_count += 1}"
51
+ # due to performance reasons on big tables this needs to be implemented as an anti-join
52
+ # will generate SQL like
53
+ # LEFT JOIN (SELECT "users"."id" FROM "users" WHERE $condition) excluded
54
+ # ON "users"."id" = "excluded"."id"
55
+ # WHERE "excluded"."id" IS NULL
56
+ matches
57
+ .joins(<<~SQL)
58
+ LEFT JOIN (#{excluded_records.select(primary_key).to_sql}) #{join_alias}
59
+ ON #{Util.qualify_column_name(excluded_records, primary_key)} = #{Util.qualify_column_name(excluded_records, primary_key, table_name: join_alias)}
60
+ SQL
61
+ .where(join_alias => { primary_key => nil })
51
62
  end
52
63
 
53
64
  end
@@ -7,6 +7,7 @@ module Minidusen
7
7
  @value = options.fetch(:value)
8
8
  @exclude = options.fetch(:exclude, false)
9
9
  @field = options.fetch(:field).to_s
10
+ @phrase = options.fetch(:phrase, false)
10
11
  end
11
12
 
12
13
  def to_s
@@ -21,5 +22,9 @@ module Minidusen
21
22
  exclude
22
23
  end
23
24
 
25
+ def phrase?
26
+ @phrase
27
+ end
28
+
24
29
  end
25
30
  end
@@ -41,10 +41,10 @@ module Minidusen
41
41
  escape_with_backslash(phrase, ['%', '_'])
42
42
  end
43
43
 
44
- def qualify_column_name(model, column_name)
44
+ def qualify_column_name(model, column_name, table_name: model.table_name)
45
45
  column_name = column_name.to_s
46
46
  unless column_name.include?('.')
47
- quoted_table_name = model.connection.quote_table_name(model.table_name)
47
+ quoted_table_name = model.connection.quote_table_name(table_name)
48
48
  quoted_column_name = model.connection.quote_column_name(column_name)
49
49
  column_name = "#{quoted_table_name}.#{quoted_column_name}"
50
50
  end
@@ -1,3 +1,3 @@
1
1
  module Minidusen
2
- VERSION = '0.11.1'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -0,0 +1,137 @@
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="53.366352mm"
14
+ height="14.056225mm"
15
+ viewBox="0 0 53.366351 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(0.79761275,0,0,0.08820435,-17.591275,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="11.2"
56
+ inkscape:cx="234.58341"
57
+ inkscape:cy="-11.16366"
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,-52.518951)">
88
+ <g
89
+ aria-label="MINIDUSEN"
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 7.6041248,52.645951 v 6.985 H 6.0272082 v -4.111625 l 0.068792,-1.169458 -0.269875,1.338791 -1.1747499,3.381375 H 3.1009166 l -1.1694583,-3.381375 -0.2645834,-1.338791 0.068792,1.169458 v 4.111625 H 0.15345833 v -6.985 H 2.3759583 l 1.4075833,4.661958 0.09525,0.555625 0.09525,-0.555625 1.4075833,-4.661958 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 8.9217348,52.645951 h 1.5822082 v 6.985 H 8.9217348 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 13.192091,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.582209 v 6.985 h -2.169584 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.436255,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 22.256693,52.645951 h 2.100792 q 1.116541,0 1.846791,0.449792 0.735542,0.4445 1.100667,1.232958 0.365125,0.788458 0.365125,1.804458 0,1.021292 -0.365125,1.80975 -0.365125,0.788459 -1.100667,1.23825 -0.73025,0.449792 -1.846791,0.449792 h -2.100792 z m 1.576917,1.402292 v 4.180416 h 0.381 q 0.597958,0 0.989541,-0.269875 0.391584,-0.275166 0.587375,-0.746125 0.201084,-0.47625 0.201084,-1.068916 0,-0.597959 -0.195792,-1.068917 -0.1905,-0.47625 -0.587375,-0.751417 -0.396875,-0.275166 -0.994833,-0.275166 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 32.633632,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"
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 37.877668,52.518951 q 0.650875,0 1.137709,0.142875 0.486833,0.142875 0.783166,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.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.603249,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.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"
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 41.253748,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"
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 48.376312,54.095868 0.116417,0.02117 v 5.513917 h -1.582208 v -6.985 h 2.159 l 2.831041,5.503333 -0.116416,0.02117 v -5.5245 h 1.582208 v 6.985 h -2.169583 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
+ </g>
129
+ <rect
130
+ style="fill:url(#linearGradient1408);fill-opacity:1;stroke:none;stroke-width:0.02652412;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
131
+ id="rect1387"
132
+ width="53.36171"
133
+ height="1.2668874"
134
+ x="-3.5527137e-15"
135
+ y="65.308289" />
136
+ </g>
137
+ </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="53.366352mm"
14
+ height="14.056225mm"
15
+ viewBox="0 0 53.366351 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(0.79761275,0,0,0.08820435,-17.591275,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="89.6"
56
+ inkscape:cx="202.55488"
57
+ inkscape:cy="0.72003331"
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,-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">MINIDUSEN</tspan></text>
99
+ <rect
100
+ style="fill:url(#linearGradient1408);fill-opacity:1;stroke:none;stroke-width:0.02652412;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
101
+ id="rect1387"
102
+ width="53.36171"
103
+ height="1.2668874"
104
+ x="-3.5527137e-15"
105
+ y="65.308289" />
106
+ </g>
107
+ </svg>