standup_md 0.2.1 → 0.3.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.
@@ -0,0 +1,45 @@
1
+ require_relative 'config/cli'
2
+ require_relative 'config/file'
3
+ require_relative 'config/entry'
4
+ require_relative 'config/entry_list'
5
+
6
+ module StandupMD
7
+
8
+ ##
9
+ # This class provides a connector from StandupMD to the configuration classes.
10
+ class Config
11
+
12
+ ##
13
+ # Reader for Cli config.
14
+ #
15
+ # @return [StandupMD::Config::Cli]
16
+ attr_reader :cli
17
+
18
+ ##
19
+ # Reader for File config.
20
+ #
21
+ # @return [StandupMD::Config::File]
22
+ attr_reader :file
23
+
24
+ ##
25
+ # Reader for Entry config.
26
+ #
27
+ # @return [StandupMD::Config::Entry]
28
+ attr_reader :entry
29
+
30
+ ##
31
+ # Reader for EntryList config.
32
+ #
33
+ # @return [StandupMD::Config::EntryList]
34
+ attr_reader :entry_list
35
+
36
+ ##
37
+ # Builds the links to the configuration classes.
38
+ def initialize
39
+ @cli = StandupMD::Config::Cli.new
40
+ @file = StandupMD::Config::File.new
41
+ @entry = StandupMD::Config::Entry.new
42
+ @entry_list = StandupMD::Config::EntryList.new
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+ require 'date'
3
+
4
+ module StandupMD
5
+ class Config
6
+
7
+ ##
8
+ # The configuration class for StandupMD::Cli
9
+ class Cli
10
+ ##
11
+ # The editor to use when opening standup files. If one is not set, the
12
+ # first of $VISUAL, $EDITOR, or vim will be used, in that order.
13
+ #
14
+ # @param [String] editor
15
+ #
16
+ # @return [String]
17
+ attr_accessor :editor
18
+
19
+ ##
20
+ # Should the cli print verbose output?
21
+ #
22
+ # @param [Boolean] verbose
23
+ #
24
+ # @return [Boolean]
25
+ attr_accessor :verbose
26
+
27
+ ##
28
+ # Should the cli edit?
29
+ #
30
+ # @param [Boolean] edit
31
+ #
32
+ # @return [Boolean]
33
+ attr_accessor :edit
34
+
35
+ ##
36
+ # Should the cli write the file?
37
+ #
38
+ # @param [Boolean] write
39
+ #
40
+ # @return [Boolean]
41
+ attr_accessor :write
42
+
43
+ ##
44
+ # Should the cli print the entry?
45
+ #
46
+ # @param [Boolean] print
47
+ #
48
+ # @return [Boolean]
49
+ attr_accessor :print
50
+
51
+ ##
52
+ # The date to use to find the file.
53
+ #
54
+ # @param [Date] date
55
+ #
56
+ # @return [Date]
57
+ attr_accessor :date
58
+
59
+ ##
60
+ # The preference file for Cli.
61
+ #
62
+ # @param [String] preference
63
+ #
64
+ # @return [String]
65
+ attr_accessor :preference_file
66
+
67
+ ##
68
+ # When writing a new entry, should 'previous' be pulled from the last
69
+ # entry?
70
+ #
71
+ # @param [Boolean] auto_fill_previous
72
+ #
73
+ # @return [Boolean]
74
+ attr_accessor :auto_fill_previous
75
+
76
+ ##
77
+ # Initializes the config with default values.
78
+ def initialize
79
+ reset_values
80
+ end
81
+
82
+ ##
83
+ # Sets all config values back to their defaults.
84
+ #
85
+ # @return [Boolean] true if successful
86
+ def reset_values
87
+ @date = Date.today
88
+ @editor = set_editor
89
+ @verbose = false
90
+ @edit = true
91
+ @write = true
92
+ @print = false
93
+ @auto_fill_previous = true
94
+ @preference_file = ::File.expand_path(::File.join(ENV['HOME'], '.standuprc'))
95
+ end
96
+
97
+ private
98
+
99
+ def set_editor # :nodoc:
100
+ return ENV['VISUAL'] if ENV['VISUAL']
101
+ return ENV['EDITOR'] if ENV['EDITOR']
102
+ 'vim'
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StandupMD
4
+ class Config
5
+
6
+ ##
7
+ # The configuration class for StandupMD::Entry
8
+ class Entry
9
+
10
+ ##
11
+ # Tasks for "Current" section.
12
+ #
13
+ # @param [Array] current
14
+ #
15
+ # @return [Array]
16
+ attr_accessor :current
17
+
18
+ ##
19
+ # Tasks for "Previous" section.
20
+ #
21
+ # @param [Array] previous
22
+ #
23
+ # @return [Array]
24
+ attr_accessor :previous
25
+
26
+ ##
27
+ # Impediments for this entry.
28
+ #
29
+ # @param [Array] impediments
30
+ #
31
+ # @return [Array]
32
+ attr_accessor :impediments
33
+
34
+ ##
35
+ # Notes for this entry.
36
+ #
37
+ # @param [Array] notes
38
+ #
39
+ # @return [Array]
40
+ attr_accessor :notes
41
+
42
+ ##
43
+ # Initializes the config with default values.
44
+ def initialize
45
+ reset_values
46
+ end
47
+
48
+ ##
49
+ # Sets all config values back to their defaults.
50
+ #
51
+ # @return [Boolean] true if successful
52
+ def reset_values
53
+ @current = ["<!-- ADD TODAY'S WORK HERE -->"]
54
+ @previous = []
55
+ @impediments = ['None']
56
+ @notes = []
57
+ true
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StandupMD
4
+ class Config
5
+
6
+ ##
7
+ # The configuration class for StandupMD::EntryList
8
+ class EntryList
9
+
10
+ ##
11
+ # Initializes the config with default values.
12
+ def initalize
13
+ reset_values
14
+ end
15
+
16
+ ##
17
+ # Sets all config values back to their defaults.
18
+ #
19
+ # @return [Boolean] true if successful
20
+ def reset_values
21
+ # TODO add order ascending or decending.
22
+ true
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,199 @@
1
+ module StandupMD
2
+ class Config
3
+
4
+ ##
5
+ # The configuration class for StandupMD::File
6
+ class File
7
+ ##
8
+ # Number of octothorps that should preface entry headers.
9
+ #
10
+ # @return [Integer] between 1 and 5
11
+ #
12
+ # @default 1
13
+ attr_reader :header_depth
14
+
15
+ ##
16
+ # Number of octothorps that should preface sub-headers.
17
+ #
18
+ # @return [Integer] between 2 and 6
19
+ #
20
+ # @default 2
21
+ attr_reader :sub_header_depth
22
+
23
+ ##
24
+ # The directory in which the files are located.
25
+ #
26
+ # @return [String]
27
+ #
28
+ # @default "~/.cache/standup_md"
29
+ attr_reader :directory
30
+
31
+ ##
32
+ # Character used as bullets for list entries.
33
+ #
34
+ # @return [String] either - (dash) or * (asterisk)
35
+ #
36
+ # @default "-" (dash)
37
+ attr_reader :bullet_character
38
+
39
+ ##
40
+ # String to be used as "Current" header.
41
+ #
42
+ # @param [String] header
43
+ #
44
+ # @return [String]
45
+ #
46
+ # @default "Current"
47
+ attr_accessor :current_header
48
+
49
+ ##
50
+ # String to be used as "Previous" header.
51
+ #
52
+ # @param [String] header
53
+ #
54
+ # @return [String]
55
+ #
56
+ # @default "Previous"
57
+ attr_accessor :previous_header
58
+
59
+ ##
60
+ # String to be used as "Impediments" header.
61
+ #
62
+ # @param [String] header
63
+ #
64
+ # @return [String]
65
+ #
66
+ # @default "Impediments"
67
+ attr_accessor :impediments_header
68
+
69
+ ##
70
+ # String to be used as "Notes" header.
71
+ #
72
+ # @param [String] header
73
+ #
74
+ # @return [String]
75
+ #
76
+ # @default "Notes"
77
+ attr_accessor :notes_header
78
+
79
+ ##
80
+ # Preferred order for sub-headers.
81
+ #
82
+ # @param [Array] sub_header_order
83
+ #
84
+ # @return [Array]
85
+ #
86
+ # @default %w[previous current impediment notes]
87
+ attr_accessor :sub_header_order
88
+
89
+ ##
90
+ # Format to be used for standup file names. Should be parse-able by
91
+ # strftime, and should be a monthly date.
92
+ #
93
+ # @param [String] name_format
94
+ #
95
+ # @return [String]
96
+ #
97
+ # @default "%Y_%m.md"
98
+ attr_accessor :name_format
99
+
100
+ ##
101
+ # The date format for entry headers. Will be parsed by +strftime+.
102
+ #
103
+ # @param [String] format
104
+ #
105
+ # @return [String]
106
+ attr_accessor :header_date_format
107
+
108
+ ##
109
+ # Should the file be created if it doesn't exist?
110
+ #
111
+ # @param [Boolean] create
112
+ #
113
+ # @return [boolean]
114
+ attr_accessor :create
115
+
116
+ ##
117
+ # Initializes the config with default values.
118
+ def initialize
119
+ reset_values
120
+ end
121
+
122
+ ##
123
+ # Sets all config values back to their defaults.
124
+ #
125
+ # @return [Boolean] true if successful
126
+ def reset_values
127
+ @header_date_format = '%Y-%m-%d'
128
+ @header_depth = 1
129
+ @sub_header_depth = 2
130
+ @current_header = 'Current'
131
+ @previous_header = 'Previous'
132
+ @impediments_header = 'Impediments'
133
+ @notes_header = 'Notes'
134
+ @sub_header_order = %w[previous current impediments notes]
135
+ @directory = ::File.join(ENV['HOME'], '.cache', 'standup_md')
136
+ @bullet_character = '-'
137
+ @name_format = '%Y_%m.md'
138
+ @create = true
139
+ true
140
+ end
141
+
142
+ ##
143
+ # Number of octothorps (#) to use before the main header.
144
+ #
145
+ # @param [Integer] depth
146
+ #
147
+ # @return [Integer]
148
+ def header_depth=(depth)
149
+ if !depth.between?(1, 5)
150
+ raise 'Header depth out of bounds (1..5)'
151
+ elsif depth >= sub_header_depth
152
+ @sub_header_depth = depth + 1
153
+ end
154
+ @header_depth = depth
155
+ end
156
+
157
+ ##
158
+ # Number of octothorps (#) to use before sub headers (Current, Previous,
159
+ # etc).
160
+ #
161
+ # @param [Integer] depth
162
+ #
163
+ # @return [Integer]
164
+ def sub_header_depth=(depth)
165
+ if !depth.between?(2, 6)
166
+ raise 'Sub-header depth out of bounds (2..6)'
167
+ elsif depth <= header_depth
168
+ @header_depth = depth - 1
169
+ end
170
+ @sub_header_depth = depth
171
+ end
172
+
173
+ ##
174
+ # Setter for bullet_character. Must be * (asterisk) or - (dash).
175
+ #
176
+ # @param [String] character
177
+ #
178
+ # @return [String]
179
+ def bullet_character=(char)
180
+ raise 'Must be "-" or "*"' unless %w[- *].include?(char)
181
+ @bullet_character = char
182
+ end
183
+
184
+ ##
185
+ # Setter for directory. Must be expanded in case the user uses `~` for home.
186
+ # If the directory doesn't exist, it will be created. To reset instance
187
+ # variables after changing the directory, you'll need to call load.
188
+ #
189
+ # @param [String] directory
190
+ #
191
+ # @return [String]
192
+ def directory=(directory)
193
+ directory = ::File.expand_path(directory)
194
+ FileUtils.mkdir_p(directory) unless ::File.directory?(directory)
195
+ @directory = directory
196
+ end
197
+ end
198
+ end
199
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+ require 'json'
3
+
4
+ module StandupMD
5
+
6
+ ##
7
+ # Class for handling single entries. Includes the comparable module, and
8
+ # compares by date.
9
+ class Entry
10
+ include Comparable
11
+
12
+ ##
13
+ # Access to the class's configuration.
14
+ #
15
+ # @return [StandupMD::Config::Entry]
16
+ def self.config
17
+ @config ||= StandupMD.config.entry
18
+ end
19
+
20
+ ##
21
+ # The date of the entry.
22
+ #
23
+ # @param [Date] date
24
+ #
25
+ # @return [Date]
26
+ attr_accessor :date
27
+
28
+ ##
29
+ # The tasks for today.
30
+ #
31
+ # @return [Array]
32
+ attr_accessor :current
33
+
34
+ ##
35
+ # The tasks from the previous day.
36
+ #
37
+ # @return [Array]
38
+ attr_accessor :previous
39
+
40
+ ##
41
+ # Iimpediments for this entry.
42
+ #
43
+ # @return [Array]
44
+ attr_accessor :impediments
45
+
46
+ ##
47
+ # Nnotes to add to this entry.
48
+ #
49
+ # @return [Array]
50
+ attr_accessor :notes
51
+
52
+ ##
53
+ # Creates a generic entry. Default values can be set via configuration.
54
+ # Yields the entry if a block is passed so you can change values.
55
+ #
56
+ # @return [StandupMD::Entry]
57
+ def self.create
58
+ entry = new(
59
+ Date.today,
60
+ config.current,
61
+ config.previous,
62
+ config.impediments,
63
+ config.notes
64
+ )
65
+ yield config if block_given?
66
+ entry
67
+ end
68
+
69
+ ##
70
+ # Constructs instance of +StandupMD::Entry+.
71
+ #
72
+ # @param [Date] date
73
+ #
74
+ # @param [Array] current
75
+ #
76
+ # @param [Array] previous
77
+ #
78
+ # @param [Array] impediments
79
+ #
80
+ # @param [Array] notes
81
+ def initialize(date, current, previous, impediments, notes = [])
82
+ raise unless date.is_a?(Date)
83
+ @config = self.class.config
84
+
85
+ @date = date
86
+ @current = current
87
+ @previous = previous
88
+ @impediments = impediments
89
+ @notes = notes
90
+ end
91
+
92
+ ##
93
+ # Sorting method for Comparable. Entries are compared by date.
94
+ def <=>(other)
95
+ date <=> other.date
96
+ end
97
+
98
+ ##
99
+ # Entry as a hash .
100
+ #
101
+ # @return [Hash]
102
+ def to_h
103
+ {
104
+ date => {
105
+ 'current' => current,
106
+ 'previous' => previous,
107
+ 'impediments' => impediments,
108
+ 'notes' => notes
109
+ }
110
+ }
111
+ end
112
+
113
+ ##
114
+ # Entry as a json object.
115
+ #
116
+ # @return [String]
117
+ def to_json
118
+ to_h.to_json
119
+ end
120
+ end
121
+ end