plansheet 0.9.0 → 0.13.2

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: a8132e26b8647ea119299716b5f88674af3e4264614f7b881133eb6cbd32d7db
4
- data.tar.gz: c04f8bf586f6866acf03e809ab581b8010b6fb64be486791abb5fdd3274ae6e2
3
+ metadata.gz: 76e5120430c540166b342a58cf0a0c07dfaf773d0a46b1dcd05614be677fe1a6
4
+ data.tar.gz: 83eb24c7811f8e1e49d8f7f79a059c1451673907460203d95a5c28e98fbc74c2
5
5
  SHA512:
6
- metadata.gz: 6426deb869f89a6ff87d5f760acbab8687a542dd3942cf829c536ceb49c3a8268b18ab188d0ad0cb91457fa435963eb7193dd9844a283ccdfb4114e4dece54d8
7
- data.tar.gz: 4c03feeae9aed94d4e4df6c931c1317039f1100e67d7475cdbf8b67dae14e753899853291ad46f025e198d93def4b9c67c0c12da24d352d8db0880ae5ebb2f99
6
+ metadata.gz: 71d3b9dad2c16601ef4472805c282cbfced288e0fc1cee42b0b2e6cb508c5aa255a688c3301fbdee38ae5188f36a2d65cbee2ebc9aa3290771a8f2a2f84854ac
7
+ data.tar.gz: bc7d994b5d320c0c9f7ed53ca625afb6f586f228a48f16e2e9f1b2f392cae4cb1e1cef45ddc305069fb06a59a8e1fa9cf2324c1dc4a322e411f801d5802c41fe
data/.rubocop.yml CHANGED
@@ -1,5 +1,3 @@
1
- inherit_from: .rubocop_todo.yml
2
-
3
1
  AllCops:
4
2
  TargetRubyVersion: 2.6
5
3
  NewCops: enable
@@ -15,3 +13,9 @@ Style/StringLiteralsInInterpolation:
15
13
 
16
14
  Layout/LineLength:
17
15
  Max: 120
16
+
17
+ Metrics:
18
+ Enabled: false
19
+
20
+ Style/Documentation:
21
+ Enabled: false
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- plansheet (0.9.0)
4
+ plansheet (0.13.2)
5
5
  dc-kwalify (~> 1.0)
6
6
 
7
7
  GEM
data/exe/plansheet CHANGED
@@ -17,6 +17,10 @@ parser.on(
17
17
  "--cli",
18
18
  "CLI dump of projects (WIP)"
19
19
  )
20
+ parser.on(
21
+ "--location_filter LOCATION",
22
+ "location filter for CLI dump (WIP)"
23
+ )
20
24
  options = {}
21
25
  parser.parse!(into: options)
22
26
 
@@ -32,7 +36,10 @@ elsif options[:sort]
32
36
  Plansheet.resort_projects_in_dir config["projects_dir"]
33
37
  elsif options[:cli]
34
38
  project_arr = Plansheet.load_projects_dir config["projects_dir"]
35
- project_arr.sort.each do |proj|
39
+ project_arr.sort!
40
+ project_arr.delete_if { |x| x.status == "dropped" || x.status == "done" }
41
+ project_arr.select! { |x| x.location == options[:location_filter] } if options[:location_filter]
42
+ project_arr.each do |proj|
36
43
  puts proj
37
44
  puts "\n"
38
45
  end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Plansheet
