dark_finger 0.3.1 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 2c5b4a2b9fd64fc712fe87e8217705c9fc10fb37
4
- data.tar.gz: 01cf3213671f4e9a18ad2e355b549dc5ee38ab06
2
+ SHA256:
3
+ metadata.gz: '0962a291b4b5701f5523c84ecbd4865afe91953e5a40ce3c3467a92d31dfba1a'
4
+ data.tar.gz: b6bbe7abfa4d16caca2ec60a3090435d4498db374ec2e0bd451608ccaa747ee8
5
5
  SHA512:
6
- metadata.gz: 256aea1e41241022db13ec4c7f7dabdcd7eeeb878a96282833ab63b679c0411c4d8db2dd193116847c8d42d6f96ebf78c14c4ff152f46d93d01137f8bf917f10
7
- data.tar.gz: 5a74ed3a93cbdb4951fa3b98acb9b7a4d37581452c04fc651009298ff0b3011abae28bf87915c80b6fdb3acc2bc6eaab981dbbdd93067f621fd3f4a3dff0b46a
6
+ metadata.gz: 5f60cc6dd2325e4a9c758170250b5daadfb3bec991bdeab141cd6fc864d4df4300430d94bffc8bbaac9abf3b4c1e7e7de9c7037f7124f815d2343e6f0b74ac31
7
+ data.tar.gz: 57732e831e03a50c242bbaf05661879b10781cf30bf389f374e1bca173889c06862a6a17cf40a43b3701806613561cb63bbcc9fe21bed69d20c9c02e6a8698b9
Binary file
data/README.md CHANGED
@@ -1,23 +1,68 @@
1
- # DarkFinger
1
+ ![Dark Finger](.github/dark_finger.jpg "Dark Finger")
2
2
 
3
- A Rubocop extension to check the layout of ActiveModel files. The cop will
4
- check that elements appear together, in the right order, and commented as
5
- desired.
3
+ A Rubocop extension to check the layout of ActiveModel files.
6
4
 
7
- Supported elements:
5
+ At work we've found that, as our model files grow in size, there are many
6
+ "macro" methods (scopes, validations, etc) at the top that become messy and
7
+ inconsistent across files.
8
8
 
9
- * associations
10
- * attributes
11
- * callbacks
12
- * constants
13
- * enums
14
- * includes
15
- * modules
16
- * scopes
17
- * validations
18
- * class_methods
19
- * instance_methods
9
+ To help keep things orderly over time we wrote ... _**Dark Finger**_. This
10
+ Cop will issue warnings if the various model elements:
20
11
 
12
+ 1. Aren't grouped together
13
+ 2. The groups don't appear in the right order
14
+ 3. The groups aren't commented properly
15
+
16
+ This is the kind of model file that we like. Notice how all the model elements
17
+ are grouped, commented, and ordered (although ordering is not visible from just
18
+ one file):
19
+
20
+ ```ruby
21
+ class Horse < ApplicationRecord
22
+ ## Includes ##
23
+ include GallopingMagicPowers
24
+ include LazerEyes
25
+
26
+ ## Enums ##
27
+ enum breed: %i[thoroughbred
28
+ arabian
29
+ american quarter horse
30
+ clydesdale
31
+ mustang]
32
+
33
+ ## Associations ##
34
+ has_many :legs
35
+ belongs_to :brain
36
+ belongs_to :saddle
37
+
38
+ ## Validations ##
39
+ validates_presence_of :breed
40
+ validates_presence_of :age
41
+
42
+ ## Scopes ##
43
+ scope :dead, -> { where(state: 'dead') }
44
+ scope :alive, -> { where(state: 'alive') }
45
+
46
+ ## Attributes ##
47
+ attr_accessor :promote_to_demon_horse
48
+
49
+ ## Callbacks ##
50
+ after_save :callbacks_are_evil_you_should_be_ashamed
51
+
52
+ ## Misc ##
53
+ serialize :nose_hairs, Array
54
+ acts_as_taggable
55
+
56
+ def self.foobario
57
+ # foo
58
+ end
59
+
60
+ def gallop_hard
61
+ # ...
62
+ end
63
+ end
64
+
65
+ ```
21
66
 
22
67
  ## Installation
23
68
 
@@ -35,23 +80,26 @@ Or install it yourself as:
35
80
 
