regexgen 0.1.1 → 0.2.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: bd258fd9b15bddbe8a07ca2636332049cb1861b13003b847704134426bae5575
4
- data.tar.gz: b8d8d34569d6fb1c939c410d6963688507f06b5f27c50f2a8822268fee0dc28c
3
+ metadata.gz: 712b188ebb53ab6fd9ddc10b42eae54b87312ee1a27fb2af0740141f8e054414
4
+ data.tar.gz: 63b927e179f6e7eb058b50d037ed2c963c1abbb39e68b91b6e09e5104b36df91
5
5
  SHA512:
6
- metadata.gz: 82a41dfd15da1004cec3ca972eaef09cf198d5d6a55c75c0ef46ba64fb47e57ab14ae99d0d30a2acbe3f66ebc852edd4b6c32e6893b4f8bb76d7ed6f60737af9
7
- data.tar.gz: 0afef5a51a5b6b7015f21486527cc8de29bb950f68aec3be0fbee7c37f229f2ea04afedb14fc644215e8183d7bbf55c5a383e2417f3d5f023cf1886d90fd2836
6
+ metadata.gz: 077127e3bca3854f569e6452cb5db39e54b83faf134795b92cfc34f785890c3bd2de995bd06dab8c3cc3eacde2aea60c94fcb720233701d05831056e47396065
7
+ data.tar.gz: bc5df49ef540c19765602270278a0338dbd3725039174fbc220ec9814c5af1e0ecb6c650c2f68915b711e600163acdc69fab022c506109e76440ee95adaf0ad5
@@ -0,0 +1,4 @@
1
+ ;;; Directory Local Variables
2
+ ;;; For more information see (info "(emacs) Directory Variables")
3
+
4
+ ((ruby-mode . ((lsp-solargraph-use-bundler . t))))
@@ -21,3 +21,5 @@ jobs:
21
21
  run: bundle exec rake test
22
22
  - name: Lint
23
23
  run: bundle exec rubocop