4
+ class Project
5
+ def to_s
6
+ str = String.new
7
+ str << "# #{@name}\n"
8
+ STRING_PROPERTIES.each do |o|
9
+ str << stringify_string_property(o)
10
+ end
11
+ DATE_PROPERTIES.each do |o|
12
+ str << stringify_string_property(o)
13
+ end
14
+ ARRAY_PROPERTIES.each do |o|
15
+ str << stringify_array_property(o)
16
+ end
17
+ str
18
+ end
19
+
20
+ def stringify_string_property(prop)
21
+ if instance_variable_defined? "@#{prop}"
22
+ "#{prop}: #{instance_variable_get("@#{prop}")}\n"
23
+ else
24
+ ""
25
+ end
26
+ end
27
+
28
+ def stringify_date_property(prop)
29
+ if instance_variable_defined? "@#{prop}"
30
+ "#{prop}: #{instance_variable_get("@#{prop}")}\n"
31
+ else
32
+ ""
33
+ end
34
+ end
35
+
36
+ def stringify_array_property(prop)
37
+ str = String.new
38
+ if instance_variable_defined? "@#{prop}"
39
+ str << "#{prop}:\n"
40
+ instance_variable_get("@#{prop}").each do |t|
41
+ str << "- #{t}\n"
42
+ end
43
+ end
44
+ str
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,162 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+ require "date"
5
+ require "pathname"
6
+
7
+ module Plansheet
8
+ # Once there's some stability in plansheet and dc-kwalify, will pre-load this
9
+ # to save the later YAML.load
10
+ PROJECT_YAML_SCHEMA = <<~YAML
11
+ desc: dc-tasks project schema
12
+ type: seq
13
+ sequence:
14
+ - type: map
15
+ mapping:
16
+ "project":
17
+ desc: Project name
18
+ type: str
19
+ required: yes
20
+ "namespace":
21
+ desc: Namespace of a group of projects (for organizing)
22
+ type: str
23
+ required: yes
24
+ "priority":
25
+ desc: Project priority
26
+ type: str
27
+ enum:
28
+ - high
29
+ - medium
30
+ - low
31
+ "status":
32
+ desc: The current status of the project
33
+ type: str
34
+ enum:
35
+ - wip # project is a work-in-progress
36
+ - ready # project has tasks, ready to go
37
+ - waiting # project in waiting on some external person/event
38
+ - blocked # project is blocked by another project, but otherwise ready/wip
39
+ - planning # project in planning phase (set manually)
40
+ - idea # project is little more than an idea
41
+ - dropped # project has been explicitly dropped, but
42
+ # want to keep around for reference, etc
43
+ - done # project is finished, but want to keep around
44
+ # for reference, etc.
45
+ "location":
46
+ desc: Location
47
+ type: str
48
+ "notes":
49
+ desc: Free-form notes string
50
+ type: str
51
+ "time_estimate":
52
+ desc: The estimated amount of time before a project is completed
53
+ type: str
54
+ "frequency":
55
+ desc: The amount of time before a recurring project moves to ready status again from when it was last done (WIP)
56
+ type: str
57
+ pattern: /\\d+[dwDW]/
58
+ "lead_time":
59
+ desc: The amount of time before a recurring project is "due" moved to ready where the project (sort of a deferral mechanism) (WIP)
60
+ type: str
61
+ pattern: /\\d+[dwDW]/
62
+ "due":
63
+ desc: Due date of the task
64
+ type: date
65
+ "defer":
66
+ desc: Defer task until this day
67
+ type: date
68
+ "completed_on":
69
+ desc: When the (non-recurring) project was completed
70
+ type: date
71
+ "created_on":
72
+ desc: When the project was created
73
+ type: date
74
+ "starts_on":
75
+ desc: For ICS (WIP)
76
+ type: date
77
+ "last_reviewed":
78
+ desc: When the project was last reviewed (WIP)
79
+ type: date
80
+ "last_done":
81
+ desc: When the recurring project was last completed (WIP)
82
+ type: date
83
+ "dependencies":
84
+ desc: The names of projects that need to be completed before this project can be started/completed
85
+ type: seq
86
+ sequence:
87
+ - type: str
88
+ "externals":
89
+ desc: List of external commitments, ie who else cares about project completion?
90
+ type: seq
91
+ sequence:
92
+ - type: str
93
+ "urls":
94
+ desc: List of URLs that may be pertinent
95
+ type: seq
96
+ sequence:
97
+ - type: str
98
+ "tasks":
99
+ desc: List of tasks to do
100
+ type: seq
101
+ sequence:
102
+ - type: str
103
+ "done":
104
+ desc: List of tasks which have been completed
105
+ type: seq
106
+ sequence:
107
+ - type: str
108
+ "tags":
109
+ desc: List of tags (WIP)
110
+ type: seq
111
+ sequence:
112
+ - type: str
113
+ YAML
114
+ PROJECT_SCHEMA = YAML.safe_load(PROJECT_YAML_SCHEMA)
115
+
116
+ class ProjectYAMLFile
117
+ attr_reader :projects
118
+
119
+ def initialize(path)
120
+ @path = path
121
+ # TODO: this won't GC, inline validation instead?
122
+
123
+ # Handle pre-Ruby 3.1 psych versions (this is brittle)
124
+ @raw = if Psych::VERSION.split(".")[0].to_i >= 4
125
+ YAML.load_file(path, permitted_classes: [Date])
126
+ else
127
+ YAML.load_file(path)
128
+ end
129
+
130
+ validate_schema
131
+ @raw ||= []
132
+ @projects = @raw.map do |proj|
133
+ proj["namespace"] = namespace
134
+ Project.new proj
135
+ end
136
+ end
137
+
138
+ def namespace
139
+ # TODO: yikes
140
+ ::Pathname.new(@path).basename.to_s.gsub(/\.yml$/, "")
141
+ end
142
+
143
+ def validate_schema
144
+ validator = Kwalify::Validator.new(Plansheet::PROJECT_SCHEMA)
145
+ errors = validator.validate(@raw)
146
+ # Check YAML validity
147
+ return unless errors && !errors.empty?
148
+
149
+ $stderr.write "Schema errors in #{@path}:\n"
150
+ errors.each { |err| puts "- [#{err.path}] #{err.message}" }
151
+ abort
152
+ end
153
+
154
+ def sort!
155
+ @projects.sort!
156
+ end
157
+
158
+ def yaml_dump
159
+ YAML.dump(@projects.map(&:to_h))
160
+ end
161
+ end
162
+ end
@@ -2,16 +2,19 @@
2
2
 
