logicality 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cb4ac0da245089c4fb24cff9a9bd3538789fa657
4
- data.tar.gz: 3c036d3c1e19b16da5b5ac3b4e0b2dba44b48885
3
+ metadata.gz: 7edc9358a6d67553428d41c02f336e25dd7a9763
4
+ data.tar.gz: 1e66c111450fba24d0b0fb3d2e680c6d8ca63cdf
5
5
  SHA512:
6
- metadata.gz: 224ab93b859472eacdb9bf044d3d1b2e0a4cbb96b1a61e233b0b7b639744b5c1adbea4120740949081825e416f3325758b58021ed654f03b8fb689b35332f6aa
7
- data.tar.gz: a88bccf33b604a31042e14fcb09c8229af5480c181fda6dba306d0b9e6d24d9e09013dfec2135b2263f01694e41a0be3f9bbb7201d1c8b7bc4e60c638d8799ed
6
+ metadata.gz: 402fab8bc9d1889cf311f2d9455f558f7fe2a4b6e4d4b9735277f2fe228350cb4aee5a593f8445c18ca8ef4a6884ab4481c1237f690f7521cf097fb616ccc8b5
7
+ data.tar.gz: bd27b379426d0cda3db948eeb01e458a9867f9dade37c1e8c80941806f891ca935b8b3a3ca8fb0a6605e214bda995896f41491e2499ffa85418965ce6a00293a
data/.rubocop.yml ADDED
@@ -0,0 +1,4 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ Metrics/LineLength:
4
+ Max: 100
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,34 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2018-09-28 09:05:21 -0500 using RuboCop version 0.59.2.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 4
10
+ Metrics/AbcSize:
11
+ Max: 23
12
+
13
+ # Offense count: 2
14
+ # Configuration parameters: CountComments, ExcludedMethods.
15
+ # ExcludedMethods: refine
16
+ Metrics/BlockLength:
17
+ Max: 51
18
+
19
+ # Offense count: 3
20
+ # Configuration parameters: CountComments, ExcludedMethods.
21
+ Metrics/MethodLength:
22
+ Max: 16
23
+
24
+ # Offense count: 3
25
+ Style/DoubleNegation:
26
+ Exclude:
27
+ - 'lib/logicality/interpreter/simple_interpreter.rb'
28
+ - 'lib/logicality/logic.rb'
29
+
30
+ # Offense count: 1
31
+ # Cop supports --auto-correct.
32
+ Style/OrAssignment:
33
+ Exclude:
34
+ - 'lib/logicality/logic.rb'
data/.travis.yml CHANGED
@@ -4,4 +4,5 @@ rvm:
4
4
  - 2.3.7
5
5
  cache: bundler
6
6
  script:
7
+ - bundle exec rubocop
7
8
  - bundle exec rspec
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  gemspec
data/Gemfile.lock CHANGED
@@ -1,12 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- logicality (1.0.4)
4
+ logicality (1.0.5)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ ast (2.4.0)
9
10
  diff-lcs (1.3)
11
+ jaro_winkler (1.5.1)
12
+ parallel (1.12.1)
13
+ parser (2.5.1.2)
14
+ ast (~> 2.4.0)
15
+ powerpack (0.1.2)
16
+ rainbow (3.0.0)
10
17
  rspec (3.8.0)
11
18
  rspec-core (~> 3.8.0)
12
19
  rspec-expectations (~> 3.8.0)
@@ -20,6 +27,16 @@ GEM
20
27
  diff-lcs (>= 1.2.0, < 2.0)
21
28
  rspec-support (~> 3.8.0)
22
29
  rspec-support (3.8.0)
30
+ rubocop (0.59.2)
31
+ jaro_winkler (~> 1.5.1)
32
+ parallel (~> 1.10)
33
+ parser (>= 2.5, != 2.5.1.1)
34
+ powerpack (~> 0.1)
35
+ rainbow (>= 2.2.2, < 4.0)
36
+ ruby-progressbar (~> 1.7)
37
+ unicode-display_width (~> 1.0, >= 1.0.1)
38
+ ruby-progressbar (1.10.0)
39
+ unicode-display_width (1.4.0)
23
40
 
24
41
  PLATFORMS
25
42
  ruby
@@ -27,6 +44,7 @@ PLATFORMS
27
44
  DEPENDENCIES
28
45
  logicality!
