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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 369e119fc8519a25a662143c5101fa77a877c6621faae48829d1933522f2fdb9
4
- data.tar.gz: 4223c5f8ac7cdfd7c350bcc243aa8c2d4daa2f2c7090d49395a64a852e58bbe6
3
+ metadata.gz: 2ac6cb408b8861e6c4fd4a2914fbf3f9963d73bec3709b8ba606f21b433b7718
4
+ data.tar.gz: 01ccce52c0abd3fedeb5475638ebf980eada4fa7fd16310a057b4d8f9f6a6587
5
5
  SHA512:
6
- metadata.gz: d1f5b4a42b1e84b3aaaa535c51a134f618cf36c9dd65dbfced720775269330d0e3ac25815c35817f7d873d809ef4e0850397e49ff9862d88c0d523d83251c040
7
- data.tar.gz: 857a2e1fc4681a8b844b596e0716ab0fc5eed0f66557428c4372d58ccfbd0b19f05d080642bd33cb5e2012bdae3aad32f39dc0b99c746e25dba452e3ea6a9823
6
+ metadata.gz: 4c475efce306341ed0d7bda2e5a58ba041d019ca6acd8a054804a9219e3718fea465416e2dba2014fa28afb061a6658cf9f380f17e5a9f88425031dd99c8915c
7
+ data.tar.gz: 9153d68be70eaf0fefd91621d0039565b05f171cb56ce9718a24cb0249e0a975d5c7815e8af85a4caf487dee7128c9d96d46e185846efdfd0fc1a79fd496cf6e
@@ -6,22 +6,22 @@ on:
6
6
  - '*'
7
7
  push:
8
8
  branches:
9
- - master
9
+ - main
10
10
 
11
11
  jobs:
12
12
  build:
13
13
  runs-on: ubuntu-latest
14
14
  strategy:
15
15
  matrix:
16
- ruby: ['2.5', '2.6', '2.7', '3.0']
16
+ ruby: ['3.3', '3.4', '4.0']
17
17
  steps:
18
- - uses: actions/checkout@v2
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 -v 2.2.3
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.2.0)
4
+ cooklang_rb (1.0.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- minitest (5.15.0)
10
- rake (13.0.6)
9
+ minitest (5.27.0)
10
+ rake (13.3.1)
11
11
 
12
12
  PLATFORMS
13
- x86_64-darwin-20
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
- 2.2.3
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(">= 2.5.0")
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BufferUtils
2
4
  def end_of_line?
3
5
  @buffer.peek(1) == "\n"
@@ -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
- attr_reader :name, :quantity
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: 1)
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "tag"
2
4
  require_relative "with_units"
3
5
 
@@ -1,29 +1,63 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module CooklangRb
2
4
  class Metadata
3
- TAG = ">>".freeze
4
- PATTERN = /^#{TAG}\s*(?<key>.+?):\s*(?<value>.+)\n/
5
+ DELIMITER = "---"
6
+ ENTRY_PATTERN = /^(?<key>.+?):\s*(?<value>.+)$/
5
7
 
6
- def initialize(buffer)
7
- @buffer = buffer
8
+ def initialize(source)
9
+ @source = source
8
10
  @metadata = {}
9
11
  end
10
12
 
11
13
  def parse
12
- return @metadata unless @buffer.match? PATTERN
13
-
14
- until @buffer.peek(2) != TAG
15
- add_metadata
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 add_metadata
24
- @buffer.scan(PATTERN)
25
- key, value = @buffer.captures.map(&:strip)
26
- @metadata[key] = value
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! if quantity.respond_to?(:strip!)
8
+ quantity = quantity.strip if quantity.respond_to?(:strip)
7
9
 
8
10
  if quantity.include?(".")
9
11
  quantity.to_f
@@ -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!(/--.*\n/, "\n")
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(@buffer).parse
66
+ @metadata, @source = Metadata.new(@source).parse
65
67
  end
66
68
  end
67
69
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "ingredient"
2
4
  require_relative "cookware"
3
5
  require_relative "timer"
@@ -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 = { "type" => type }
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(*vars)
31
+ super
30
32
  end
31
33
 
32
34
  def attributes
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "tag_parser"
2
4
  require_relative "steppable"
3
5
  require_relative "quantity_resolver"
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TagParser
2
- NAME = "(?<name>[^\s]+)".freeze
3
- MULTI_NAME = "(?<name>[^@#~{]+)".freeze
4
- QUANTITY = "(?<quantity>[^%}]*)?".freeze
5
- UNITS = "(?<units>[^}]+)?".freeze
6
- TIMER_TAG = "~".freeze
7
- INGREDIENT_TAG = "@".freeze
8
- COOKWARE_TAG = "#".freeze
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
@@ -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
- TAGS = /[@#~]|\n/
11
+ TAG_BOUNDARY = /[@#~](?=[^\p{Zs}\s])|\n/
10
12
 
11
13
  def self.parse_from(buffer)
12
- text = buffer.scan_until TAGS
13
- text = text&.sub(TAGS, "") || buffer.rest
14
- buffer.pos = buffer.pos - 1 unless buffer.eos?
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
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "tag"
2
4
  require_relative "with_units"
3
5
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CooklangRb
4
- VERSION = "0.2.0"
4
+ VERSION = "1.0.0"
5
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WithUnits
2
4
  def self.included(base)
3
5
  base.include InstanceMethods
data/mise.toml ADDED
@@ -0,0 +1,2 @@
1
+ [tools]
2
+ ruby = "4.0.1"
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.2.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: 2022-04-04 00:00:00.000000000 Z
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: 2.5.0
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: 3.2.3
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: []