36
81
  $ gem install dark_finger
37
82
 
38
- ## Usage
83
+ ## Usage and Configuration
39
84
 
40
85
  Install the gem. Then, in your `.rubycop.yml` file, require `dark_finger` and
41
86
  add your desired config.
42
87
 
43
- For example, here is the default config:
88
+ For example:
44
89
 
45
- ```ruby
90
+ ```yaml
46
91
  # in .rubocop.yml
47
92
 
48
-
49
93
  # this is required
50
94
  require: dark_finger
51
95
 
52
96
  DarkFinger/ModelStructure:
97
+
98
+ # this is also required
53
99
  Include:
54
100
  - 'app/models/*'
101
+
102
+ # specify the order that the model elements must appear in
55
103
  required_order:
56
104
  - module
57
105
  - include
@@ -62,21 +110,44 @@ DarkFinger/ModelStructure:
62
110
  - scope
63
111
  - attributes
64
112
  - callback
113
+ - misc
114
+ - constructor
65
115
  - class_method
66
116
  - instance_method
67
- required_comments:
68
- association: '# Relationships'
69
- attribute: '# Attributes'
70
- callback: '# Callbacks'
71
- constant: '# Constants'
72
- enum: '# Enums'
73
- include: '# Includes'
74
- module: '# Modules'
75
- scope: '# Scopes'
76
- validation: '# Validations'
77
117
 
118
+ # specify the comments that must appear above each group of model elements
119
+ required_comments:
120
+ association: '## Relationships ##'
121
+ attribute: '## Attributes ##'
122
+ callback: '## Callbacks ##'
123
+ constant: '## Constants ##'
124
+ enum: '## Enums ##'
125
+ include: '## Includes ##'
126
+ module: '## Modules ##'
127
+ scope: '## Scopes ##'
128
+ validation: '## Validations ##'
78
129
  ```
79
130
 
131
+ Supported model elements:
132
+
133
+
134
+ | Config key | Description (when not obvious) |
135
+ |-----------------|--------------------------------------------|
136
+ | association | |
137
+ | attribute | `attr_reader` and friends |
138
+ | callback | `after_save` et al. |
139
+ | class_method | |
140
+ | constant | |
141
+ | constructor | |
142
+ | enum | |
143
+ | include | |
144
+ | instance_method | |
145
+ | misc | This is a configurable set of method calls |
146
+ | module | Any `module Foo; ...; end` declarations |
147
+ | scope | Any `scope` or `default_scope` calls |
148
+ | validation | |
149
+
150
+
80
151
  ## License
81
152
 
82
153
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -1,3 +1,3 @@
1
1
  module DarkFinger
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -60,6 +60,10 @@ module RuboCop
60
60
  end
61
61
  end
62
62
 
63
+ def private_declaration?
64
+ method_name == :private && receiver.nil?
65
+ end
66
+
63
67
  private
64
68
 
65
69
  def nested_in_with_options?
@@ -114,10 +114,16 @@ module RuboCop
114
114
 
115
115
  def process_node(node, seen_element: nil)
116
116
  return if @order_violation_reported
117
+ return if @seen_private_declaration
117
118
 
118
119
  node = ActiveModelNodeDecorator.new(node, misc_method_names: misc_method_names)
119
- seen_element ||= node.node_type
120
120
 
121
+ if node.private_declaration?
122
+ @seen_private_declaration = true
123
+ return
124
+ end
125
+
126
+ seen_element ||= node.node_type
121
127
  return unless seen_element
122
128
 
123
129
  return if node.ignore_due_to_nesting?
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dark_finger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Professor Wang Matrix PhD
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2018-10-06 00:00:00.000000000 Z
12
+ date: 2018-10-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -89,6 +89,7 @@ executables: []
89
89
  extensions: []
90
90
  extra_rdoc_files: []
91
91
  files:
92
+ - ".github/dark_finger.jpg"
92
93
  - ".gitignore"
93
94
  - ".rspec"
94
95
  - ".travis.yml"
@@ -123,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
124
  version: '0'
124
125
  requirements: []
125
126
  rubyforge_project:
126
- rubygems_version: 2.5.2.1
127
+ rubygems_version: 2.7.6
127
128
  signing_key:
128
129
  specification_version: 4
129
130
  summary: ActiveModel layout cop for Rubocop