3
3
  require "yaml"
4
4
  require "date"
5
+ require_relative "project/yaml"
6
+ require_relative "project/stringify"
5
7
 
6
8
  module Plansheet
7
9
  PROJECT_STATUS_PRIORITY = {
8
10
  "wip" => 1,
9
11
  "ready" => 2,
10
12
  "blocked" => 3,
11
- "planning" => 4,
12
- "idea" => 5,
13
- "dropped" => 6,
14
- "done" => 7
13
+ "waiting" => 4,
14
+ "planning" => 5,
15
+ "idea" => 6,
16
+ "dropped" => 7,
17
+ "done" => 8
15
18
  }.freeze
16
19
 
17
20
  PROJECT_PRIORITY = {
@@ -20,77 +23,12 @@ module Plansheet
20
23
  "low" => 3
21
24
  }.freeze
22
25
 
23
- # Once there's some stability in plansheet and dc-kwalify, will pre-load this
24
- # to save the later YAML.load
25
- PROJECT_YAML_SCHEMA = <<~YAML
26
- desc: dc-tasks project schema
27
- type: seq
28
- sequence:
29
- - type: map
30
- mapping:
31
- "project":
32
- desc: Project name
33
- type: str
34
- required: yes
35
- "priority":
36
- desc: Project priority
37
- type: str
38
- enum:
39
- - high
40
- - medium
41
- - low
42
- "status":
43
- desc: The current status of the project
44
- type: str
45
- enum:
46
- - wip # project is a work-in-progress
47
- - ready # project is fully scoped, ready to go
48
- - blocked # project is blocked, but otherwise ready/wip
49
- - planning # project in planning phase
50
- - idea # project is little more than an idea
51
- - dropped # project has been explicitly dropped, but
52
- # want to keep around for reference, etc
53
- - done # project is finished, but want to keep around
54
- # for reference, etc.
55
- "location":
56
- desc: Location
57
- type: str
58
- "notes":
59
- desc: Free-form notes string
60
- type: str
61
- "due":
62
- desc: Due date of the task
63
- type: date
64
- "defer":
65
- desc: Defer task until this day
66
- type: date
67
- "dependencies":
68
- desc: The names of projects that need to be completed before this project can be started/completed
69
- type: seq
70
- sequence:
71
- - type: str
72
- "externals":
73
- desc: List of external commitments, ie who else cares about project completion?
74
- type: seq
75
- sequence:
76
- - type: str
77
- "urls":
78
- desc: List of URLs that may be pertinent
79
- type: seq
80
- sequence:
81
- - type: str
82
- "tasks":
83
- desc: List of tasks to do
84
- type: seq
85
- sequence:
86
- - type: str
87
- "done":
88
- desc: List of tasks which have been completed
89
- type: seq
90
- sequence:
91
- - type: str
92
- YAML
93
- PROJECT_SCHEMA = YAML.safe_load(PROJECT_YAML_SCHEMA)
26
+ def self.parse_date_duration(str)
27
+ return Regexp.last_match(1).to_i if str.strip.match(/(\d+)[dD]/)
28
+ return (Regexp.last_match(1).to_i * 7) if str.strip.match(/(\d+)[wW]/)
29
+
30
+ raise "Can't parse time duration string #{str}"
31
+ end
94
32
 