29
46
  rspec
47
+ rubocop (~> 0.59.2)
30
48
 
31
49
  BUNDLED WITH
32
50
  1.16.3
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -7,8 +9,8 @@
7
9
 
8
10
  module Logicality
9
11
  module Interpreter
12
+ # This is a base class for traversing a node.
10
13
  class NodeVisitor
11
-
12
14
  def visit(node)
13
15
  return nil unless node
14
16
 
@@ -30,7 +32,6 @@ module Logicality
30
32
  def method_name(node)
31
33
  "visit_#{node.name}"
32
34
  end
33
-
34
35
  end
35
36
  end
36
37
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -7,12 +9,13 @@
7
9
 
8
10
  module Logicality
9
11
  module Interpreter
12
+ # This class implements NodeVisitor and gives each type of node the proper type of visitor
13
+ # implementation.
10
14
  class SimpleInterpreter < NodeVisitor
11
-
12
15
  attr_reader :resolver
13
16
 
14
17
  def initialize(resolver)
15
- raise ArgumentError, "Resolver is required" unless resolver
18
+ raise ArgumentError, 'Resolver is required' unless resolver
16
19
 
17
20
  @resolver = resolver
18
21
  end
@@ -52,13 +55,10 @@ module Logicality
52
55
  private
53
56
 
54
57
  def resolve_value(value)
55
- if resolver.nil?
56
- raise ArgumentError, "No resolver function but trying to resolve: #{value}"
57
- end
58
+ raise ArgumentError, "No resolver function: #{value}" if resolver.nil?
58
59
 
59
60
  !!resolver.call(value)
60
61
  end
61
-
62
62
  end
63
63
  end
64
64
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -7,6 +9,7 @@
7
9
 
8
10
  module Logicality
9
11
  module Lexer
12
+ # Define the main regular expression matchers used by the lexer.
10
13
  module Grammar
11
14
  VALUE = /([a-zA-Z0-9_$@?\.]+)/
12
15
  AND_OP = /(&&)/
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -7,11 +9,11 @@
7
9
 
8
10
  module Logicality
9
11
  module Lexer
12
+ # This class is a simple lexical token analyzer based on regular expression grammer matchers.
10
13
  class RegexpLexer
11
14
  include Grammar
12
15
 
13
16
  class << self
14
-
15
17
  def invalid_pattern
16
18
  "#{pattern}|(\\s*)"
17
19
  end
@@ -21,24 +23,25 @@ module Logicality
21
23
  end
22
24
 
23
25
  def pattern
24
- Grammar.constants.map { |c| Grammar.const_get(c).source }
25
- .join('|')
26
+ Grammar.constants
27
+ .map { |c| Grammar.const_get(c).source }
28
+ .join('|')
26
29
  end
27
30
 
28
31
  def regexp
29
32
  Regexp.new(pattern)
30
33
  end
31
-
32
34
  end
33
35
 
34
36
  attr_reader :expression
35
37
 
36
38
  def initialize(expression)
37
- raise ArgumentError, 'Expression is required' unless expression && expression.to_s.length > 0
39
+ raise ArgumentError, 'Expression is required' unless expression &&
40
+ expression.to_s.length.positive?
38
41
 
39
42
  @expression = expression.to_s
40
43
 
41
- if invalid_matches.length > 0
44
+ if invalid_matches.length.positive?
42
45
  raise ArgumentError, "Invalid syntax: #{invalid_matches}"
43
46
  end
44
47
 
@@ -59,11 +62,9 @@ module Logicality
59
62
  value ? Token.new(const, value) : nil
60
63
  end.compact
61
64
 
62
- if tokens.length > 1
63
- raise ArgumentError, "Too many tokens found for: #{scan_array}"
64
- elsif tokens.length == 0
65
- raise ArgumentError, "Cannot tokenize: #{scan_array}"
66
- end
65
+ raise ArgumentError, "Too many tokens found for: #{scan_array}" if tokens.length > 1
66
+
67
+ raise ArgumentError, "Cannot tokenize: #{scan_array}" if tokens.length.zero?
67
68
 
68
69
  tokens.first
69
70
  end
@@ -91,7 +92,6 @@ module Logicality
91
92
  def matches
92
93
  @matches ||= expression.scan(self.class.regexp)
93
94
  end
94
-
95
95
  end
96
96
  end
