cooklang_rb 0.2.0 → 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.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +4 -4
- data/Gemfile.lock +11 -5
- data/cooklang_rb.gemspec +1 -1
- data/lib/cooklang_rb/buffer_utils.rb +2 -0
- data/lib/cooklang_rb/cookware.rb +8 -2
- data/lib/cooklang_rb/ingredient.rb +2 -0
- data/lib/cooklang_rb/metadata.rb +47 -13
- data/lib/cooklang_rb/quantity_resolver.rb +3 -1
- data/lib/cooklang_rb/recipe.rb +7 -5
- data/lib/cooklang_rb/step.rb +2 -0
- data/lib/cooklang_rb/steppable.rb +4 -2
- data/lib/cooklang_rb/tag.rb +2 -0
- data/lib/cooklang_rb/tag_parser.rb +9 -7
- data/lib/cooklang_rb/text.rb +13 -4
- data/lib/cooklang_rb/timer.rb +2 -0
- data/lib/cooklang_rb/version.rb +1 -1
- data/lib/cooklang_rb/with_units.rb +2 -0
- data/mise.toml +2 -0
- metadata +5 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2ac6cb408b8861e6c4fd4a2914fbf3f9963d73bec3709b8ba606f21b433b7718
|
|
4
|
+
data.tar.gz: 01ccce52c0abd3fedeb5475638ebf980eada4fa7fd16310a057b4d8f9f6a6587
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4c475efce306341ed0d7bda2e5a58ba041d019ca6acd8a054804a9219e3718fea465416e2dba2014fa28afb061a6658cf9f380f17e5a9f88425031dd99c8915c
|
|
7
|
+
data.tar.gz: 9153d68be70eaf0fefd91621d0039565b05f171cb56ce9718a24cb0249e0a975d5c7815e8af85a4caf487dee7128c9d96d46e185846efdfd0fc1a79fd496cf6e
|
data/.github/workflows/main.yml
CHANGED
|
@@ -6,22 +6,22 @@ on:
|
|
|
6
6
|
- '*'
|
|
7
7
|
push:
|
|
8
8
|
branches:
|
|
9
|
-
-
|
|
9
|
+
- main
|
|
10
10
|
|
|
11
11
|
jobs:
|
|
12
12
|
build:
|
|
13
13
|
runs-on: ubuntu-latest
|
|
14
14
|
strategy:
|
|
15
15
|
matrix:
|
|
16
|
-
ruby: ['
|
|
16
|
+
ruby: ['3.3', '3.4', '4.0']
|
|
17
17
|
steps:
|
|
18
|
-
- uses: actions/checkout@
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
19
|
- name: Set up Ruby
|
|
20
20
|
uses: ruby/setup-ruby@v1
|
|
21
21
|
with:
|
|
22
22
|
ruby-version: ${{ matrix.ruby }}
|
|
23
23
|
- name: Run the default task
|
|
24
24
|
run: |
|
|
25
|
-
gem install bundler
|
|
25
|
+
gem install bundler
|
|
26
26
|
bundle install
|
|
27
27
|
bundle exec rake
|
data/Gemfile.lock
CHANGED
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
cooklang_rb (0.
|
|
4
|
+
cooklang_rb (1.0.0)
|
|
5
5
|
|
|
6
6
|
GEM
|
|
7
7
|
remote: https://rubygems.org/
|
|
8
8
|
specs:
|
|
9
|
-
minitest (5.
|
|
10
|
-
rake (13.
|
|
9
|
+
minitest (5.27.0)
|
|
10
|
+
rake (13.3.1)
|
|
11
11
|
|
|
12
12
|
PLATFORMS
|
|
13
|
-
|
|
13
|
+
arm64-darwin-25
|
|
14
|
+
ruby
|
|
14
15
|
|
|
15
16
|
DEPENDENCIES
|
|
16
17
|
cooklang_rb!
|
|
17
18
|
minitest (~> 5.0)
|
|
18
19
|
rake (~> 13.0)
|
|
19
20
|
|
|
21
|
+
CHECKSUMS
|
|
22
|
+
cooklang_rb (1.0.0)
|
|
23
|
+
minitest (5.27.0) sha256=2d3b17f8a36fe7801c1adcffdbc38233b938eb0b4966e97a6739055a45fa77d5
|
|
24
|
+
rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c
|
|
25
|
+
|
|
20
26
|
BUNDLED WITH
|
|
21
|
-
|
|
27
|
+
4.0.6
|
data/cooklang_rb.gemspec
CHANGED
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
|
|
|
12
12
|
spec.description = "A cooklang parser for Ruby"
|
|
13
13
|
spec.homepage = "https://github.com/drbragg/cooklang_rb"
|
|
14
14
|
spec.license = "MIT"
|
|
15
|
-
spec.required_ruby_version = Gem::Requirement.new(">=
|
|
15
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 3.3.0")
|
|
16
16
|
|
|
17
17
|
spec.metadata["homepage_uri"] = spec.homepage
|
|
18
18
|
spec.metadata["source_code_uri"] = spec.homepage
|
data/lib/cooklang_rb/cookware.rb
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require_relative "tag"
|
|
4
|
+
require_relative "with_units"
|
|
2
5
|
|
|
3
6
|
module CooklangRb
|
|
4
7
|
class Cookware < Tag
|
|
5
|
-
|
|
8
|
+
include WithUnits
|
|
9
|
+
|
|
10
|
+
attr_reader :name, :quantity, :units
|
|
6
11
|
|
|
7
12
|
def self.tag
|
|
8
13
|
COOKWARE_TAG
|
|
9
14
|
end
|
|
10
15
|
|
|
11
|
-
def initialize(name:, quantity:
|
|
16
|
+
def initialize(name:, quantity: 1, units: "")
|
|
12
17
|
@name = clean_name(name)
|
|
13
18
|
@quantity = resolve_quantity(quantity, default: 1)
|
|
19
|
+
@units = clean_units(units)
|
|
14
20
|
end
|
|
15
21
|
end
|
|
16
22
|
end
|
data/lib/cooklang_rb/metadata.rb
CHANGED
|
@@ -1,29 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module CooklangRb
|
|
2
4
|
class Metadata
|
|
3
|
-
|
|
4
|
-
|
|
5
|
+
DELIMITER = "---"
|
|
6
|
+
ENTRY_PATTERN = /^(?<key>.+?):\s*(?<value>.+)$/
|
|
5
7
|
|
|
6
|
-
def initialize(
|
|
7
|
-
@
|
|
8
|
+
def initialize(source)
|
|
9
|
+
@source = source
|
|
8
10
|
@metadata = {}
|
|
9
11
|
end
|
|
10
12
|
|
|
11
13
|
def parse
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
if valid_metadata_block?
|
|
15
|
+
extract_metadata
|
|
16
|
+
strip_metadata_block
|
|
17
|
+
else
|
|
18
|
+
collapse_invalid_delimiters
|
|
16
19
|
end
|
|
17
20
|
|
|
18
|
-
@metadata
|
|
21
|
+
[@metadata, @source]
|
|
19
22
|
end
|
|
20
23
|
|
|
21
24
|
private
|
|
22
25
|
|
|
23
|
-
def
|
|
24
|
-
@
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
def valid_metadata_block?
|
|
27
|
+
@source.start_with?("#{DELIMITER}\n")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def extract_metadata
|
|
31
|
+
lines = metadata_lines
|
|
32
|
+
lines.each do |line|
|
|
33
|
+
match = line.match(ENTRY_PATTERN)
|
|
34
|
+
next unless match
|
|
35
|
+
|
|
36
|
+
@metadata[match[:key].strip] = match[:value].strip
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def metadata_lines
|
|
41
|
+
closing = @source.index("\n#{DELIMITER}", DELIMITER.length)
|
|
42
|
+
return [] unless closing
|
|
43
|
+
|
|
44
|
+
block = @source[DELIMITER.length + 1...closing]
|
|
45
|
+
block.split("\n")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def strip_metadata_block
|
|
49
|
+
closing = @source.index("\n#{DELIMITER}", DELIMITER.length)
|
|
50
|
+
return unless closing
|
|
51
|
+
|
|
52
|
+
end_pos = closing + 1 + DELIMITER.length
|
|
53
|
+
end_pos += 1 if @source[end_pos] == "\n"
|
|
54
|
+
@source = @source[end_pos..]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def collapse_invalid_delimiters
|
|
58
|
+
@source = @source.gsub(/---\n(.*?\n)?---(?:\n|\z)/m) do |match|
|
|
59
|
+
match.tr("\n", " ").rstrip
|
|
60
|
+
end
|
|
27
61
|
end
|
|
28
62
|
end
|
|
29
63
|
end
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module QuantityResolver
|
|
2
4
|
def resolve_quantity(quantity, default: "")
|
|
3
5
|
return default if quantity.nil?
|
|
4
6
|
return quantity if quantity.is_a? Numeric
|
|
5
7
|
|
|
6
|
-
quantity.strip
|
|
8
|
+
quantity = quantity.strip if quantity.respond_to?(:strip)
|
|
7
9
|
|
|
8
10
|
if quantity.include?(".")
|
|
9
11
|
quantity.to_f
|
data/lib/cooklang_rb/recipe.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require "strscan"
|
|
2
4
|
|
|
3
5
|
require_relative "metadata"
|
|
@@ -15,7 +17,7 @@ module CooklangRb
|
|
|
15
17
|
end
|
|
16
18
|
|
|
17
19
|
def initialize(source)
|
|
18
|
-
@source = source
|
|
20
|
+
@source = source.dup
|
|
19
21
|
@steps = []
|
|
20
22
|
@metadata = {}
|
|
21
23
|
parse
|
|
@@ -31,12 +33,11 @@ module CooklangRb
|
|
|
31
33
|
private
|
|
32
34
|
|
|
33
35
|
def parse
|
|
36
|
+
gather_metadata
|
|
34
37
|
remove_comments
|
|
35
38
|
|
|
36
39
|
@buffer = StringScanner.new(@source)
|
|
37
40
|
|
|
38
|
-
gather_metadata
|
|
39
|
-
|
|
40
41
|
until end_of_buffer?
|
|
41
42
|
parse_data
|
|
42
43
|
end
|
|
@@ -44,7 +45,8 @@ module CooklangRb
|
|
|
44
45
|
|
|
45
46
|
def remove_comments
|
|
46
47
|
@source.gsub!(/\[-.*-\]/, "")
|
|
47
|
-
@source.gsub!(
|
|
48
|
+
@source.gsub!(/^[[:blank:]]*(?<!-)--(?!-).*\n/, "")
|
|
49
|
+
@source.gsub!(/(?<!-)--(?!-).*\n/, " ")
|
|
48
50
|
end
|
|
49
51
|
|
|
50
52
|
def parse_data
|
|
@@ -61,7 +63,7 @@ module CooklangRb
|
|
|
61
63
|
end
|
|
62
64
|
|
|
63
65
|
def gather_metadata
|
|
64
|
-
@metadata = Metadata.new(@
|
|
66
|
+
@metadata, @source = Metadata.new(@source).parse
|
|
65
67
|
end
|
|
66
68
|
end
|
|
67
69
|
end
|
data/lib/cooklang_rb/step.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Steppable
|
|
2
4
|
def self.included(base)
|
|
3
5
|
base.include InstanceMethods
|
|
@@ -6,7 +8,7 @@ module Steppable
|
|
|
6
8
|
|
|
7
9
|
module InstanceMethods
|
|
8
10
|
def to_step
|
|
9
|
-
data = {
|
|
11
|
+
data = {"type" => type}
|
|
10
12
|
attributes.each do |key|
|
|
11
13
|
data[key.to_s] = send key
|
|
12
14
|
end
|
|
@@ -26,7 +28,7 @@ module Steppable
|
|
|
26
28
|
def attr_reader(*vars)
|
|
27
29
|
@attributes ||= []
|
|
28
30
|
@attributes.concat vars
|
|
29
|
-
super
|
|
31
|
+
super
|
|
30
32
|
end
|
|
31
33
|
|
|
32
34
|
def attributes
|
data/lib/cooklang_rb/tag.rb
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module TagParser
|
|
2
|
-
NAME = "(?<name>[
|
|
3
|
-
MULTI_NAME = "(?<name>[^@#~{]+)"
|
|
4
|
-
QUANTITY = "(?<quantity>[^%}]*)?"
|
|
5
|
-
UNITS = "(?<units>[^}]+)?"
|
|
6
|
-
TIMER_TAG = "~"
|
|
7
|
-
INGREDIENT_TAG = "@"
|
|
8
|
-
COOKWARE_TAG = "#"
|
|
4
|
+
NAME = "(?<name>[^\\t\\n\\r\\f\\v\\p{Zs}\\p{P}]+)"
|
|
5
|
+
MULTI_NAME = "(?<name>[^@#~{]+)"
|
|
6
|
+
QUANTITY = "(?<quantity>[^%}]*)?"
|
|
7
|
+
UNITS = "(?<units>[^}]+)?"
|
|
8
|
+
TIMER_TAG = "~"
|
|
9
|
+
INGREDIENT_TAG = "@"
|
|
10
|
+
COOKWARE_TAG = "#"
|
|
9
11
|
|
|
10
12
|
def self.included(base)
|
|
11
13
|
base.include InstanceMethods
|
data/lib/cooklang_rb/text.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require_relative "steppable"
|
|
2
4
|
|
|
3
5
|
module CooklangRb
|
|
@@ -6,12 +8,19 @@ module CooklangRb
|
|
|
6
8
|
|
|
7
9
|
attr_reader :value
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
TAG_BOUNDARY = /[@#~](?=[^\p{Zs}\s])|\n/
|
|
10
12
|
|
|
11
13
|
def self.parse_from(buffer)
|
|
12
|
-
text = buffer.scan_until
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
text = buffer.scan_until TAG_BOUNDARY
|
|
15
|
+
|
|
16
|
+
if text
|
|
17
|
+
text = text.chop
|
|
18
|
+
buffer.pos -= 1 unless buffer.eos?
|
|
19
|
+
else
|
|
20
|
+
text = buffer.rest
|
|
21
|
+
buffer.terminate
|
|
22
|
+
end
|
|
23
|
+
|
|
15
24
|
new text.chomp
|
|
16
25
|
end
|
|
17
26
|
|
data/lib/cooklang_rb/timer.rb
CHANGED
data/lib/cooklang_rb/version.rb
CHANGED
data/mise.toml
ADDED
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cooklang_rb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Drew Bragg
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: exe
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies: []
|
|
13
12
|
description: A cooklang parser for Ruby
|
|
14
13
|
email:
|
|
@@ -43,6 +42,7 @@ files:
|
|
|
43
42
|
- lib/cooklang_rb/timer.rb
|
|
44
43
|
- lib/cooklang_rb/version.rb
|
|
45
44
|
- lib/cooklang_rb/with_units.rb
|
|
45
|
+
- mise.toml
|
|
46
46
|
homepage: https://github.com/drbragg/cooklang_rb
|
|
47
47
|
licenses:
|
|
48
48
|
- MIT
|
|
@@ -50,7 +50,6 @@ metadata:
|
|
|
50
50
|
homepage_uri: https://github.com/drbragg/cooklang_rb
|
|
51
51
|
source_code_uri: https://github.com/drbragg/cooklang_rb
|
|
52
52
|
changelog_uri: https://github.com/drbragg/cooklang_rb/blob/main/CHANGELOG.md
|
|
53
|
-
post_install_message:
|
|
54
53
|
rdoc_options: []
|
|
55
54
|
require_paths:
|
|
56
55
|
- lib
|
|
@@ -58,15 +57,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
58
57
|
requirements:
|
|
59
58
|
- - ">="
|
|
60
59
|
- !ruby/object:Gem::Version
|
|
61
|
-
version:
|
|
60
|
+
version: 3.3.0
|
|
62
61
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
63
62
|
requirements:
|
|
64
63
|
- - ">="
|
|
65
64
|
- !ruby/object:Gem::Version
|
|
66
65
|
version: '0'
|
|
67
66
|
requirements: []
|
|
68
|
-
rubygems_version:
|
|
69
|
-
signing_key:
|
|
67
|
+
rubygems_version: 4.0.3
|
|
70
68
|
specification_version: 4
|
|
71
69
|
summary: A cooklang parser for Ruby
|
|
72
70
|
test_files: []
|