hexpress 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 (42) hide show
  1. checksums.yaml +7 -0
  2. data/lib/hexpress.rb +97 -0
  3. data/lib/hexpress/character.rb +26 -0
  4. data/lib/hexpress/main.rb +5 -0
  5. data/lib/hexpress/modifier.rb +26 -0
  6. data/lib/hexpress/modifier/many.rb +25 -0
  7. data/lib/hexpress/modifier/one.rb +19 -0
  8. data/lib/hexpress/nested.rb +38 -0
  9. data/lib/hexpress/nested/find.rb +17 -0
  10. data/lib/hexpress/nested/matching.rb +31 -0
  11. data/lib/hexpress/value.rb +28 -0
  12. data/lib/hexpress/value/ending.rb +22 -0
  13. data/lib/hexpress/value/except.rb +22 -0
  14. data/lib/hexpress/value/starting.rb +22 -0
  15. data/lib/hexpress/value/with.rb +21 -0
  16. data/lib/hexpress/values.rb +20 -0
  17. data/lib/hexpress/values/either.rb +24 -0
  18. data/lib/hexpress/values/range.rb +28 -0
  19. data/lib/hexpress/verbal_expressions.rb +47 -0
  20. data/lib/hexpress/version.rb +3 -0
  21. data/lib/hexpress/web.rb +45 -0
  22. data/lib/hexpress/wrapped.rb +9 -0
  23. data/spec/lib/hexpress/main_spec.rb +14 -0
  24. data/spec/lib/hexpress/modifier/many_spec.rb +19 -0
  25. data/spec/lib/hexpress/modifier/one_spec.rb +21 -0
  26. data/spec/lib/hexpress/modifier_spec.rb +49 -0
  27. data/spec/lib/hexpress/nested/find_spec.rb +13 -0
  28. data/spec/lib/hexpress/nested/matching_spec.rb +15 -0
  29. data/spec/lib/hexpress/nested_spec.rb +42 -0
  30. data/spec/lib/hexpress/value/ending_spec.rb +13 -0
  31. data/spec/lib/hexpress/value/except_spec.rb +9 -0
  32. data/spec/lib/hexpress/value/starting_spec.rb +13 -0
  33. data/spec/lib/hexpress/value/with_spec.rb +9 -0
  34. data/spec/lib/hexpress/value_spec.rb +25 -0
  35. data/spec/lib/hexpress/values/either_spec.rb +9 -0
  36. data/spec/lib/hexpress/values/range_spec.rb +33 -0
  37. data/spec/lib/hexpress/values_spec.rb +22 -0
  38. data/spec/lib/hexpress/verbal_expressions_standard.rb +112 -0
  39. data/spec/lib/hexpress/version_spec.rb +7 -0
  40. data/spec/lib/hexpress_spec.rb +73 -0
  41. data/spec/spec_helper.rb +9 -0
  42. metadata +216 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 59cd6698ba5d1e610f469986e66e765b4c50583b