97
97
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -7,8 +9,9 @@
7
9
 
8
10
  module Logicality
9
11
  module Lexer
12
+ # Class that defines the main structure of a Token. A token is a parsed set of
13
+ # characters.
10
14
  class Token
11
-
12
15
  module Type
13
16
  VALUE = :value
14
17
  AND_OP = :and_op
@@ -21,8 +24,8 @@ module Logicality
21
24
  attr_reader :type, :value
22
25
 
23
26
  def initialize(type, value)
24
- raise ArgumentError, 'type is required' unless type && type.to_s.length > 0
25
- raise ArgumentError, 'value is required' unless value && value.to_s.length > 0
27
+ raise ArgumentError, 'type is required' unless type && type.to_s.length.positive?
28
+ raise ArgumentError, 'value is required' unless value && value.to_s.length.positive?
26
29
 
27
30
  @type = Type.const_get(type.to_s.upcase.to_sym)
28
31
  @value = value.to_s
@@ -31,7 +34,6 @@ module Logicality
31
34
  def to_s
32
35
  "#{type}::#{value}"
33
36
  end
34
-
35
37
  end
36
38
  end
37
39
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -6,9 +8,9 @@
6
8
  #
7
9
 
8
10
  module Logicality
11
+ # Class that defines the main class-level API for this library.
9
12
  class Logic
10
13
  class << self
11
-
12
14
  def evaluate(expression, input = nil, resolver = nil)
13
15
  node = get(expression)
14
16
  wrapper = resolver_wrapper(input, resolver)
@@ -21,9 +23,9 @@ module Logicality
21
23
 
22
24
  def resolver_wrapper(input, resolver)
23
25
  if resolver
24
- lambda { |value| resolver.call(value, input) }
26
+ ->(value) { resolver.call(value, input) }
25
27
  else
26
- lambda { |value| object_resolver.call(value, input) }
28
+ ->(value) { object_resolver.call(value, input) }
27
29
  end
28
30
  end
29
31
 
@@ -59,7 +61,6 @@ module Logicality
59
61
 
60
62
  set(expression, parser.parse)
61
63
  end
62
-
63
64
  end
64
65
  end
65
66
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -8,8 +10,8 @@
8
10
  module Logicality
9
11
  module Parser
10
12
  module Ast
13
+ # A binary operator contains two children (left and right) nodes.
11
14
  class BinaryOperatorNode < Node
12
-
13
15
  attr_reader :left, :right
14
16
 
15
17
  def initialize(left, token, right)
@@ -19,7 +21,6 @@ module Logicality
19
21
  @left = left
20
22
  @right = right
21
23
  end
22
-
23
24
  end
24
25
  end
25
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -8,8 +10,8 @@
8
10
  module Logicality
9
11
  module Parser
10
12
  module Ast
13
+ # Base construct defining all nodes.
11
14
  class Node
12
-
13
15
  attr_reader :token, :name
14
16
 
15
17
  def initialize(token)
@@ -20,7 +22,6 @@ module Logicality
20
22
  def to_s
21
23
  "AstNode: #{self.class.name}::#{token}"
22
24
  end
23
-
24
25
  end
25
26
  end
26
27
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -8,8 +10,8 @@
8
10
  module Logicality
9
11
  module Parser
10
12
  module Ast
13
+ # A unary operator node has just one child node.
11
14
  class UnaryOperatorNode < Node
12
-
13
15
  attr_reader :child
14
16
 
15
17
  def initialize(child, token)
@@ -18,7 +20,6 @@ module Logicality
18
20
  @name = 'unary_operator_node'
19
21
  @child = child
20
22
  end
21
-
22
23
  end
23
24
  end
24
25
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -8,8 +10,8 @@
8
10
  module Logicality
9
11
  module Parser
10
12
  module Ast
13
+ # A value operand node is a node with no children but holds a value instead.
11
14
  class ValueOperandNode < Node
12
-
13
15
  attr_reader :value
14
16
 
15
17
  def initialize(token)
@@ -18,7 +20,6 @@ module Logicality
18
20
  @name = 'value_operand_node'
19
21
  @value = token.value
20
22
  end
21
-
22
23
  end
23
24
  end
24
25
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -7,8 +9,9 @@
7
9
 
8
10
  module Logicality
9
11
  module Parser
