cql_ruby 0.0.14 → 0.0.16

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
  SHA256:
3
- metadata.gz: a2d4b179a2563722c3dc2ef101ec10f817b1f79b3ce7d81a9ca6550fd088f39d
4
- data.tar.gz: 3cace84921a72b38150aa52d60d1a48a48775b20234a3f4094e58939cf1c6058
3
+ metadata.gz: 26a9b9341ee0071484f34f631a1255a4c7444cbbacd29d56e687188522bd77d8
4
+ data.tar.gz: d6268072bae25c64caa1ef72126f2f44d38242b6904f0262781cddfc839532b0
5
5
  SHA512:
6
- metadata.gz: e4c5f5f1e37f8520a7e366d6dc1bb07792ba8062230cd41a068cb846516e76497639131d0f93a0b60c360586bc886743d0a02aac4d3c3660281e1c8a18021f26
7
- data.tar.gz: 65b4991554e454c0ca76f1077ae19665b3b4b27fc48243d301fb873e36af0da6652dcb6d741a249f529f72263866c4a5d2104b9fd5c958c0ed6c307218f829eb
6
+ metadata.gz: 809c7b9b5f5c7ed652f4f2f55bb3861d85ab8d9faf99400f7bd662694e1085c2b4640410def457a7d1d3404b8cf92dacc944d32fe90f7e90755fe80963a88ef0
7
+ data.tar.gz: be9575913b3360926360e2fc7653488a445ea3e9cc9e84f7bcd34fc094f116f807968b4daf82f42eff245318149f898e49f63a7b41cb13828c63668471a94835
data/bin/cql_ruby CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'parser'
4
3
  require 'cql_ruby'
4
+ require 'pry-byebug'
5
5
 
6
6
  def show_help
7
7
  puts <<~HELP
@@ -18,6 +18,7 @@ def show_help
18
18
  \t\tNesting under: nest:T(=NAME) Example: nest:def=save_user nest:class=UserManager
19
19
  \t\tHas child: has:T(=NAME) Example: has:const has:def=valid?
20
20
  \t\tPattern: pattern:(T-)*X(-T)* Example: pattern:class-def-X-block
21
+ \t\tAssignment left side: assigned Example: assigned
21
22
 
22
23
  \tOPTIONS
23
24
  \t\t--include=PATTERN Parses only files whose name matches the pattern.
@@ -78,7 +78,11 @@ module CqlRuby
78
78
  from = crumb.line_col_no
79
79
  to = from + crumb.expression_size
80
80
 
81
- prefix = source[0..from - 1] || ''
81
+ prefix = if from > 0
82
+ source[0..from - 1] || ''
83
+ else
84
+ ''
85
+ end
82
86
  subject = source[from..to - 1] || ''
83
87
  suffix = source[to..] || ''
84
88
 
@@ -9,6 +9,7 @@ module CqlRuby
9
9
  pass_nesting?(filter_reader, ancestors),
10
10
  pass_has?(filter_reader, ancestors, node),
11
11
  pass_pattern?(filter_reader, ancestors, node),
12
+ pass_assignment?(filter_reader, ancestors, node),
12
13
  ].all?
13
14
  end
14
15
 
@@ -56,6 +57,8 @@ module CqlRuby
56
57
  # @param [Array<Parser::AST::Node>] ancestors
57
58
  # @param [Any<Parser::AST::Node, Symbol>] node
58
59
  #
60
+ # @return [Boolean]
61
+ #
59
62
  def pass_has?(filter_reader, ancestors, node)
60
63
  return true unless filter_reader.restrict_children?
61
64
 
@@ -76,6 +79,8 @@ module CqlRuby
76
79
  # @param [Array<Parser::AST::Node>] ancestors
77
80
  # @param [Any<Parser::AST::Node, Symbol>] node
78
81
  #
82
+ # @return [Boolean]
83
+ #
79
84
  def pass_pattern?(filter_reader, ancestors, node)
80
85
  return true unless filter_reader.restrict_pattern?
81
86
 
@@ -97,10 +102,23 @@ module CqlRuby
97
102
  end
98
103
  end
99
104
 
105
+ #
106
+ # @param [CqlRuby::FilterReader] filter_reader
107
+ # @param [Array<Parser::AST::Node>] ancestors
108
+ # @param [Parser::AST::Node] node
109
+ #
110
+ # @return [Boolean]
111
+ #
112
+ def pass_assignment?(filter_reader, ancestors, node)
113
+ CqlRuby::Filters::Assignments.pass?(filter_reader, ancestors, node)
114
+ end
115
+
100
116
  #