4
+ data.tar.gz: 00e04fcce40cc9d0eecc323d0aa02c352b48f586
5
+ SHA512:
6
+ metadata.gz: 9e8d9bd6b4098c41657c3484457213684bbea32c7f19e78e0175e10fa31422f9334775b6ecc0ce6ea9d07432c243ee4a81ada3c92a7779a59b739df9e5e56600
7
+ data.tar.gz: 40e2fcb76837dd970bbf0492bf333d881d18ad5876f628fa04b012b7eddd6a6c73cfc4bf9e890ba40f36ac42cb47e56edb8318613172ebe8adec3df2b6ac5929
@@ -0,0 +1,97 @@
1
+ class Hexpress
2
+ CHARACTERS = [:word, :digit, :space]
3
+ def initialize(&block)
4
+ @hexpressions = []
5
+ instance_exec(&block) if block_given?
6
+ end
7
+
8
+ # Matches \w
9
+ def word
10
+ add(Character.new(:word))
11
+ end
12
+
13
+ # Matches \d
14
+ def digit
15
+ add(Character.new(:digit))
16
+ end
17
+
18
+ # Matches \s
19
+ def space
20
+ add(Character.new(:space))
21
+ end
22
+
23
+ # Matches .
24
+ def any
25
+ add(Character.new(:any))
26
+ end
27
+
28
+ # Matches (?:.)*
29
+ def anything
30
+ many(Character.new(:any), 0)
31
+ end
32
+
33
+ # Matches (?:.)+
34
+ def something
35
+ many(Character.new(:any), 1)
36
+ end
37
+
38
+ # Matches \t
39
+ def tab
40
+ add(Character.new(:tab))
41
+ end
42
+
43
+ # Matches (?:(?:\n)|(?:\r\n))
44
+ def line
45
+ either(Character.new('(?:\n)'), Character.new('(?:\r\n)'))
46
+ end
47
+
48
+ CHARACTERS.each do |character|
49
+ define_method(character) do
50
+ add(Character.new(character))
51
+ end
52
+
53
+ define_method("non#{character}") do
54
+ add(Character.new(character, true))
55
+ end
56
+
57
+ define_method("#{character}s") do
58
+ many(Character.new(character))
59
+ end
60
+
61
+ define_method("non#{character}s") do
62
+ many(Character.new(character, true))
63
+ end
64
+ end
65
+
66
+ # This method returns the regular hexpression form of this object.
67
+ def to_r
68
+ Regexp.new(to_s)
69
+ end
70
+
71
+ # This method returns the string version of the regexp.
72
+ def to_s
73
+ @hexpressions.map(&:to_s).join
74
+ end
75
+
76
+ private
77
+
78
+ # This method takes an hexpression and adds it to the hexpression queue
79
+ # while returning the main object.
80
+ def add(hexpression)
81
+ tap do
82
+ @hexpressions << hexpression
83
+ end
84
+ end
85
+ end
86
+
87
+ require_relative "hexpress/character"
88
+ require_relative "hexpress/version"
89
+ require_relative "hexpress/wrapped"
90
+ require_relative "hexpress/value"
91
+ require_relative "hexpress/values"
92
+ require_relative "hexpress/nested"
93
+ require_relative "hexpress/modifier"
94
+
95
+ if defined?(Rails)
96
+ require_relative "hexpress/main"
97
+ end
@@ -0,0 +1,26 @@
1
+ class Hexpress
2
+ class Character
3
+ attr_reader :upcase
4
+ def initialize(name, upcase = false)
5
+ @value = case name
6
+ when :word then '\w'
7
+ when :digit then '\d'
8
+ when :space then '\s'
9
+ when :any then '.'
10
+ when :tab then '\t'
11
+ when :newline then '\n'
12
+ when :return then '\r'
13
+ else name
14
+ end
15
+ @upcase = upcase
16
+ end
17
+
18
+ def value
19
+ if upcase then @value.upcase else @value end
20
+ end
21
+
22
+ def to_s
23
+ value
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,5 @@
1
+ require "hexpress"
2
+
3
+ def hexp(&block)
4
+ Hexpress.new(&block)
5
+ end
@@ -0,0 +1,26 @@
1
+ class Hexpress
2
+ module Modifier
3
+ OPEN = "(?:"
4
+ CLOSE = ")"
5
+ attr_reader :operator
6
+
7
+ def open
8
+ OPEN
9
+ end
10
+
11
+ def close
12
+ CLOSE
13
+ end
14
+
15
+ def to_s
16
+ if @value
17
+ "#{open}#{value}#{close}#{operator}"
18
+ else
19
+ operator
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ require_relative "modifier/many"
26
+ require_relative "modifier/one"
@@ -0,0 +1,25 @@
1
+ class Hexpress
2
+ def many(value = nil, minimum = 1)
3
+ add_values(Modifier::Many, value, minimum)
4
+ end
5
+ alias_method :multiple, :many
6
+
7
+ module Modifier
8
+ class Many
9
+ include Value
10
+ include Modifier
11
+
12
+ def initialize(value, minimum = 1)
13
+ @value = value
14
+ @minimum = minimum
15
+ end
16
+
17
+ def operator
18
+ case @minimum
19
+ when 0 then "*"
20
+ when 1 then "+"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,19 @@
1
+ class Hexpress
2
+ def one(value = nil, &block)
3
+ add_value(Modifier::One, value, &block)
4
+ end
5
+ alias_method :maybe, :one
6
+ alias_method :possibly, :one
7
+
8
+ module Modifier
9
+ class One
10
+ include Value
11
+ include Modifier
12
+
13
+ def initialize(value)
14
+ @value = value
15
+ @operator = "?"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,38 @@
1
+ class Hexpress
2
+ private
3
+
4
+ def add_nested(hexpression, &block)
5
+ tap do
6
+ @hexpressions << hexpression.new(&block)
7
+ end
8
+ end
9
+
10
+ module Nested
11
+ include Wrapped
12
+
13
+ def delimiter
14
+ @delimiter || ""
15
+ end
16
+
17
+ def hexpression
18
+ if joinable? then join_hexpression else @hexpression end
19
+ end
20
+
21
+ def to_s
22
+ wrapping(hexpression)
23
+ end
24
+
25
+ private
26
+
27
+ def join_hexpression
28
+ @hexpression.join(delimiter)
29
+ end
30
+
31
+ def joinable?
32
+ @hexpression.respond_to?(:join)
33
+ end
34
+ end
35
+ end
36
+
37
+ require_relative "nested/find"
38
+ require_relative "nested/matching"
@@ -0,0 +1,17 @@
1
+ class Hexpress
2
+ def find(value = nil, &block)
3
+ value ? add_value(Nested::Find, value) : add_nested(Nested::Find, &block)
4
+ end
5
+ alias_method :capture, :find
6
+
7
+ module Nested
8
+ class Find
9
+ include Nested
10
+
11
+ def initialize(value = nil, &block)
12
+ @hexpression = value || Hexpress.new.instance_eval(&block)
13
+ @open, @close = "(", ")"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,31 @@
1
+ class Hexpress
2
+ def matching(&block)
3
+ add_nested(Nested::Matching, &block)
4
+ end
5
+ alias_method :like, :matching
6
+
7
+ module Nested
8
+ class Matching
9
+ include Nested
10
+
11
+ def initialize(&block)
12
+ @hexpression = Hexpress.new.instance_eval(&block)
13
+ @open, @close = "[", "]"
14
+ end
15
+
16
+ def join_hexpression
17
+ @hexpression.map(&method(:escape)).join(delimiter)
18
+ end
19
+
20
+ private
21
+
22
+ def escape(hexpression)
23
+ if hexpression.respond_to?(:gsub)
24
+ Regexp.escape(hexpression)
25
+ else
26
+ hexpression
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ class Hexpress
2
+ private
3
+
4
+ def add_value(hexpression, v, &block)
5
+ add(hexpression.new(block_given? ? Hexpress.new.instance_exec(&block) : v))
6
+ end
7
+
8
+ module Value
9
+ def value
10
+ if escapable? then escaped_value else @value end || ""
11
+ end
12
+
13
+ private
14
+
15
+ def escapable?
16
+ @value.respond_to?(:gsub)
17
+ end
18
+
19
+ def escaped_value
20
+ Regexp.escape(@value)
21
+ end
22
+ end
23
+ end
24
+
25
+ require_relative "value/ending"
26
+ require_relative "value/except"
27
+ require_relative "value/starting"
28
+ require_relative "value/with"
@@ -0,0 +1,22 @@
1
+ class Hexpress
2
+ def ending(value = nil)
3
+ add_value(Value::Ending, value)
4
+ end
5
+ alias_method :ending_with, :ending
6
+ alias_method :finally, :ending
7
+ alias_method :endOfLine, :ending
8
+
9
+ module Value
10
+ class Ending
11
+ include Value
12
+
13
+ def initialize(value = nil)
14
+ @value = value
15
+ end
16
+
17
+ def to_s
18
+ "#{value}$"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ class Hexpress
2
+ def except(value)
3
+ add_value(Value::Except, value)
4
+ end
5
+ alias_method :excluding, :except
6
+ alias_method :exclude, :except
7
+ alias_method :without, :except
8
+
9
+ module Value
10
+ class Except
11
+ include Value
12
+
13
+ def initialize(value)
14
+ @value = value
15
+ end
16
+
17
+ def to_s
18
+ "^#{value}"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ class Hexpress
2
+ def starting(value = nil)
3
+ add_value(Value::Starting, value)
4
+ end
5
+ alias_method :begins, :starting
6
+ alias_method :begin, :starting
7
+ alias_method :start, :starting
8
+
9
+ module Value
10
+ class Starting
11
+ include Value
12
+
13
+ def initialize(value = nil)
14
+ @value = value
15
+ end
16
+
17
+ def to_s
18
+ "^#{value}"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ class Hexpress
2
+ def with(value)
3
+ add_value(Value::With, value)
4
+ end
5
+ alias_method :has, :with
6
+ alias_method :including, :with
7
+
8
+ module Value
9
+ class With
10
+ include Value
11
+
12
+ def initialize(value)
13
+ @value = value
14
+ end
15
+
16
+ def to_s
17
+ "#{value}"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ class Hexpress
2
+ def add_values(hexpression, *vs)
3
+ add(hexpression.new(*vs))
4
+ end
5
+
6
+ module Values
7
+ attr_reader :delimiter
8
+
9
+ def values
10
+ @values.map { |v| v.respond_to?(:gsub) ? Regexp.escape(v) : v }
11
+ end
12
+
13
+ def to_s
14
+ "#{values.join(delimiter)}"
15
+ end
16
+ end
17
+ end
18
+
19
+ require_relative "values/either"
20
+ require_relative "values/range"