12
+ # Parser that takes in a lexer and can take its parsed grammar and turn it into an
13
+ # abstract syntax tree.
10
14
  class SimpleParser
11
-
12
15
  attr_reader :lexer
13
16
 
14
17
  def initialize(lexer)
@@ -16,10 +19,7 @@ module Logicality
16
19
 
17
20
  @current_token = lexer.next_token
18
21
 
19
- if @current_token.nil?
20
- raise ArgumentError, 'Lexer must contain at least one token'
21
- end
22
-
22
+ raise ArgumentError, 'Lexer must contain at least one token' if @current_token.nil?
23
23
  end
24
24
 
25
25
  def parse
@@ -30,7 +30,7 @@ module Logicality
30
30
 
31
31
  BINARY_TYPES = [
32
32
  Lexer::Token::Type::AND_OP,
33
- Lexer::Token::Type::OR_OP,
33
+ Lexer::Token::Type::OR_OP
34
34
  ].freeze
35
35
 
36
36
  attr_reader :current_token
@@ -91,7 +91,6 @@ module Logicality
91
91
 
92
92
  node
93
93
  end
94
-
95
94
  end
96
95
  end
97
96
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -6,5 +8,5 @@
6
8
  #
7
9
 
8
10
  module Logicality
9
- VERSION = "1.0.4"
11
+ VERSION = '1.0.5'
10
12
  end
data/lib/logicality.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
data/logicality.gemspec CHANGED
@@ -1,28 +1,29 @@
1
- require "./lib/logicality/version"
1
+ # frozen_string_literal: true
2
2
 
3
- Gem::Specification.new do |s|
3
+ require './lib/logicality/version'
4
4
 
5
+ Gem::Specification.new do |s|
5
6
  s.name = 'logicality'
6
7
  s.version = Logicality::VERSION
7
- s.summary = "String-based boolean expression evaluator"
8
+ s.summary = 'String-based boolean expression evaluator'
8
9
 
9
- s.description = <<-EOS
10
+ s.description = <<-DESCRIPTION
10
11
  A common problem that many frameworks have is the ability to give developers
11
12
  an expressive intermediary scripting language or DSL.
12
13
  Logicality helps solve this problem by providing a simple boolean
13
14
  expression evaluator.
14
- EOS
15
+ DESCRIPTION
15
16
 
16
- s.authors = [ 'Matthew Ruggio' ]
17
- s.email = [ 'mruggio@bluemarblepayroll.com' ]
17
+ s.authors = ['Matthew Ruggio']
18
+ s.email = ['mruggio@bluemarblepayroll.com']
18
19
  s.files = `git ls-files`.split("\n")
19
20
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
21
22
  s.homepage = 'https://github.com/bluemarblepayroll/logicality-rb'
22
23
  s.license = 'MIT'
23
24
 
24
25
  s.required_ruby_version = '>= 2.3.1'
25
26
 
26
27
  s.add_development_dependency('rspec')
27
-
28
+ s.add_development_dependency('rubocop', '~> 0.59.2')
28
29
  end
data/spec/logic_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Copyright (c) 2018-present, Blue Marble Payroll, LLC
3
5
  #
@@ -9,26 +11,24 @@ require './lib/logicality'
9
11
 
10
12
  def run(tests)
11
13
  tests.each do |x|
12
- input = x[1] ? x[1].map { |k,v| [ k.to_s, v] }.to_h : nil
14
+ input = x[1] ? x[1].map { |k, v| [k.to_s, v] }.to_h : nil
13
15
 
14
16
  result = Logicality::Logic.evaluate(x[0], input)
15
17
 
16
- expect(result).to eq(x[2]), "Failed on #{x[0]} (input: #{input}): expected #{x[2]} but got: #{result}"
18
+ expect(result).to eq(x[2]), "Failed: #{x[0]} (input: #{input}): expected #{x[2]} got: #{result}"
17
19
  end
18
20
 
19
21
  nil
20
22
  end
21
23
 
22
24
  describe Logicality::Logic do
23
-
24
25
  context 'when evaluating' do
25
-
26
26
  it 'should evaluate boolean-only expressions' do
27
27
  tests = [
28
- [ 'true', nil, true ],
29
- [ 'false', nil, false ],
30
- [ 'true && false', nil, false ],
31
- [ 'true && true', nil, true ]
28
+ ['true', nil, true],
29
+ ['false', nil, false],
30
+ ['true && false', nil, false],
31
+ ['true && true', nil, true]
32
32
  ]
