console1984 0.1.9 → 0.1.13
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 78f591775f469668e6d50741f421c188e048e42942ce4a9c9c707e9a34328c69
|
4
|
+
data.tar.gz: 190d0069e0bc4268400e59f1884539403233fd66fb873892d41ecf5e3d888323
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6930e488260091857f8f2196ef88ec3c364391de1b1a9e9385a246153c80a1b5c7cd3cafd76d988d54f3ded5b4b3f66b2ae1d9735cc5ebeacadabd4a3bbe12e
|
7
|
+
data.tar.gz: 19746bce408667fb06d48e5a98032999e46a44b47f3620d510b5ce4a707a9414c76f57b996d5a707372bf533b5904aa2af19bd0b9c2866fc8d00e4b2e5228f70
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# Naming class with dot so that it doesn't get loaded eagerly by Zeitwork. We want to load
|
2
|
+
# only when a console session is started, when +parser+ is loaded.
|
3
|
+
#
|
4
|
+
# See +Console1984::Supervisor#require_dependencies+
|
5
|
+
class Console1984::CommandValidator::CommandParser < ::Parser::AST::Processor
|
6
|
+
include AST::Processor::Mixin
|
7
|
+
include Console1984::Freezeable
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@constants = []
|
11
|
+
@declared_classes_or_modules = []
|
12
|
+
@constant_assignments = []
|
13
|
+
end
|
14
|
+
|
15
|
+
# We define accessors to define lists without duplicates. We are not using a +SortedSet+ because we want
|
16
|
+
# to mutate strings in the list while the processing is happening. And we don't use metapgroamming to define the
|
17
|
+
# accessors to prevent having problems with freezable and its instance_variable* protection.
|
18
|
+
|
19
|
+
def constants
|
20
|
+
@constants.uniq
|
21
|
+
end
|
22
|
+
|
23
|
+
def declared_classes_or_modules
|
24
|
+
@declared_classes_or_modules.uniq
|
25
|
+
end
|
26
|
+
|
27
|
+
def constant_assignments
|
28
|
+
@constant_assignments.uniq
|
29
|
+
end
|
30
|
+
|
31
|
+
def on_class(node)
|
32
|
+
super
|
33
|
+
const_declaration, _, _ = *node
|
34
|
+
constant = extract_constants(const_declaration).first
|
35
|
+
@declared_classes_or_modules << constant if constant.present?
|
36
|
+
end
|
37
|
+
|
38
|
+
alias_method :on_module, :on_class
|
39
|
+
|
40
|
+
def on_const(node)
|
41
|
+
super
|
42
|
+
name, const_name = *node
|
43
|
+
const_name = const_name.to_s
|
44
|
+
last_constant = @constants.last
|
45
|
+
|
46
|
+
if name.nil? || (name && name.type == :cbase) # cbase = leading ::
|
47
|
+
if last_constant&.end_with?("::")
|
48
|
+
last_constant << const_name
|
49
|
+
else
|
50
|
+
@constants << const_name
|
51
|
+
end
|
52
|
+
elsif last_constant
|
53
|
+
last_constant << "::#{const_name}"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def on_casgn(node)
|
58
|
+
super
|
59
|
+
scope_node, name, value_node = *node
|
60
|
+
@constant_assignments.push(*extract_constants(value_node))
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
def extract_constants(node)
|
65
|
+
self.class.new.tap do |processor|
|
66
|
+
processor.process(node)
|
67
|
+
end.constants
|
68
|
+
end
|
69
|
+
end
|
@@ -6,85 +6,19 @@ class Console1984::CommandValidator::ParsedCommand
|
|
6
6
|
|
7
7
|
attr_reader :raw_command
|
8
8
|
|
9
|
-
delegate :declared_classes_or_modules, :constants, :constant_assignments, to: :
|
9
|
+
delegate :declared_classes_or_modules, :constants, :constant_assignments, to: :command_parser
|
10
10
|
|
11
11
|
def initialize(raw_command)
|
12
12
|
@raw_command = Array(raw_command).join("\n")
|
13
13
|
end
|
14
14
|
|
15
15
|
private
|
16
|
-
def
|
17
|
-
@
|
16
|
+
def command_parser
|
17
|
+
@command_parser ||= Console1984::CommandValidator::CommandParser.new.tap do |processor|
|
18
18
|
ast = Parser::CurrentRuby.parse(raw_command)
|
19
19
|
processor.process(ast)
|
20
20
|
rescue Parser::SyntaxError
|
21
21
|
# Fail open with syntax errors
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
25
|
-
class CommandProcessor < ::Parser::AST::Processor
|
26
|
-
include AST::Processor::Mixin
|
27
|
-
include Console1984::Freezeable
|
28
|
-
|
29
|
-
def initialize
|
30
|
-
@constants = []
|
31
|
-
@declared_classes_or_modules = []
|
32
|
-
@constant_assignments = []
|
33
|
-
end
|
34
|
-
|
35
|
-
# We define accessors to define lists without duplicates. We are not using a +SortedSet+ because we want
|
36
|
-
# to mutate strings in the list while the processing is happening. And we don't use metapgroamming to define the
|
37
|
-
# accessors to prevent having problems with freezable and its instance_variable* protection.
|
38
|
-
|
39
|
-
def constants
|
40
|
-
@constants.uniq
|
41
|
-
end
|
42
|
-
|
43
|
-
def declared_classes_or_modules
|
44
|
-
@declared_classes_or_modules.uniq
|
45
|
-
end
|
46
|
-
|
47
|
-
def constant_assignments
|
48
|
-
@constant_assignments.uniq
|
49
|
-
end
|
50
|
-
|
51
|
-
def on_class(node)
|
52
|
-
super
|
53
|
-
const_declaration, _, _ = *node
|
54
|
-
constant = extract_constants(const_declaration).first
|
55
|
-
@declared_classes_or_modules << constant if constant.present?
|
56
|
-
end
|
57
|
-
|
58
|
-
alias_method :on_module, :on_class
|
59
|
-
|
60
|
-
def on_const(node)
|
61
|
-
super
|
62
|
-
name, const_name = *node
|
63
|
-
const_name = const_name.to_s
|
64
|
-
last_constant = @constants.last
|
65
|
-
|
66
|
-
if name.nil? || (name && name.type == :cbase) # cbase = leading ::
|
67
|
-
if last_constant&.end_with?("::")
|
68
|
-
last_constant << const_name
|
69
|
-
else
|
70
|
-
@constants << const_name
|
71
|
-
end
|
72
|
-
elsif last_constant
|
73
|
-
last_constant << "::#{const_name}"
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def on_casgn(node)
|
78
|
-
super
|
79
|
-
_scope_node, name, value_node = *node
|
80
|
-
@constant_assignments.push(*extract_constants(value_node))
|
81
|
-
end
|
82
|
-
|
83
|
-
private
|
84
|
-
def extract_constants(node)
|
85
|
-
self.class.new.tap do |processor|
|
86
|
-
processor.process(node)
|
87
|
-
end.constants
|
88
|
-
end
|
89
|
-
end
|
90
24
|
end
|
@@ -11,14 +11,17 @@ class Console1984::Refrigerator
|
|
11
11
|
end
|
12
12
|
|
13
13
|
private
|
14
|
-
EXTERNAL_MODULES_AND_CLASSES_TO_FREEZE = [Parser::CurrentRuby]
|
15
|
-
|
16
14
|
def freeze_internal_instances
|
17
15
|
Console1984.config.freeze unless Console1984.config.test_mode
|
18
16
|
end
|
19
17
|
|
20
18
|
def freeze_external_modules_and_classes
|
21
|
-
|
19
|
+
external_modules_and_classes_to_freeze.each { |klass| klass.include(Console1984::Freezeable) }
|
20
|
+
end
|
21
|
+
|
22
|
+
def external_modules_and_classes_to_freeze
|
23
|
+
# Not using a constant because we want this to run lazily (console-dependant dependencies might not be loaded).
|
24
|
+
[Parser::CurrentRuby]
|
22
25
|
end
|
23
26
|
|
24
27
|
def eager_load_all_classes
|
@@ -41,6 +41,16 @@ class Console1984::Supervisor
|
|
41
41
|
require 'parser/current'
|
42
42
|
end
|
43
43
|
require 'colorized_string'
|
44
|
+
|
45
|
+
# Explicit lazy loading because it depends on +parser+, which we want to only load
|
46
|
+
# in console sessions.
|
47
|
+
require_relative "./command_validator/.command_parser"
|
48
|
+
|
49
|
+
# This solves a weird class loading error where ActiveRecord dosn't resolve +Relation+ properly.
|
50
|
+
# See https://github.com/basecamp/console1984/issues/29
|
51
|
+
#
|
52
|
+
# TODO: This is a temporary fix. Need to figure out why/when this happens.
|
53
|
+
require "active_record/relation"
|
44
54
|
end
|
45
55
|
|
46
56
|
def start_session
|
data/lib/console1984/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: console1984
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jorge Manrubia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-09-
|
11
|
+
date: 2021-09-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -200,6 +200,7 @@ files:
|
|
200
200
|
- lib/console1984.rb
|
201
201
|
- lib/console1984/command_executor.rb
|
202
202
|
- lib/console1984/command_validator.rb
|
203
|
+
- lib/console1984/command_validator/.command_parser.rb
|
203
204
|
- lib/console1984/command_validator/forbidden_constant_reference_validation.rb
|
204
205
|
- lib/console1984/command_validator/forbidden_reopening_validation.rb
|
205
206
|
- lib/console1984/command_validator/parsed_command.rb
|