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
         |