33
33
 
34
34
  run(tests)
@@ -36,12 +36,12 @@ describe Logicality::Logic do
36
36
 
37
37
  it 'should evaluate and expressions' do
38
38
  tests = [
39
- [ 'a && b', nil, false ],
40
- [ 'a && b', {}, false ],
41
- [ 'a && b', { a: true }, false ],
42
- [ 'a && b', { a: true, b: false }, false ],
43
- [ 'a && b', { a: false, b: false }, false ],
44
- [ 'a && b', { a: true, b: true }, true ]
39
+ ['a && b', nil, false],
40
+ ['a && b', {}, false],
41
+ ['a && b', { a: true }, false],
42
+ ['a && b', { a: true, b: false }, false],
43
+ ['a && b', { a: false, b: false }, false],
44
+ ['a && b', { a: true, b: true }, true]
45
45
  ]
46
46
 
47
47
  run(tests)
@@ -49,11 +49,11 @@ describe Logicality::Logic do
49
49
 
50
50
  it 'should evaluate and-or expressions' do
51
51
  tests = [
52
- [ 'a && b || c', { a: false, b: false, c: true }, true ],
53
- [ '(a && b) || c', { a: false, b: false, c: true }, true ],
54
- [ 'a || b && c', { a: false, b: false, c: true }, false ],
55
- [ 'a || (b && c)', { a: false, b: false, c: true }, false ],
56
- [ '(a || b) && c', { a: false, b: false, c: true }, false ]
52
+ ['a && b || c', { a: false, b: false, c: true }, true],
53
+ ['(a && b) || c', { a: false, b: false, c: true }, true],
54
+ ['a || b && c', { a: false, b: false, c: true }, false],
55
+ ['a || (b && c)', { a: false, b: false, c: true }, false],
56
+ ['(a || b) && c', { a: false, b: false, c: true }, false]
57
57
  ]
58
58
 
59
59
  run(tests)
@@ -61,11 +61,11 @@ describe Logicality::Logic do
61
61
 
62
62
  it 'should evaluate not expressions' do
63
63
  tests = [
64
- [ '!a', { a: false }, true ],
65
- [ '!a && !b', { a: false, b: false }, true ],
66
- [ '!a && b', { a: false, b: false }, false ],
67
- [ 'a && !b', { a: false, b: false }, false ],
68
- [ '!(a && b)', { a: false, b: false }, true ]
64
+ ['!a', { a: false }, true],
65
+ ['!a && !b', { a: false, b: false }, true],
66
+ ['!a && b', { a: false, b: false }, false],
67
+ ['a && !b', { a: false, b: false }, false],
68
+ ['!(a && b)', { a: false, b: false }, true]
69
69
  ]
70
70
 
71
71
  run(tests)
@@ -73,15 +73,13 @@ describe Logicality::Logic do
73
73
 
74
74
  it 'should treat question marks as a valid part of a value token' do
75
75
  tests = [
76
- [ 'a?', { 'a?': true }, true ],
77
- [ '!a?', { 'a?': true }, false ],
78
- [ 'a? && b?', { 'a?': true, 'b?': true }, true ],
79
- [ 'a && b?', { a: true, 'b?': true }, true ]
76
+ ['a?', { 'a?': true }, true],
77
+ ['!a?', { 'a?': true }, false],
78
+ ['a? && b?', { 'a?': true, 'b?': true }, true],
79
+ ['a && b?', { a: true, 'b?': true }, true]
80
80
  ]
81
81
 
82
82
  run(tests)
83
83
  end
84
-
85
84
  end
86
-
87
85
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logicality
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Ruggio
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-27 00:00:00.000000000 Z
11
+ date: 2018-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubocop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.59.2
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.59.2
27
41
  description: |2
28
42
  A common problem that many frameworks have is the ability to give developers
29
43
  an expressive intermediary scripting language or DSL.
@@ -37,6 +51,8 @@ extra_rdoc_files: []
37
51
  files:
38
52
  - ".editorconfig"
39
53
  - ".gitignore"
54
+ - ".rubocop.yml"
55
+ - ".rubocop_todo.yml"
40
56
  - ".ruby-version"
41
57
  - ".travis.yml"
42
58
  - Gemfile