95
33
  # The use of instance_variable_set/get probably seems a bit weird, but the
96
34
  # intent is to avoid object allocation on non-existent project properties, as
@@ -101,10 +39,19 @@ module Plansheet
101
39
  class Project
102
40
  include Comparable
103
41
 
42
+ DEFAULT_COMPARISON_ORDER = %w[
43
+ completeness
44
+ dependency
45
+ priority
46
+ defer
47
+ due
48
+ status
49
+ ].map { |x| "compare_#{x}".to_sym }.freeze
104
50
  # NOTE: The order of these affects presentation!
105
- STRING_PROPERTIES = %w[priority status location notes].freeze
106
- DATE_PROPERTIES = %w[due defer].freeze
107
- ARRAY_PROPERTIES = %w[dependencies externals urls tasks done].freeze
51
+ # namespace is derived from file name
52
+ STRING_PROPERTIES = %w[namespace priority status location notes time_estimate frequency lead_time].freeze
53
+ DATE_PROPERTIES = %w[due defer completed_on created_on starts_on last_done last_reviewed].freeze
54
+ ARRAY_PROPERTIES = %w[dependencies externals urls tasks done tags].freeze
108
55
 
109
56
  ALL_PROPERTIES = STRING_PROPERTIES + DATE_PROPERTIES + ARRAY_PROPERTIES
110
57
 
@@ -132,14 +79,7 @@ module Plansheet
132
79
 
133
80
  def <=>(other)
134
81
  ret_val = 0
135
- %i[
136
- compare_completeness
137
- compare_dependency
138
- compare_priority
139
- compare_due
140
- compare_defer
141
- compare_status
142
- ].each do |method|
82
+ DEFAULT_COMPARISON_ORDER.each do |method|
143
83
  ret_val = send(method, other)
144
84
  break if ret_val != 0
145
85
  end
@@ -177,132 +117,116 @@ module Plansheet
177
117
 
178
118
  def compare_dependency(other)
179
119
  return 0 if @dependencies.nil? && other.dependencies.nil?
120
+
180
121
  if @dependencies.nil?
181
- return -1 if other.dependencies.any? {|dep|
122
+ return -1 if other.dependencies.any? do |dep|
182
123
  @name.downcase == dep.downcase
183
- }
184
- else
185
- return 1 if @dependencies.any? {|dep|
186
- other.name.downcase == dep.downcase
187
- }
124
+ end
125
+ elsif @dependencies.any? do |dep|
126
+ other.name.downcase == dep.downcase
127
+ end
128
+ return 1
188
129
  end
189
- return 0
130
+ 0
190
131
  end
191
132
 
192
133
  # Projects that are dropped or done are considered "complete", insofar as
193
134
  # they are only kept around for later reference.
194
135
  def compare_completeness(other)
195
- return 0 if self.dropped_or_done? && other.dropped_or_done?
196
- return 0 if !self.dropped_or_done? && !other.dropped_or_done?
197
- self.dropped_or_done? ? 1 : -1
136
+ return 0 if dropped_or_done? && other.dropped_or_done?
137
+ return 0 if !dropped_or_done? && !other.dropped_or_done?
138
+
139
+ dropped_or_done? ? 1 : -1
198
140
  end
199
141
 
200
142
  def status
201
143
  return @status if @status