24
+ - name: Type check
25
+ run: bundle exec solargraph typecheck --level typed
@@ -0,0 +1,17 @@
1
+ ---
2
+ include:
3
+ - "**/*.rb"
4
+ exclude:
5
+ - spec/**/*
6
+ - test/**/*
7
+ - vendor/**/*
8
+ - ".bundle/**/*"
9
+ require: []
10
+ domains: []
11
+ reporters:
12
+ - rubocop
13
+ - require_not_found
14
+ - typecheck:typed
15
+ require_paths: []
16
+ plugins: []
17
+ max_files: 5000
@@ -1,20 +1,30 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- regexgen (0.1.1)
4
+ regexgen (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  ast (2.4.1)
10
+ backport (1.1.2)
11
+ benchmark (0.1.0)
10
12
  byebug (11.1.3)
13
+ e2mmap (0.1.0)
14
+ jaro_winkler (1.5.4)
15
+ maruku (0.7.3)
16
+ mini_portile2 (2.4.0)
11
17
  minitest (5.14.1)
18
+ nokogiri (1.10.10)
19
+ mini_portile2 (~> 2.4.0)
12
20
  parallel (1.19.2)
13
21
  parser (2.7.1.4)
14
22
  ast (~> 2.4.1)
15
23
  rainbow (3.0.0)
16
24
  rake (12.3.3)
17
25
  regexp_parser (1.7.1)
26
+ reverse_markdown (2.0.0)
27
+ nokogiri
18
28
  rexml (3.2.4)
19
29
  rubocop (0.89.0)
20
30
  parallel (~> 1.10)
@@ -28,7 +38,24 @@ GEM
28
38
  rubocop-ast (0.3.0)
29
39
  parser (>= 2.7.1.4)
30
40
  ruby-progressbar (1.10.1)
41
+ solargraph (0.39.13)
42
+ backport (~> 1.1)
43
+ benchmark
44
+ bundler (>= 1.17.2)
45
+ e2mmap
46
+ jaro_winkler (~> 1.5)
47
+ maruku (~> 0.7, >= 0.7.3)
48
+ nokogiri (~> 1.9, >= 1.9.1)
49
+ parser (~> 2.3)
50
+ reverse_markdown (>= 1.0.5, < 3)
51
+ rubocop (~> 0.52)
52
+ thor (~> 1.0)
53
+ tilt (~> 2.0)
54
+ yard (~> 0.9, >= 0.9.24)
55
+ thor (1.0.1)
56
+ tilt (2.0.10)
31
57
  unicode-display_width (1.7.0)
58
+ yard (0.9.25)
32
59
 
33
60
  PLATFORMS
34
61
  ruby
@@ -39,6 +66,7 @@ DEPENDENCIES
39
66
  rake (~> 12.0)
40
67
  regexgen!
41
68
  rubocop (~> 0.89)
69
+ solargraph (~> 0.39)
42
70
 
43
71
  BUNDLED WITH
44
72
  2.1.4
data/README.md CHANGED
@@ -29,6 +29,19 @@ require 'regexgen'
29
29
  Regexgen.generate(['foobar', 'foobaz', 'foozap', 'fooza']) #=> /foo(?:zap?|ba[rz])/
30
30
  ```
31
31
 
32
+ ## CLI
33
+
34
+ `regexgen` also has a simple CLI to generate regexes using inputs from the
35
+ command line.
36
+
37
+ ```sh
38
+ $ regexgen
39
+ usage: regexgen [-mix] strings...
40
+ -m Multiline flag
41
+ -i Case-insensitive flag
42
+ -x Extended flag
43
+ ```
44
+
32
45
  ## Unicode handling
33
46
 
34
47
  Unlike the JavaScript version, this package does not do any special Unicode
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'regexgen'
5
+ require 'optparse'
6
+
7
+ REGEX_FLAGS = {
8
+ 'm' => 'Multiline flag',
9
+ 'i' => 'Case-insensitive flag',
10
+ 'x' => 'Extended flag'
11
+ }.freeze
12
+
13
+ flags = []
14
+ op = OptionParser.new do |opts|
15
+ opts.banner = "usage: regexgen [-#{REGEX_FLAGS.keys.join}] strings..."
16
+ REGEX_FLAGS.each do |flag, description|
17
+ opts.on("-#{flag}", description) { |_| flags << flag }
18
+ end
19
+ end
20
+
21
+ begin
22
+ op.parse!
23
+ rescue OptionParser::InvalidOption => e
24
+ puts e, op.help
25
+ exit(1)
26
+ end
27
+
28
+ if ARGV.empty?
29
+ puts op.help
30
+ exit(1)
31
+ end
32
+
33
+ puts Regexgen.generate(ARGV, flags)
@@ -4,6 +4,42 @@ require 'regexgen/ast'
4
4
 
5
5
  module Regexgen
6
6
  class<<self
7
+ # Brzozowski algebraic method
8
+ # https://cs.stackexchange.com/a/2392
9
+ #
10
+ # Largely ported from
11
+ # https://github.com/devongovett/regexgen/blob/7ef10aef3a414b10554822cdf6e90389582b1890/src/regex.js
12
+ #
13
+ # Initialize B
14
+ #
15
+ # for i = 1 to m:
16
+ # if final(i):
17
+ # B[i] := ε
18
+ # else:
19
+ # B[i] := ∅
20
+ #
21
+ # Initialize A
22
+ #
23
+ # for i = 1 to m:
24
+ # for j = 1 to m:
25
+ # for a in Σ:
26
+ # if trans(i, a, j):
27
+ # A[i,j] := a
28
+ # else:
29
+ # A[i,j] := ∅
30
+ #
31
+ # Solve
32
+ #
33
+ # for n = m decreasing to 1:
34
+ # B[n] := star(A[n,n]) . B[n]
35
+ # for j = 1 to n:
36
+ # A[n,j] := star(A[n,n]) . A[n,j];
37
+ # for i = 1 to n:
38
+ # B[i] += A[i,n] . B[n]
39
+ # for j = 1 to n:
40
+ # A[i,j] += A[i,n] . A[n,j]
41
+ #
42
+ # Result is e := B[1]
7
43
  def to_regex(root)
8
44
  states = root.visit.to_a
9
45
 
@@ -22,7 +58,7 @@ module Regexgen
22
58
 
23
59
  (states.length - 1).downto(0) do |n|
24
60
  if a[n][n]
25
- b[n] = concat(star(a[n][n], b[n]))
61
+ b[n] = concat(star(a[n][n]), b[n])
26
62
  (0...n).each do |j|
27
63
  a[n][j] = concat(start(a[n][n]), a[n][j])
28
64
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Regexgen
4
- VERSION = '0.1.1'
4
+ VERSION = '0.2.0'
5
5
  end
@@ -27,4 +27,5 @@ Gem::Specification.new do |spec|
27
27
 
28
28
  spec.add_development_dependency 'byebug', '~> 11'
29
29
  spec.add_development_dependency 'rubocop', '~> 0.89'
30
+ spec.add_development_dependency 'solargraph', '~> 0.39'
30
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: regexgen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Madlon-Kay
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-10 00:00:00.000000000 Z
11
+ date: 2020-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0.89'
41
+ - !ruby/object:Gem::Dependency
42
+ name: solargraph
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.39'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.39'
41
55
  description:
42
56
  email:
43
57
  - aaron@madlon-kay.com
@@ -45,11 +59,13 @@ executables: []
45
59
  extensions: []
46
60
  extra_rdoc_files: []
47
61
  files:
62
+ - ".dir-locals.el"
48
63
  - ".github/workflows/main.yml"
49
64
  - ".gitignore"
50
65
  - ".rubocop.yml"
51
66
  - ".rubocop_todo.yml"
52
67
  - ".ruby-version"
68
+ - ".solargraph.yml"
53
69
  - ".travis.yml"
54
70
  - Gemfile
55
71
  - Gemfile.lock
@@ -57,6 +73,7 @@ files:
57
73
  - README.md
58
74
  - Rakefile
59
75
  - bin/console
76
+ - bin/regexgen
60
77
  - bin/setup
61
78
  - lib/regexgen.rb
62
79
  - lib/regexgen/ast.rb