mulang 6.0.0 → 6.0.5
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 +4 -4
- data/bin/mulang +0 -0
- data/lib/locales/en.yml +2 -1
- data/lib/locales/es.yml +2 -1
- data/lib/locales/pt.yml +3 -2
- data/lib/mulang/code.rb +6 -6
- data/lib/mulang/expectation.rb +17 -6
- data/lib/mulang/language.rb +56 -17
- data/lib/mulang/tokens.rb +6 -0
- data/lib/mulang/version.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 840be5bf9bea2b4855d162f1aa04249c43f6b03081715e3fd930eebf7ab25545
|
4
|
+
data.tar.gz: 5b6304cdd8c354fc8300064f8c2852f63556f39549157e6580ec904fea36b24f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d132b9c22e545e123f7badba82e9435f746a735d29346ae078f7c916f8d03968b0c3695e358931bab0d72255b2e4f3dd7f45211c5afe8b43826bbb590919e5b0
|
7
|
+
data.tar.gz: bc0a5da0bd4475e77b56d9daef6e2bf4f1af4f2250c9108c4203123669be1837177b9209e00809a6f50c7df70bc7d1f0d3c1fa2fe6fde8206e46b7adc5c2490a
|
data/bin/mulang
CHANGED
Binary file
|
data/lib/locales/en.yml
CHANGED
@@ -171,8 +171,8 @@ en:
|
|
171
171
|
UsesComprehension: '%{binding} %{must} use comprehensions'
|
172
172
|
UsesConditional: '%{binding} %{must} use conditionals'
|
173
173
|
UsesCut: '%{binding} uses <code>!</li> operator, which is a bad practice'
|
174
|
-
UsesDyamicPolymorphism: '%{binding} %{must} use polymorphism'
|
175
174
|
UsesDynamicMethodOverload: '%{binding} %{must} use overload'
|
175
|
+
UsesDynamicPolymorphism: '%{binding} %{must} use polymorphism'
|
176
176
|
UsesFail: '%{binding} uses <code>%{keyword_Fail}</li>, which is a bad practice'
|
177
177
|
UsesFindall: '%{binding} %{must} use <code>%{keyword_Findall}</code>'
|
178
178
|
UsesForall: '%{binding} %{must} use <code>%{keyword_Forall}</code>'
|
@@ -185,6 +185,7 @@ en:
|
|
185
185
|
UsesLoop: '%{binding} %{must} use a loop%{matching}'
|
186
186
|
UsesMath: '%{binding} %{must} usar math expressions'
|
187
187
|
UsesMixin: '%{binding} %{must} use mixins'
|
188
|
+
UsesNamedSelfReference: '%{binding} should use <code>%{keyword_Self}</code> instead of a global reference'
|
188
189
|
UsesNot: '%{binding} %{must} use not'
|
189
190
|
UsesObjectComposition: '%{binding} %{must} use composition'
|
190
191
|
UsesPatternMatching: '%{binding} %{must} use pattern matching'
|
data/lib/locales/es.yml
CHANGED
@@ -183,8 +183,8 @@ es:
|
|
183
183
|
UsesComprehension: '%{binding} %{must} emplear listas por comprensión'
|
184
184
|
UsesConditional: '%{binding} %{must} utilizar condicionales'
|
185
185
|
UsesCut: '%{binding} usa el operador !, lo cual es una mala práctica'
|
186
|
-
UsesDyamicPolymorphism: '%{binding} %{must} usar polimorfismo'
|
187
186
|
UsesDynamicMethodOverload: '%{binding} %{must} usar sobrecarga'
|
187
|
+
UsesDynamicPolymorphism: '%{binding} %{must} usar polimorfismo'
|
188
188
|
UsesExceptionHandling: '%{binding} %{must} realizar manejo de excepciones'
|
189
189
|
UsesExceptions: '%{binding} %{must} usar excepciones'
|
190
190
|
UsesFail: '%{binding} usa <code>%{keyword_Fail}</li>, lo cual es una mala práctica'
|
@@ -201,6 +201,7 @@ es:
|
|
201
201
|
UsesMath: '%{binding} %{must} usar expresiones matemáticas'
|
202
202
|
UsesMixin: '%{binding} %{must} utilizar mixins'
|
203
203
|
UsesMixins: '%{binding} %{must} usar mixins'
|
204
|
+
UsesNamedSelfReference: '%{binding} debería usar <code>%{keyword_Self}</code> en lugar de una referencia global'
|
204
205
|
UsesNot: '%{binding} %{must} utilizar <code>%{keyword_Not}</code>'
|
205
206
|
UsesObjectComposition: '%{binding} %{must} usar composición'
|
206
207
|
UsesPatternMatching: '%{binding} %{must} utilizar pattern matching'
|
data/lib/locales/pt.yml
CHANGED
@@ -145,7 +145,7 @@ pt:
|
|
145
145
|
Instantiates_named: '%{binding} %{must} instantiate %{target}'
|
146
146
|
Instantiates: '%{binding} %{must} instanciar objetos'
|
147
147
|
IsLongCode: '%{binding} é muito longo. Tente delegar mais'
|
148
|
-
JavaScript#UsesVarInsteadOfLet: '%
|
148
|
+
JavaScript#UsesVarInsteadOfLet: '%{binding} deve usar <code>let</code> em vez de <code>var</code>'
|
149
149
|
OverridesEqualOrHashButNotBoth: '%{binding} redefine os métodos <code>equals</code> ou <code>hash </code>, mas não ambos'
|
150
150
|
Raises_except: '%{binding} %{must} lançar exceções diferentes de %{target}'
|
151
151
|
Raises_like: '%{binding} %{must} lançar exceções semelhantes a %{target}'
|
@@ -175,8 +175,8 @@ pt:
|
|
175
175
|
UsesComprehension: '%{binding} %{must} usar listas pelo entendimento'
|
176
176
|
UsesConditional: '%{binding} %{must} usar conditional'
|
177
177
|
UsesCut: '%{binding} usa o operador !, que é uma má prática'
|
178
|
-
UsesDyamicPolymorphism: '%{binding} %{must} usar polimorfismo'
|
179
178
|
UsesDynamicMethodOverload: '%{binding} %{must} usar sobrecarga'
|
179
|
+
UsesDynamicPolymorphism: '%{binding} %{must} usar polimorfismo'
|
180
180
|
UsesExceptionHandling: '%{binding} %{must} executar o tratamento de exceção'
|
181
181
|
UsesExceptions: '%{binding} %{must} usar exceções'
|
182
182
|
UsesFail: '%{binding} usa <code>%{keyword_Fail}</li>, o que é uma prática ruim'
|
@@ -192,6 +192,7 @@ pt:
|
|
192
192
|
UsesLoop: '%{binding} %{must} usar um loop%{matching}'
|
193
193
|
UsesMath: '%{binding} %{must} usar expressões matemáticas'
|
194
194
|
UsesMixins: '%{binding} %{must} usar mixins'
|
195
|
+
UsesNamedSelfReference: '%{binding} deve usar <code>%{keyword_Self}</code> em vez de uma referência global'
|
195
196
|
UsesNot: '%{binding} %{must} usar <code>%{keyword_Not}</code>'
|
196
197
|
UsesObjectComposition: '%{binding} %{must} usar composição'
|
197
198
|
UsesPatternMatching: '%{binding} %{must} usar o padrão de correspondência'
|
data/lib/mulang/code.rb
CHANGED
@@ -30,8 +30,8 @@ module Mulang
|
|
30
30
|
@language.sample @content
|
31
31
|
end
|
32
32
|
|
33
|
-
def analysis(spec)
|
34
|
-
|
33
|
+
def analysis(spec, **options)
|
34
|
+
@language.build_analysis @content, spec, **options
|
35
35
|
end
|
36
36
|
|
37
37
|
def analyse(spec, **options)
|
@@ -60,8 +60,8 @@ module Mulang
|
|
60
60
|
native(*args).tap { |it| it.expect('Parses') }
|
61
61
|
end
|
62
62
|
|
63
|
-
def self.external(content, &tool)
|
64
|
-
new Mulang::Language::External.new(&tool), content
|
63
|
+
def self.external(language_name = nil, content, &tool)
|
64
|
+
new Mulang::Language::External.new(language_name, &tool), content
|
65
65
|
end
|
66
66
|
|
67
67
|
def self.analyse_many(codes, spec, **options)
|
@@ -76,13 +76,13 @@ module Mulang
|
|
76
76
|
run_many(codes, key: 'transformedAsts', **options) { |it| it.transformed_asts_analysis(operations, **options) }
|
77
77
|
end
|
78
78
|
|
79
|
-
private
|
80
|
-
|
81
79
|
def self.run_many(codes, key: nil, **options)
|
82
80
|
result = Mulang.analyse(codes.map { |it| yield it }, **options)
|
83
81
|
key ? result.map { |it| it[key] } : result
|
84
82
|
end
|
85
83
|
|
84
|
+
private
|
85
|
+
|
86
86
|
def expectation_results_for(result)
|
87
87
|
raise result['reason'] if result['tag'] == 'AnalysisFailed'
|
88
88
|
result['expectationResults']
|
data/lib/mulang/expectation.rb
CHANGED
@@ -8,6 +8,7 @@ module Mulang::Expectation
|
|
8
8
|
|
9
9
|
FUNCTIONAL_SMELLS = %w(
|
10
10
|
HasRedundantGuards
|
11
|
+
HasRedundantLambda
|
11
12
|
HasRedundantParameter
|
12
13
|
ShouldUseOtherwise
|
13
14
|
)
|
@@ -15,23 +16,25 @@ module Mulang::Expectation
|
|
15
16
|
OBJECT_ORIENTED_SMELLS = %w(
|
16
17
|
DoesNilTest
|
17
18
|
DoesNullTest
|
19
|
+
DoesTypeTest
|
18
20
|
HasTooManyMethods
|
19
21
|
OverridesEqualOrHashButNotBoth
|
20
22
|
ReturnsNil
|
21
23
|
ReturnsNull
|
24
|
+
UsesNamedSelfReference
|
22
25
|
)
|
23
26
|
|
24
27
|
IMPERATIVE_SMELLS = %w(
|
25
28
|
HasAssignmentCondition
|
26
29
|
HasAssignmentReturn
|
27
30
|
HasEmptyRepeat
|
28
|
-
HasRedundantLocalVariableReturn
|
29
31
|
HasRedundantRepeat
|
30
32
|
)
|
31
33
|
|
32
34
|
EXPRESSIVENESS_SMELLS = %w(
|
33
35
|
HasMisspelledBindings
|
34
36
|
HasMisspelledIdentifiers
|
37
|
+
HasTooShortBindings
|
35
38
|
HasTooShortIdentifiers
|
36
39
|
HasWrongCaseBinding
|
37
40
|
HasWrongCaseIdentifiers
|
@@ -40,7 +43,6 @@ module Mulang::Expectation
|
|
40
43
|
GENERIC_SMELLS = %w(
|
41
44
|
DiscardsExceptions
|
42
45
|
DoesConsolePrint
|
43
|
-
DoesTypeTest
|
44
46
|
HasCodeDuplication
|
45
47
|
HasDeclarationTypos
|
46
48
|
HasEmptyIfBranches
|
@@ -48,8 +50,7 @@ module Mulang::Expectation
|
|
48
50
|
HasLongParameterList
|
49
51
|
HasRedundantBooleanComparison
|
50
52
|
HasRedundantIf
|
51
|
-
|
52
|
-
HasTooShortBindings
|
53
|
+
HasRedundantLocalVariableReturn
|
53
54
|
HasUnreachableCode
|
54
55
|
HasUsageTypos
|
55
56
|
IsLongCode
|
@@ -57,12 +58,22 @@ module Mulang::Expectation
|
|
57
58
|
ShouldUseStrictComparators
|
58
59
|
)
|
59
60
|
|
60
|
-
|
61
|
+
JAVA_SCRIPT_SMELLS = %w(
|
62
|
+
JavaScript#UsesVarInsteadOfLet
|
63
|
+
)
|
64
|
+
|
65
|
+
SMELLS = GENERIC_SMELLS +
|
66
|
+
EXPRESSIVENESS_SMELLS +
|
67
|
+
IMPERATIVE_SMELLS +
|
68
|
+
OBJECT_ORIENTED_SMELLS +
|
69
|
+
FUNCTIONAL_SMELLS +
|
70
|
+
LOGIC_SMELLS +
|
71
|
+
JAVA_SCRIPT_SMELLS
|
61
72
|
|
62
73
|
def self.guess_type(expectation)
|
63
74
|
if expectation[:binding] == '<<custom>>'
|
64
75
|
Custom
|
65
|
-
elsif expectation[:inspection] =~
|
76
|
+
elsif expectation[:inspection] =~ /^(Not\:)?Has.*/ && !has_smell?(expectation[:inspection])
|
66
77
|
V0
|
67
78
|
else
|
68
79
|
V2
|
data/lib/mulang/language.rb
CHANGED
@@ -1,11 +1,25 @@
|
|
1
1
|
module Mulang::Language
|
2
|
+
CORE_LANGUAGES = %w(
|
3
|
+
Java
|
4
|
+
JavaScript
|
5
|
+
Prolog
|
6
|
+
Haskell
|
7
|
+
Python
|
8
|
+
Python2
|
9
|
+
Python3
|
10
|
+
Ruby
|
11
|
+
Php
|
12
|
+
C
|
13
|
+
Mulang
|
14
|
+
)
|
15
|
+
|
2
16
|
class Base
|
3
17
|
def identifiers(content, **options)
|
4
18
|
Mulang.analyse(identifiers_analysis(content, **options), **options)['outputIdentifiers'] rescue nil
|
5
19
|
end
|
6
20
|
|
7
21
|
def identifiers_analysis(content, **options)
|
8
|
-
|
22
|
+
build_analysis content, {includeOutputIdentifiers: true}, **options
|
9
23
|
end
|
10
24
|
|
11
25
|
def transformed_asts(content, operations, **options)
|
@@ -13,16 +27,22 @@ module Mulang::Language
|
|
13
27
|
end
|
14
28
|
|
15
29
|
def transformed_asts_analysis(content, operations, **options)
|
16
|
-
|
30
|
+
build_analysis content, {transformationSpecs: operations}, **options
|
17
31
|
end
|
18
32
|
|
19
33
|
def normalization_options(**options)
|
20
34
|
options.except(:serialization).presence
|
21
35
|
end
|
22
36
|
|
23
|
-
|
37
|
+
def ast(content, **options)
|
38
|
+
Mulang.analyse(ast_analysis(content, **options), **options)['outputAst'] rescue nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def ast_analysis(content, **options)
|
42
|
+
build_analysis content, {includeOutputAst: true}, **options
|
43
|
+
end
|
24
44
|
|
25
|
-
def
|
45
|
+
def build_analysis(content, spec, **options)
|
26
46
|
{
|
27
47
|
sample: sample(content),
|
28
48
|
spec: {
|
@@ -36,41 +56,60 @@ module Mulang::Language
|
|
36
56
|
end
|
37
57
|
|
38
58
|
class Native < Base
|
39
|
-
|
40
|
-
@language = language
|
41
|
-
end
|
59
|
+
attr_accessor :name
|
42
60
|
|
43
|
-
def
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
def ast_analysis(content, **options)
|
48
|
-
base_analysis content, {includeOutputAst: true}, **options
|
61
|
+
def initialize(language_name)
|
62
|
+
@name = language_name
|
49
63
|
end
|
50
64
|
|
51
65
|
def sample(content)
|
52
66
|
{
|
53
67
|
tag: 'CodeSample',
|
54
|
-
language: @
|
68
|
+
language: @name,
|
55
69
|
content: content
|
56
70
|
}
|
57
71
|
end
|
72
|
+
|
73
|
+
def core_name
|
74
|
+
@name
|
75
|
+
end
|
58
76
|
end
|
59
77
|
|
60
78
|
class External < Base
|
61
|
-
|
79
|
+
attr_accessor :name
|
80
|
+
|
81
|
+
def initialize(language_name = nil, &tool)
|
82
|
+
@name = language_name
|
62
83
|
@tool = block_given? ? tool : proc { |it| it }
|
63
84
|
end
|
64
85
|
|
65
86
|
def ast(content, **args)
|
66
|
-
|
87
|
+
if args[:serialization]
|
88
|
+
super
|
89
|
+
else
|
90
|
+
call_tool content
|
91
|
+
end
|
67
92
|
end
|
68
93
|
|
69
94
|
def sample(content)
|
70
95
|
{
|
71
96
|
tag: 'MulangSample',
|
72
|
-
ast:
|
97
|
+
ast: call_tool(content)
|
73
98
|
}
|
74
99
|
end
|
100
|
+
|
101
|
+
def build_analysis(*)
|
102
|
+
super.deep_merge(spec: {originalLanguage: core_name}.compact)
|
103
|
+
end
|
104
|
+
|
105
|
+
def core_name
|
106
|
+
@name.in?(CORE_LANGUAGES) ? name : nil
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
def call_tool(content)
|
112
|
+
@tool.call(content) rescue nil
|
113
|
+
end
|
75
114
|
end
|
76
115
|
end
|
data/lib/mulang/tokens.rb
CHANGED
@@ -92,6 +92,7 @@ module Mulang
|
|
92
92
|
keyword_ForEach: 'for',
|
93
93
|
keyword_Interface: 'interface',
|
94
94
|
keyword_Switch: 'switch',
|
95
|
+
keyword_Self: 'this',
|
95
96
|
operator_And: '&&',
|
96
97
|
operator_Divide: '/',
|
97
98
|
operator_Equal: 'equal',
|
@@ -123,6 +124,7 @@ module Mulang
|
|
123
124
|
keyword_If: 'if',
|
124
125
|
keyword_Return: 'return',
|
125
126
|
keyword_While: 'while',
|
127
|
+
keyword_Self: 'this',
|
126
128
|
operator_And: '&&',
|
127
129
|
operator_Divide: '/',
|
128
130
|
operator_Equal: '===',
|
@@ -155,6 +157,7 @@ module Mulang
|
|
155
157
|
keyword_If: 'if',
|
156
158
|
keyword_Return: 'return',
|
157
159
|
keyword_While: 'while',
|
160
|
+
keyword_Self: 'self',
|
158
161
|
operator_And: 'and',
|
159
162
|
operator_Divide: '/',
|
160
163
|
operator_Equal: '==',
|
@@ -188,6 +191,7 @@ module Mulang
|
|
188
191
|
keyword_ForEach: 'for',
|
189
192
|
keyword_Include: 'include',
|
190
193
|
keyword_Switch: 'case',
|
194
|
+
keyword_Self: 'self',
|
191
195
|
operator_And: '&&',
|
192
196
|
operator_Divide: '/',
|
193
197
|
operator_Equal: '==',
|
@@ -207,6 +211,7 @@ module Mulang
|
|
207
211
|
operator_BitwiseXor: '^',
|
208
212
|
operator_BitwiseLeftShift: '<<',
|
209
213
|
operator_BitwiseRightShift: '>>',
|
214
|
+
operator_Size: 'length',
|
210
215
|
operator_Hash: 'hash',
|
211
216
|
operator_ForwardComposition: '>>',
|
212
217
|
operator_BackwardComposition: '<<'
|
@@ -219,6 +224,7 @@ module Mulang
|
|
219
224
|
keyword_If: 'if',
|
220
225
|
keyword_Return: 'return',
|
221
226
|
keyword_While: 'while',
|
227
|
+
keyword_Self: 'this',
|
222
228
|
operator_And: '&&',
|
223
229
|
operator_Divide: '/',
|
224
230
|
operator_Equal: '==',
|
data/lib/mulang/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mulang
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.
|
4
|
+
version: 6.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Franco Bulgarelli
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mumukit-core
|