101
117
  # @param [Array<String>] pattern_descendants
102
118
  # @param [Parser::AST::Node] node
103
119
  #
120
+ # @return [Boolean]
121
+ #
104
122
  def match_descendant_pattern?(pattern_descendants, node)
105
123
  return true if pattern_descendants.empty?
106
124
  # If we're at the end and we're still expecting a type - no match.
@@ -67,6 +67,8 @@ module CqlRuby
67
67
  attr_reader :has_leaves
68
68
  # @attribute [Array<CqlRuby::FilterReader::HierarchyPattern>] patterns
69
69
  attr_reader :patterns
70
+ # @attribute [Boolean] is_assigned
71
+ attr_reader :is_assigned
70
72
 
71
73
  def initialize(raw_filters = [])
72
74
  super()
@@ -75,6 +77,7 @@ module CqlRuby
75
77
  @nest_under = []
76
78
  @has_leaves = []
77
79
  @patterns = []
80
+ @is_assigned = false
78
81
 
79
82
  parse_raw_filters(raw_filters)
80
83
  end
@@ -95,13 +98,17 @@ module CqlRuby
95
98
  !@patterns.empty?
96
99
  end
97
100
 
101
+ def restrict_assignment?
102
+ @is_assigned
103
+ end
104
+
98
105
  private
99
106
 
100
107
  # @param [Array<String>] raw_filters
101
108
  def parse_raw_filters(raw_filters)
102
109
  raw_filters.each do |raw_filter|
103
110
  name, value = raw_filter.split(':')
104
- raise "Unrecognized filter: #{raw_filter}" if name.nil? || value.nil?
111
+ raise "Unrecognized filter: #{raw_filter}" if name.nil?
105
112
 
106
113
  if %w[type t].include?(name)
107
114
  @allowed_types += value.split(',').map(&:to_sym)
@@ -115,6 +122,8 @@ module CqlRuby
115
122
  @has_leaves << NodeSpec.from(value)
116
123
  elsif %w[pattern p].include?(name)
117
124
  @patterns << HierarchyPattern.from(value)
125
+ elsif name == 'assigned'
126
+ @is_assigned = true
118
127
  end
119
128
  end
120
129
 
