standup_md 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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