144
+ return recurring_status if recurring?
145
+ return task_based_status if @tasks || @done
146
+ return "done" if @completed_on && @tasks.nil?
202
147
 
203
- if @tasks&.count&.positive?
204
- if @done&.count&.positive?
205
- "wip"
206
- else
207
- "planning"
208
- end
148
+ "idea"
149
+ end
150
+
151
+ def task_based_status
152
+ if @tasks&.count&.positive? && @done&.count&.positive?
153
+ "wip"
154
+ elsif @tasks&.count&.positive?
155
+ "ready"
156
+ elsif @done&.count&.positive?
157
+ "done"
209
158
  else
210
159
  "idea"
211
160
  end
212
161
  end
213
162
 
214
- def dropped_or_done?
215
- status == "dropped" || status == "done"
216
- end
217
-
218
- def to_s
219
- str = String.new
220
- str << "# #{@name}\n"
221
- STRING_PROPERTIES.each do |o|
222
- str << stringify_string_property(o)
223
- end
224
- DATE_PROPERTIES.each do |o|
225
- str << stringify_string_property(o)
226
- end
227
- ARRAY_PROPERTIES.each do |o|
228
- str << stringify_array_property(o)
163
+ def recurring_status
164
+ # add frequency to last_done
165
+ if @last_done
166
+ # This project has been done once before
167
+ subsequent_recurring_status
168
+ else
169
+ # This recurring project is being done for the first time
170
+ task_based_status
229
171
  end
230
- str
231
172
  end
232
173
 
233
- def stringify_string_property(prop)
234
- if instance_variable_defined? "@#{prop}"
235
- "#{prop}: #{instance_variable_get("@#{prop}")}\n"
236
- else
237
- ""
238
- end
174
+ def subsequent_recurring_status
175
+ return "done" if @lead_time && defer > Date.today
176
+ return "done" if due > Date.today
177
+
178
+ task_based_status
239
179
  end
240
180
 
241
- def stringify_date_property(prop)
242
- if instance_variable_defined? "@#{prop}"
243
- "#{prop}: #{instance_variable_get("@#{prop}")}\n"
244
- else
245
- ""
246
- end
181
+ def process_recurring
182
+ # TODO: Tasks will be moved from done->tasks if recurring project is
183
+ # starting again
247
184
  end
248
185
 
249
- def stringify_array_property(prop)
250
- str = String.new
251
- if instance_variable_defined? "@#{prop}"
252
- str << "#{prop}:\n"
253
- instance_variable_get("@#{prop}").each do |t|
254
- str << "- #{t}\n"
255
- end
256
- end
257
- str
186
+ # Due date either explicit or recurring
187
+ def due
188
+ return @due if @due
189
+ return recurring_due_date if recurring?
190
+
191
+ nil
258
192
  end
259
193
 
260
- def to_h
261
- h = { "project" => @name }
262
- ALL_PROPERTIES.each do |prop|
263
- h[prop] = instance_variable_get("@#{prop}") if instance_variable_defined?("@#{prop}")
194
+ def recurring_due_date
195
+ if @last_done
196
+ @last_done + Plansheet.parse_date_duration(@frequency)
197
+ else
198
+ Date.today
264
199
  end
265
- h.delete "priority" if h.key?("priority") && h["priority"] == "low"
266
- h.delete "status" if h.key?("status") && h["status"] == "idea"
267
- h
268
200
  end
269
- end
270
-
271
- class ProjectYAMLFile
272
- attr_reader :projects
273
-
274
- def initialize(path)
275
- @path = path
276
- # TODO: this won't GC, inline validation instead?
277
201
 
278
- # Handle pre-Ruby 3.1 psych versions (this is brittle)
279
- @raw = if Psych::VERSION.split(".")[0].to_i >= 4
280
- YAML.load_file(path, permitted_classes: [Date])
281
- else
282
- YAML.load_file(path)
283
- end
202
+ def defer
203
+ return @defer if @defer
204
+ return lead_time_deferral if @lead_time && due
284
205
 
285
- validate_schema
286
- @projects = @raw.map { |proj| Project.new proj }
206
+ nil
287
207
  end
