querly 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/README.md +143 -0
- data/Rakefile +18 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/querly +8 -0
- data/lib/querly.rb +26 -0
- data/lib/querly/analyzer.rb +64 -0
- data/lib/querly/cli.rb +81 -0
- data/lib/querly/cli/console.rb +110 -0
- data/lib/querly/cli/formatter.rb +143 -0
- data/lib/querly/cli/test.rb +118 -0
- data/lib/querly/config.rb +56 -0
- data/lib/querly/node_pair.rb +21 -0
- data/lib/querly/pattern/argument.rb +61 -0
- data/lib/querly/pattern/expr.rb +301 -0
- data/lib/querly/pattern/kind.rb +78 -0
- data/lib/querly/pattern/parser.y +169 -0
- data/lib/querly/preprocessor.rb +27 -0
- data/lib/querly/rule.rb +26 -0
- data/lib/querly/script.rb +15 -0
- data/lib/querly/script_enumerator.rb +84 -0
- data/lib/querly/tagging.rb +32 -0
- data/lib/querly/version.rb +3 -0
- data/querly.gemspec +32 -0
- data/sample.yaml +127 -0
- metadata +172 -0
data/sample.yaml
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
rules:
|
2
|
+
- id: sample.delete_all
|
3
|
+
pattern:
|
4
|
+
- delete_all
|
5
|
+
- update_all
|
6
|
+
message: |
|
7
|
+
Validations and callbacks will be skipped
|
8
|
+
|
9
|
+
It's faster than calling destroy or update each record, but may be dangerous.
|
10
|
+
justification:
|
11
|
+
- You have too much record to update/destroy one by one
|
12
|
+
- When you are sure skipping callbacks/validations is okay
|
13
|
+
before:
|
14
|
+
- records.delete_all
|
15
|
+
- "records.update_all(people_id: nil)"
|
16
|
+
after:
|
17
|
+
- records.each(&:destroy)
|
18
|
+
- |
|
19
|
+
records.each do |record|
|
20
|
+
record.update(people_id: nil)
|
21
|
+
end
|
22
|
+
- id: sample.save_not_conditional
|
23
|
+
pattern:
|
24
|
+
- "save(!validate: false, ...) [!conditional]"
|
25
|
+
- "update(...) [!conditional]"
|
26
|
+
- "update_attributes(...) [!conditional]"
|
27
|
+
message: |
|
28
|
+
save or update returns false when it fails.
|
29
|
+
|
30
|
+
Check the return value and try error recovery.
|
31
|
+
justification:
|
32
|
+
- When there is no way to recover from error.
|
33
|
+
before:
|
34
|
+
- record.save()
|
35
|
+
- "record.update(foo: bar)"
|
36
|
+
- "record.update(attrs)"
|
37
|
+
after:
|
38
|
+
- if record.save() then do_something end
|
39
|
+
- "record.save(validate: false)"
|
40
|
+
- "record.update(foo: 1) or fail"
|
41
|
+
- id: sample.skip_validation
|
42
|
+
pattern:
|
43
|
+
- "save(validate: false)"
|
44
|
+
- "save!(validate: false)"
|
45
|
+
message: These calls will skip validation
|
46
|
+
justification:
|
47
|
+
- When you want to skip validation
|
48
|
+
- When you have done validation code in other than ActiveRecord's validation mechanism
|
49
|
+
- id: sample.net_http
|
50
|
+
pattern: Net::HTTP
|
51
|
+
message: Use HTTPClient to make Web api calls
|
52
|
+
before:
|
53
|
+
- Net::HTTP.get(url)
|
54
|
+
after:
|
55
|
+
- HTTPClient.new.get_content(url)
|
56
|
+
- id: sample.root_url_without_locale
|
57
|
+
pattern: "root_url(!locale: _)"
|
58
|
+
message: Put locale parameter in the link to top page
|
59
|
+
before: root_url()
|
60
|
+
after: "root_url(locale: I18n.locale)"
|
61
|
+
- id: sample.transaction
|
62
|
+
pattern: transaction
|
63
|
+
message: Use with_account_lock helper, generally
|
64
|
+
justification:
|
65
|
+
- It does not need lock over account
|
66
|
+
- It does not access accounts table
|
67
|
+
before:
|
68
|
+
- transaction do something end
|
69
|
+
after:
|
70
|
+
- with_account_lock(account) do something end
|
71
|
+
- id: sample.oj
|
72
|
+
pattern:
|
73
|
+
- JSON.load
|
74
|
+
- JSON.dump
|
75
|
+
message: Use Oj for JSON load and dump
|
76
|
+
- id: sample.metaprogramming_abuse
|
77
|
+
pattern:
|
78
|
+
- classify
|
79
|
+
- constantize
|
80
|
+
- eval
|
81
|
+
- instance_values
|
82
|
+
- safe_constantize
|
83
|
+
message: Consider three times before using meta-programming
|
84
|
+
- id: sample.activesupport.try
|
85
|
+
pattern: "try(:symbol:, ...)"
|
86
|
+
message: try returns nil if the method is not defined, try! instead?
|
87
|
+
- id: sample.try_with_block_pass
|
88
|
+
pattern: "try(&:symbol:)"
|
89
|
+
message: It's same as just passing symbol, and slower
|
90
|
+
- id: sample.transaction_renew
|
91
|
+
pattern: "transaction(requires_new: true)"
|
92
|
+
message: Our RDBMS does not support nested transaction
|
93
|
+
- id: sample.capybara.assertion
|
94
|
+
pattern:
|
95
|
+
- assert_equal
|
96
|
+
- assert
|
97
|
+
message: |
|
98
|
+
Using minitest assertions with Capybara may make test unstable
|
99
|
+
|
100
|
+
Use Capybara assertions like assert_selector
|
101
|
+
justification:
|
102
|
+
- There is no access to Capybara in that test
|
103
|
+
- You have using retrying in test
|
104
|
+
tags:
|
105
|
+
- test
|
106
|
+
- capybara
|
107
|
+
- id: sample.capybara.negations
|
108
|
+
pattern:
|
109
|
+
- refute
|
110
|
+
- assert_nil
|
111
|
+
message: |
|
112
|
+
Negating capybara assertions would make test unstable
|
113
|
+
|
114
|
+
Maybe you can use Capybara helpers like has_no_css?
|
115
|
+
justification:
|
116
|
+
- There is no access to Capybara in the test
|
117
|
+
- You have implemented retrying in test
|
118
|
+
tags:
|
119
|
+
- test
|
120
|
+
- capybara
|
121
|
+
preprocessor:
|
122
|
+
.slim: slimrb --compile
|
123
|
+
tagging:
|
124
|
+
- path: test
|
125
|
+
tags:
|
126
|
+
- path: features/step_definitions
|
127
|
+
tags: test capybara
|
metadata
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: querly
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Soutaro Matsumoto
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-10-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.12'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.12'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: racc
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.4.14
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.4.14
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: thor
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.19'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.19'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: parser
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 2.3.1
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 2.3.1
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rainbow
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '2.1'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '2.1'
|
111
|
+
description: Querly is a query language and tool to find out method calls from Ruby
|
112
|
+
programs. You write simple query, and Querly finds out wrong pieces in your program.
|
113
|
+
email:
|
114
|
+
- matsumoto@soutaro.com
|
115
|
+
executables:
|
116
|
+
- querly
|
117
|
+
extensions: []
|
118
|
+
extra_rdoc_files: []
|
119
|
+
files:
|
120
|
+
- ".gitignore"
|
121
|
+
- ".travis.yml"
|
122
|
+
- Gemfile
|
123
|
+
- README.md
|
124
|
+
- Rakefile
|
125
|
+
- bin/console
|
126
|
+
- bin/setup
|
127
|
+
- exe/querly
|
128
|
+
- lib/querly.rb
|
129
|
+
- lib/querly/analyzer.rb
|
130
|
+
- lib/querly/cli.rb
|
131
|
+
- lib/querly/cli/console.rb
|
132
|
+
- lib/querly/cli/formatter.rb
|
133
|
+
- lib/querly/cli/test.rb
|
134
|
+
- lib/querly/config.rb
|
135
|
+
- lib/querly/node_pair.rb
|
136
|
+
- lib/querly/pattern/argument.rb
|
137
|
+
- lib/querly/pattern/expr.rb
|
138
|
+
- lib/querly/pattern/kind.rb
|
139
|
+
- lib/querly/pattern/parser.rb
|
140
|
+
- lib/querly/pattern/parser.y
|
141
|
+
- lib/querly/preprocessor.rb
|
142
|
+
- lib/querly/rule.rb
|
143
|
+
- lib/querly/script.rb
|
144
|
+
- lib/querly/script_enumerator.rb
|
145
|
+
- lib/querly/tagging.rb
|
146
|
+
- lib/querly/version.rb
|
147
|
+
- querly.gemspec
|
148
|
+
- sample.yaml
|
149
|
+
homepage: https://github.com/soutaro/querly
|
150
|
+
licenses: []
|
151
|
+
metadata: {}
|
152
|
+
post_install_message:
|
153
|
+
rdoc_options: []
|
154
|
+
require_paths:
|
155
|
+
- lib
|
156
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
requirements: []
|
167
|
+
rubyforge_project:
|
168
|
+
rubygems_version: 2.5.1
|
169
|
+
signing_key:
|
170
|
+
specification_version: 4
|
171
|
+
summary: Query Method Calls from Ruby Programs
|
172
|
+
test_files: []
|