plansheet 0.13.2 → 0.15.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 +4 -4
- data/Gemfile.lock +1 -1
- data/exe/plansheet +6 -7
- data/lib/plansheet/pool.rb +53 -0
- data/lib/plansheet/project/stringify.rb +3 -1
- data/lib/plansheet/project/yaml.rb +12 -7
- data/lib/plansheet/project.rb +4 -2
- data/lib/plansheet/version.rb +1 -1
- data/lib/plansheet.rb +2 -19
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f121593269dc11059fe547d8b72d58c2ad1a6685ae4826ac39daaff8b33f7c9a
|
4
|
+
data.tar.gz: 4020dab046e837f02b64cfc975408240d472b04a26bc6f40e7e552d915d77336
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae82c5c2df93d55e520262754cc1c6e8b1b80a9a2fe230c09d00bd7ed4a38790c71b0dfcde5ac178e38112a26284219f21a8d99e48212601bbbcfae98607c0d1
|
7
|
+
data.tar.gz: 6ca757244abd515dcd86bbedb5a31590a53fbc8720e35167549bfe326c1f96673acef49b0dd1044a0e92f43253ef1442d126872859cebfa0f1185bb06612da59
|
data/Gemfile.lock
CHANGED
data/exe/plansheet
CHANGED
@@ -25,18 +25,17 @@ options = {}
|
|
25
25
|
parser.parse!(into: options)
|
26
26
|
|
27
27
|
config = Plansheet.load_config
|
28
|
+
pool = Plansheet::Pool.new({ projects_dir: config["projects_dir"] })
|
28
29
|
|
29
30
|
if options[:sheet] || options.empty?
|
30
|
-
project_arr = Plansheet.load_projects_dir config["projects_dir"]
|
31
|
-
|
32
31
|
Dir.mkdir config["output_dir"] unless Dir.exist? config["output_dir"]
|
33
|
-
|
34
|
-
Plansheet::Sheet.new("#{config["output_dir"]}/projects.md", project_arr)
|
32
|
+
Plansheet::Sheet.new("#{config["output_dir"]}/projects.md", pool.projects)
|
35
33
|
elsif options[:sort]
|
36
|
-
|
34
|
+
# Pool sorts projects, this now just matches old behaviour
|
35
|
+
pool.write_projects
|
37
36
|
elsif options[:cli]
|
38
|
-
|
39
|
-
project_arr.
|
37
|
+
# TODO: add a project filter method
|
38
|
+
project_arr = pool.projects
|
40
39
|
project_arr.delete_if { |x| x.status == "dropped" || x.status == "done" }
|
41
40
|
project_arr.select! { |x| x.location == options[:location_filter] } if options[:location_filter]
|
42
41
|
project_arr.each do |proj|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Plansheet
|
4
|
+
# The "pool" is the aggregated collection of projects, calendar events, etc.
|
5
|
+
class Pool
|
6
|
+
attr_accessor :projects
|
7
|
+
|
8
|
+
def initialize(config)
|
9
|
+
@projects_dir = config[:projects_dir]
|
10
|
+
# @completed_projects_dir = config(:completed_projects_dir)
|
11
|
+
|
12
|
+
load_projects_dir(@projects_dir)
|
13
|
+
# TODO: Slurp all files
|
14
|
+
sort_projects
|
15
|
+
end
|
16
|
+
|
17
|
+
def sort_projects
|
18
|
+
@projects.sort!
|
19
|
+
end
|
20
|
+
|
21
|
+
def project_namespaces
|
22
|
+
@projects.collect(&:namespace).uniq.sort
|
23
|
+
end
|
24
|
+
|
25
|
+
def projects_in_namespace(namespace)
|
26
|
+
@projects.select { |x| x.namespace == namespace }
|
27
|
+
end
|
28
|
+
|
29
|
+
def write_projects
|
30
|
+
# TODO: This leaves potential for duplicate projects where empty files
|
31
|
+
# are involved once completed project directories are a thing - will need
|
32
|
+
# to keep a list of project files to delete
|
33
|
+
project_namespaces.each do |ns|
|
34
|
+
# TODO: move this to ProjectYAMLFile
|
35
|
+
#
|
36
|
+
f = "#{@projects_dir}/#{ns}.yml"
|
37
|
+
pyf = ProjectYAMLFile.new f
|
38
|
+
pyf.projects = projects_in_namespace(ns)
|
39
|
+
pyf.write
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def load_projects_dir(dir)
|
44
|
+
project_arr = []
|
45
|
+
projects = Dir.glob("*yml", base: dir)
|
46
|
+
projects.each do |l|
|
47
|
+
project_arr << ProjectYAMLFile.new(File.join(dir, l)).load_file
|
48
|
+
end
|
49
|
+
|
50
|
+
@projects = project_arr.flatten!
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -16,11 +16,9 @@ module Plansheet
|
|
16
16
|
"project":
|
17
17
|
desc: Project name
|
18
18
|
type: str
|
19
|
-
required: yes
|
20
19
|
"namespace":
|
21
|
-
desc:
|
20
|
+
desc: Project name
|
22
21
|
type: str
|
23
|
-
required: yes
|
24
22
|
"priority":
|
25
23
|
desc: Project priority
|
26
24
|
type: str
|
@@ -114,17 +112,19 @@ module Plansheet
|
|
114
112
|
PROJECT_SCHEMA = YAML.safe_load(PROJECT_YAML_SCHEMA)
|
115
113
|
|
116
114
|
class ProjectYAMLFile
|
117
|
-
|
115
|
+
attr_accessor :projects
|
118
116
|
|
119
117
|
def initialize(path)
|
120
118
|
@path = path
|
121
119
|
# TODO: this won't GC, inline validation instead?
|
120
|
+
end
|
122
121
|
|
122
|
+
def load_file
|
123
123
|
# Handle pre-Ruby 3.1 psych versions (this is brittle)
|
124
124
|
@raw = if Psych::VERSION.split(".")[0].to_i >= 4
|
125
|
-
YAML.load_file(path, permitted_classes: [Date])
|
125
|
+
YAML.load_file(@path, permitted_classes: [Date])
|
126
126
|
else
|
127
|
-
YAML.load_file(path)
|
127
|
+
YAML.load_file(@path)
|
128
128
|
end
|
129
129
|
|
130
130
|
validate_schema
|
@@ -133,6 +133,7 @@ module Plansheet
|
|
133
133
|
proj["namespace"] = namespace
|
134
134
|
Project.new proj
|
135
135
|
end
|
136
|
+
@projects
|
136
137
|
end
|
137
138
|
|
138
139
|
def namespace
|
@@ -155,8 +156,12 @@ module Plansheet
|
|
155
156
|
@projects.sort!
|
156
157
|
end
|
157
158
|
|
159
|
+
def write
|
160
|
+
File.write @path, yaml_dump
|
161
|
+
end
|
162
|
+
|
158
163
|
def yaml_dump
|
159
|
-
YAML.dump(@projects.map(
|
164
|
+
YAML.dump(@projects.map { |x| x.to_h.except("namespace") })
|
160
165
|
end
|
161
166
|
end
|
162
167
|
end
|
data/lib/plansheet/project.rb
CHANGED
@@ -49,16 +49,18 @@ module Plansheet
|
|
49
49
|
].map { |x| "compare_#{x}".to_sym }.freeze
|
50
50
|
# NOTE: The order of these affects presentation!
|
51
51
|
# namespace is derived from file name
|
52
|
-
STRING_PROPERTIES = %w[
|
52
|
+
STRING_PROPERTIES = %w[priority status location notes time_estimate frequency lead_time].freeze
|
53
53
|
DATE_PROPERTIES = %w[due defer completed_on created_on starts_on last_done last_reviewed].freeze
|
54
54
|
ARRAY_PROPERTIES = %w[dependencies externals urls tasks done tags].freeze
|
55
55
|
|
56
56
|
ALL_PROPERTIES = STRING_PROPERTIES + DATE_PROPERTIES + ARRAY_PROPERTIES
|
57
57
|
|
58
58
|
attr_reader :name, *ALL_PROPERTIES
|
59
|
+
attr_accessor :namespace
|
59
60
|
|
60
61
|
def initialize(options)
|
61
62
|
@name = options["project"]
|
63
|
+
@namespace = options["namespace"]
|
62
64
|
|
63
65
|
ALL_PROPERTIES.each do |o|
|
64
66
|
instance_variable_set("@#{o}", options[o]) if options[o]
|
@@ -220,7 +222,7 @@ module Plansheet
|
|
220
222
|
end
|
221
223
|
|
222
224
|
def to_h
|
223
|
-
h = { "project" => @name }
|
225
|
+
h = { "project" => @name, "namespace" => @namespace }
|
224
226
|
ALL_PROPERTIES.each do |prop|
|
225
227
|
h[prop] = instance_variable_get("@#{prop}") if instance_variable_defined?("@#{prop}")
|
226
228
|
end
|
data/lib/plansheet/version.rb
CHANGED
data/lib/plansheet.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative "plansheet/version"
|
4
4
|
require_relative "plansheet/project"
|
5
|
+
require_relative "plansheet/pool"
|
5
6
|
require_relative "plansheet/sheet"
|
6
7
|
require "yaml"
|
7
8
|
require "kwalify"
|
@@ -9,28 +10,10 @@ require "kwalify"
|
|
9
10
|
module Plansheet
|
10
11
|
class Error < StandardError; end
|
11
12
|
|
13
|
+
# TODO: config schema validation
|
12
14
|
def self.load_config
|
13
15
|
YAML.load_file "#{Dir.home}/.plansheet.yml"
|
14
16
|
rescue StandardError
|
15
17
|
abort "unable to load plansheet config file"
|
16
18
|
end
|
17
|
-
|
18
|
-
def self.resort_projects_in_dir(dir)
|
19
|
-
project_files = Dir.glob("#{dir}/*yml")
|
20
|
-
project_files.each do |f|
|
21
|
-
pyf = ProjectYAMLFile.new(f)
|
22
|
-
pyf.sort!
|
23
|
-
File.write(f, pyf.yaml_dump)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.load_projects_dir(dir)
|
28
|
-
project_arr = []
|
29
|
-
projects = Dir.glob("*yml", base: dir)
|
30
|
-
projects.each do |l|
|
31
|
-
project_arr << ProjectYAMLFile.new(File.join(dir, l)).projects
|
32
|
-
end
|
33
|
-
|
34
|
-
project_arr.flatten!
|
35
|
-
end
|
36
19
|
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.
|
4
|
+
version: 0.15.0
|
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-
|
11
|
+
date: 2022-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dc-kwalify
|
@@ -43,6 +43,7 @@ files:
|
|
43
43
|
- examples/backpack.yml
|
44
44
|
- exe/plansheet
|
45
45
|
- lib/plansheet.rb
|
46
|
+
- lib/plansheet/pool.rb
|
46
47
|
- lib/plansheet/project.rb
|
47
48
|
- lib/plansheet/project/stringify.rb
|
48
49
|
- lib/plansheet/project/yaml.rb
|