288
208
 
289
- def validate_schema
290
- validator = Kwalify::Validator.new(Plansheet::PROJECT_SCHEMA)
291
- errors = validator.validate(@raw)
292
- # Check YAML validity
293
- return unless errors && !errors.empty?
209
+ def lead_time_deferral
210
+ [(due - Plansheet.parse_date_duration(@lead_time)),
211
+ Date.today].max
212
+ end
294
213
 
295
- $stderr.write "Schema errors in #{@path}:\n"
296
- errors.each { |err| puts "- [#{err.path}] #{err.message}" }
297
- abort
214
+ def recurring?
215
+ !@frequency.nil?
298
216
  end
299
217
 
300
- def sort!
301
- @projects.sort!
218
+ def dropped_or_done?
219
+ status == "dropped" || status == "done"
302
220
  end
303
221
 
304
- def yaml_dump
305
- YAML.dump(@projects.map(&:to_h))
222
+ def to_h
223
+ h = { "project" => @name }
224
+ ALL_PROPERTIES.each do |prop|
225
+ h[prop] = instance_variable_get("@#{prop}") if instance_variable_defined?("@#{prop}")
226
+ end
227
+ h.delete "priority" if h.key?("priority") && h["priority"] == "low"
228
+ h.delete "status" if h.key?("status") && h["status"] == "idea"
229
+ h
306
230
  end
307
231
  end
308
232
  end
@@ -10,7 +10,7 @@ module Plansheet
10
10
  projects_str = String.new
11
11
  projects_str << sheet_header
12
12
 
13
- sorted_arr.first(60).each do |p|
13
+ sorted_arr.each do |p|
14
14
  projects_str << project_minipage(p)
15
15
  end
16
16
  puts "Writing to #{output_file}"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Plansheet
4
- VERSION = "0.9.0"
4
+ VERSION = "0.13.2"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plansheet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.13.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Crosby
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-04 00:00:00.000000000 Z
11
+ date: 2022-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dc-kwalify
@@ -33,7 +33,6 @@ extensions: []
33
33
  extra_rdoc_files: []
34
34
  files:
35
35
  - ".rubocop.yml"
36
- - ".rubocop_todo.yml"
37
36
  - CODE_OF_CONDUCT.md
38
37
  - Gemfile
39
38
  - Gemfile.lock
@@ -45,6 +44,8 @@ files:
45
44
  - exe/plansheet
46
45
  - lib/plansheet.rb
47
46
  - lib/plansheet/project.rb
47
+ - lib/plansheet/project/stringify.rb
48
+ - lib/plansheet/project/yaml.rb
48
49
  - lib/plansheet/sheet.rb
49
50
  - lib/plansheet/version.rb
50
51
  homepage: https://dafyddcrosby.com
data/.rubocop_todo.yml DELETED
@@ -1,36 +0,0 @@
1
- # This configuration was generated by
2
- # `rubocop --auto-gen-config`
3
- # on 2022-06-04 17:25:54 UTC using RuboCop version 1.29.1.
4
- # The point is for the user to remove these configuration records
5
- # one by one as the offenses are removed from the code base.
6
- # Note that changes in the inspected code, or installation of new
7
- # versions of RuboCop, may require this file to be generated again.
8
-
9
- # Offense count: 1
10
- # Configuration parameters: CountComments, CountAsOne.
11
- Metrics/ClassLength:
12
- Max: 105
13
-
14
- # Offense count: 1
15
- # Configuration parameters: IgnoredMethods.
16
- Metrics/CyclomaticComplexity:
17
- Max: 8
18
-
19
- # Offense count: 2
20
- # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
21
- Metrics/MethodLength:
22
- Max: 12
23
-
24
- # Offense count: 1
25
- # Configuration parameters: IgnoredMethods.
26
- Metrics/PerceivedComplexity:
27
- Max: 10
28
-
29
- # Offense count: 2
30
- # Configuration parameters: AllowedConstants.
31
- Style/Documentation:
32
- Exclude:
33
- - 'spec/**/*'
34
- - 'test/**/*'
35
- - 'lib/plansheet.rb'
36
- - 'lib/plansheet/project.rb'