@@ -0,0 +1,151 @@
1
+ module CqlRuby
2
+ module Filters
3
+ class Assignments
4
+ class << self
5
+ #
6
+ # @param [CqlRuby::FilterReader] filter_reader
7
+ # @param [Array<Parser::AST::Node>] ancestors
8
+ # @param [Parser::AST::Node] node
9
+ #
10
+ # @return [Boolean]
11
+ #
12
+ def pass?(filter_reader, ancestors, node)
13
+ return true unless filter_reader.restrict_assignment?
14
+ return true if lvar_assign?(ancestors, node)
15
+ return true if instance_attr_assign?(ancestors, node)
16
+ return true if array_sym_key_assign?(ancestors, node)
17
+ return true if array_string_key_assign?(ancestors, node)
18
+ return true if hash_sym_key_assign?(ancestors, node)
19
+ return true if hash_string_key_assign?(ancestors, node)
20
+ false
21
+ end
22
+
23
+ private
24
+
25
+ #
26
+ # @param [Array<Parser::AST::Node>] ancestors
27
+ # @param [Parser::AST::Node] node
28
+ #
29
+ # @return [Boolean]
30
+ #
31
+ def lvar_assign?(ancestors, node)
32
+ pattern_pass?({
33
+ nth_child: 0,
34
+ parent: {
35
+ type: :lvasgn
36
+ }
37
+ }, ancestors, node)
38
+ end
39
+
40
+ # TODO This does not work as symbol token is suffixed with =, eg foo= for bar.foo = x.
41
+ # Workaround for now is to use a =-alloed pattern, such as 'r/^token(|=)$/'
42
+ def instance_attr_assign?(ancestors, node)
43
+ pattern_pass?({
44
+ nth_child: 1,
45
+ parent: {
46
+ type: :send
47
+ }
48
+ }, ancestors, node)
49
+ end
50
+
51
+ def array_sym_key_assign?(ancestors, node)
52
+ pattern_pass?({
53
+ nth_child: 0,
54
+ parent: {
55
+ type: :sym,
56
+ nth_child: 2,
57
+ parent: {
58
+ type: :send,
59
+ child: {
60
+ nth: 1,
61
+ token: :[]=
62
+ }
63
+ }
64
+ }
65
+ }, ancestors, node)
66
+ end
67
+
68
+ def array_string_key_assign?(ancestors, node)
69
+ pattern_pass?({
70
+ nth_child: 0,
71
+ parent: {
72
+ type: :str,
73
+ nth_child: 2,
74
+ parent: {
75
+ type: :send,
76
+ child: {
77
+ nth: 1,
78
+ token: :[]=
79
+ }
80
+ }
81
+ }
82
+ }, ancestors, node)
83
+ end
84
+
85
+ def hash_sym_key_assign?(ancestors, node)
86
+ pattern_pass?({
87
+ nth_child: 0,
88
+ parent: {
89
+ type: :sym,
90
+ nth_child: 0,
91
+ parent: {
92
+ type: :pair,
93
+ parent: {
94
+ type: :hash
95
+ }
96
+ }
97
+ }
98
+ }, ancestors, node)
99
+ end
100
+
101
+ def hash_string_key_assign?(ancestors, node)
102
+ pattern_pass?({
103
+ nth_child: 0,
104
+ parent: {
105
+ type: :str,
106
+ nth_child: 0,
107
+ parent: {
108
+ type: :pair,
109
+ parent: {
110
+ type: :hash
111
+ }
112
+ }
113
+ }
114
+ }, ancestors, node)
115
+ end
116
+
117
+ def pattern_pass?(pattern, ancestors, node)
118
+ ancestor_idx = ancestors.size
119
+ current_node = node
120
+ current_pattern = pattern
121
+
122
+ loop do
123
+ if current_pattern.key?(:nth_child)
124
+ return false unless ancestor_idx - 1 >= 0
125
+ return false unless ancestors[ancestor_idx - 1].is_a?(Parser::AST::Node)
126
+ return false unless ancestors[ancestor_idx - 1].children[current_pattern[:nth_child]] == current_node
127
+ end
128
+
129
+ if current_pattern.key?(:type)
130
+ return false unless current_node.type == current_pattern[:type]
131
+ end
132
+
133
+ if current_pattern.key?(:child)
134
+ return false if current_node.children.size <= current_pattern[:child][:nth]
135
+ return false unless current_node.children[current_pattern[:child][:nth]] == current_pattern[:child][:token]
136
+ end
137
+
138
+ break unless current_pattern.key?(:parent)
139
+
140
+ ancestor_idx -= 1
141
+ return false unless ancestor_idx >= 0
142
+ current_node = ancestors[ancestor_idx]
143
+ current_pattern = current_pattern[:parent]
144
+ end
145
+
146
+ true
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
data/lib/cql_ruby.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module CqlRuby;
3
+ module CqlRuby
4
4
  def self.log(txt)
5
5
  p txt
6
6
  end
@@ -12,5 +12,6 @@ require 'cql_ruby/crumb_collector'
12
12
  require 'cql_ruby/abstract_printer'
13
13
  require 'cql_ruby/console_printer'
14
14
  require 'cql_ruby/filter_reader'
15
+ require 'cql_ruby/filters/assignments'
15
16
  require 'cql_ruby/filter_evaluator'
16
17
  require 'cql_ruby/pattern_matcher'
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cql_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.14
4
+ version: 0.0.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - itarato
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2020-07-05 00:00:00.000000000 Z
@@ -16,20 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.7'
19
+ version: '3.2'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 2.7.1
22
+ version: 3.2.2.3
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '2.7'
29
+ version: '3.2'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 2.7.1
32
+ version: 3.2.2.3
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: rspec
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -44,7 +44,21 @@ dependencies:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
- description:
47
+ - !ruby/object:Gem::Dependency
48
+ name: pry-byebug
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ description:
48
62
  email: it.arato@gmail.com
49
63
  executables:
50
64
  - cql_ruby
@@ -60,12 +74,13 @@ files:
60
74
  - lib/cql_ruby/executor.rb
61
75
  - lib/cql_ruby/filter_evaluator.rb
62
76
  - lib/cql_ruby/filter_reader.rb
77
+ - lib/cql_ruby/filters/assignments.rb
63
78
  - lib/cql_ruby/pattern_matcher.rb
64
79
  homepage: https://github.com/itarato/cql
65
80
  licenses:
66
81
  - GPL-3.0-or-later
67
82
  metadata: {}
68
- post_install_message:
83
+ post_install_message:
69
84
  rdoc_options: []
70
85
  require_paths:
71
86
  - lib
@@ -80,8 +95,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
95
  - !ruby/object:Gem::Version
81
96
  version: '0'
82
97
  requirements: []
83
- rubygems_version: 3.0.1
84
- signing_key:
98
+ rubygems_version: 3.4.13
99
+ signing_key:
85
100
  specification_version: 4
86
101
  summary: Code Query Language for Ruby
87
102
  test_files: []