dsu 2.3.1 → 2.3.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a8d5e213674fcc08f03c21defe8712674ebf58ce5d68910d36a8e149f287f8d3
4
- data.tar.gz: ebba09045768d12985eecba52f432edd9461d2814b2f437518f829e6aa3dc9cd
3
+ metadata.gz: '00852090ac540e878e139eb7abf19fbb28c62876c75ff5e4f94f7eeec2ab63df'
4
+ data.tar.gz: 911334c622bbfe95ed7a424089f02e641fa1908528201370013ad0ba97f51802
5
5
  SHA512:
6
- metadata.gz: b4d11fe31ae4bf5e783f3c3b5c064a052f537f23423fd7cb290a8d6d325820bf202ee33dd0b41ab8928651e3272522974efdae58a4ba474d5116cedd2a3fc4a7
7
- data.tar.gz: 174da97c30f0d3467e0c2e22f7d573de4131507f6a26a6be0591c1051457a0edb2bc81ed10b6d54016d019952cfcd705a3beba3029f8fcc259d66d5839b30c68
6
+ metadata.gz: 9337dd2eed163e9a19981b001eeb90b48576dc229d62c14ff0f5a5fffd08b41a666d2ab2c4395db035cc439e96ad5c069e66c92b60fb69cb92fe994285bcc1ad
7
+ data.tar.gz: 26cc17c475cca588a06f2065427e98dd981f830f936729554fd66fb57c57344741a0792e452fab564babd49f8b14c0e25af619b65d32ecb76165b5ce139c3332
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [2.3.2] 2023-12-30
2
+
3
+ Changes
4
+
5
+ - Display a "Nothing to export" message if no entries are found, rather than prompting the user "export 0 entry groups" when using the `dsu export` command.
6
+ - Add specs for Export::AllPresenter and Export::DatesPresenter
7
+
1
8
  ## [2.3.1] 2023-12-25
2
9
 
3
10
  Changes
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dsu (2.3.1)
4
+ dsu (2.3.2)
5
5
  activemodel (>= 7.0.8, < 8.0)
6
6
  activesupport (>= 7.0.8, < 8.0)
7
7
  colorize (>= 0.8.1, < 1.0)
@@ -114,7 +114,7 @@ GEM
114
114
  simplecov-html (0.12.3)
115
115
  simplecov_json_formatter (0.1.4)
116
116
  thor (1.3.0)
117
- thor_nested_subcommand (1.0.4)
117
+ thor_nested_subcommand (1.0.5)
118
118
  tzinfo (2.0.6)
119
119
  concurrent-ruby (~> 1.0)
120
120
  unicode-display_width (2.5.0)
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # `dsu`- Streamline Your Daily Stand-Up Meeting Participation!
2
2
 
3
3
  [![Ruby](https://github.com/gangelo/dsu/actions/workflows/ruby.yml/badge.svg)](https://github.com/gangelo/dsu/actions/workflows/ruby.yml)
4
- [![GitHub version](http://badge.fury.io/gh/gangelo%2Fdsu.svg?refresh=2)](https://badge.fury.io/gh/gangelo%2Fdsu)
5
- [![Gem Version](https://badge.fury.io/rb/dsu.svg?refresh=2)](https://badge.fury.io/rb/dsu)
4
+ [![GitHub version](http://badge.fury.io/gh/gangelo%2Fdsu.svg?refresh=3)](https://badge.fury.io/gh/gangelo%2Fdsu)
5
+ [![Gem Version](https://badge.fury.io/rb/dsu.svg?refresh=3)](https://badge.fury.io/rb/dsu)
6
6
  [![Documentation](http://img.shields.io/badge/docs-rdoc.info-blue.svg)](http://www.rubydoc.info/gems/dsu/)
7
7
  [![Report Issues](https://img.shields.io/badge/report-issues-red.svg)](https://github.com/gangelo/dsu/issues)
8
8
  [![License](http://img.shields.io/badge/license-MIT-yellowgreen.svg)](#license)
@@ -191,13 +191,19 @@ module Dsu
191
191
  end
192
192
 
193
193
  def write(file_data:, file_path:)
194
- delete(file_path: file_path) and return true if file_data[:entries].empty?
194
+ if file_data[:entries].empty?
195
+ superclass.delete(file_path: file_path)
196
+ return true
197
+ end
195
198
 
196
199
  super
197
200
  end
198
201
 
199
202
  def write!(file_data:, file_path:)
200
- delete!(file_path: file_path) and return if file_data[:entries].empty?
203
+ if file_data[:entries].empty?
204
+ superclass.delete!(file_path: file_path)
205
+ return
206
+ end
201
207
 
202
208
  super
203
209
  end
@@ -5,6 +5,7 @@ require_relative '../../services/entry_group/exporter_service'
5
5
  require_relative '../../support/ask'
6
6
  require_relative '../base_presenter_ex'
7
7
  require_relative 'messages'
8
+ require_relative 'nothing_to_export'
8
9
  require_relative 'service_callable'
9
10
 
10
11
  module Dsu
@@ -12,6 +13,7 @@ module Dsu
12
13
  module Export
13
14
  class AllPresenter < BasePresenterEx
14
15
  include Messages
16
+ include NothingToExport
15
17
  include ServiceCallable
16
18
  include Support::Ask
17
19
 
@@ -25,7 +27,7 @@ module Dsu
25
27
  end
26
28
 
27
29
  def display_export_prompt
28
- yes?(prompt_with_options(prompt: export_prompt, options: export_prompt_options))
30
+ yes?(prompt_with_options(prompt: export_prompt, options: export_prompt_options), options: options)
29
31
  end
30
32
 
31
33
  private
@@ -4,6 +4,7 @@ require_relative '../../models/entry_group'
4
4
  require_relative '../../support/ask'
5
5
  require_relative '../base_presenter_ex'
6
6
  require_relative 'messages'
7
+ require_relative 'nothing_to_export'
7
8
  require_relative 'service_callable'
8
9
 
9
10
  module Dsu
@@ -11,6 +12,7 @@ module Dsu
11
12
  module Export
12
13
  class DatesPresenter < BasePresenterEx
13
14
  include Messages
15
+ include NothingToExport
14
16
  include ServiceCallable
15
17
  include Support::Ask
16
18
 
@@ -31,7 +33,7 @@ module Dsu
31
33
  end
32
34
 
33
35
  def display_export_prompt
34
- yes?(prompt_with_options(prompt: export_prompt, options: export_prompt_options))
36
+ yes?(prompt_with_options(prompt: export_prompt, options: export_prompt_options), options: options)
35
37
  end
36
38
 
37
39
  private
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../models/entry_group'
4
- require_relative '../base_presenter_ex'
5
-
6
3
  module Dsu
7
4
  module Presenters
8
5
  module Export
@@ -11,6 +8,10 @@ module Dsu
11
8
  raise NotImplementedError
12
9
  end
13
10
 
11
+ def display_nothing_to_export_message
12
+ puts apply_theme(I18n.t('subcommands.export.messages.nothing_to_export'), theme_color: color_theme.info)
13
+ end
14
+
14
15
  private
15
16
 
16
17
  def display_cancelled_message
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dsu
4
+ module Presenters
5
+ module Export
6
+ module NothingToExport
7
+ def nothing_to_export?
8
+ entry_groups.empty?
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -11,51 +11,69 @@ module Dsu
11
11
  include Support::Fileable
12
12
 
13
13
  def initialize(entry_groups:, options: {})
14
- raise ArgumentError, 'Argument entry_groups is nil' if entry_groups.nil?
14
+ raise ArgumentError, 'Argument entry_groups is blank' if entry_groups.blank?
15
+ raise ArgumentError, 'Argument entry_groups are not all valid' unless entry_groups.all?(&:valid?)
16
+
17
+ validate_entry_group_entries_present! entry_groups
15
18
 
16
19
  @entry_groups = entry_groups
17
20
  @options = options
18
21
  end
19
22
 
20
23
  def call
21
- CSV.open(export_file_name, 'w') do |csv|
24
+ CSV.open(export_file_path, 'w') do |csv|
22
25
  csv << %i[version entry_group entry_no total_entries entry_group_entry]
23
26
 
24
27
  entry_groups.each do |entry_group|
25
- next unless entry_group.exist?
26
-
27
- entry_group.entries.each_with_index do |entry, index|
28
- csv << [
29
- entry_group.version,
30
- entry_group.time.to_date,
31
- index + 1,
32
- entry_group.entries.count,
33
- entry.description
34
- ]
35
- end
28
+ export_entry_group(entry_group: entry_group, csv: csv)
36
29
  end
37
30
  end
38
31
 
39
- export_file_name
32
+ export_file_path
40
33
  end
41
34
 
42
- def export_file_name
43
- @export_file_name ||= begin
44
- file_name = "dsu-#{export_timestamp}-#{times.min.to_date}-thru-#{times.max.to_date}.csv"
45
- File.join(temp_folder, file_name)
46
- end
35
+ def export_file_path
36
+ @export_file_path ||= File.join(temp_folder, export_file_name)
47
37
  end
48
38
 
49
39
  private
50
40
 
51
41
  attr_reader :entry_groups, :options
52
42
 
43
+ def export_entry_data(entry_group:, entry:, entry_index:)
44
+ [
45
+ entry_group.version,
46
+ entry_group.time.to_date,
47
+ entry_index + 1,
48
+ entry_group.entries.count,
49
+ entry.description
50
+ ]
51
+ end
52
+
53
+ def export_entry_group(entry_group:, csv:)
54
+ entry_group.entries.each_with_index do |entry, index|
55
+ csv << export_entry_data(entry_group: entry_group, entry: entry, entry_index: index)
56
+ end
57
+ end
58
+
59
+ def export_file_name
60
+ "dsu-#{timestamp}-#{times.min.to_date}-thru-#{times.max.to_date}.csv"
61
+ end
62
+
53
63
  def times
54
64
  @times ||= entry_groups.map(&:time)
55
65
  end
56
66
 
57
- def export_timestamp
58
- Time.now.in_time_zone.strftime('%Y%m%d%H%M%S')
67
+ def timestamp
68
+ @timestamp ||= Time.now.in_time_zone.strftime('%Y%m%d%H%M%S')
69
+ end
70
+
71
+ def validate_entry_group_entries_present!(entry_groups)
72
+ entry_groups.each do |entry_group|
73
+ next if entry_group.entries.present?
74
+
75
+ raise ArgumentError, "Argument entry_groups entry group for #{entry_group.time_yyyy_mm_dd} has no entries"
76
+ end
59
77
  end
60
78
  end
61
79
  end
@@ -13,7 +13,10 @@ module Dsu
13
13
  def yes?(prompt, options: {})
14
14
  auto_prompt = auto_prompt(prompt, options)
15
15
 
16
- return auto_prompt unless auto_prompt.nil?
16
+ unless auto_prompt.nil?
17
+ puts prompt
18
+ return auto_prompt
19
+ end
17
20
 
18
21
  Thor::Base.shell.new.yes?(prompt)
19
22
  end
@@ -21,9 +24,10 @@ module Dsu
21
24
  private
22
25
 
23
26
  def auto_prompt(prompt, options)
27
+ options = options.with_indifferent_access
24
28
  prompt = Utils.strip_escapes(prompt)
25
29
  @auto_prompt ||= begin
26
- value = options.dig('prompts', prompt) || options.dig('prompts', 'any')
30
+ value = options.dig(:prompts, prompt) || options.dig(:prompts, :any)
27
31
  value = (value == 'true' unless value.nil?)
28
32
  value
29
33
  end
@@ -6,6 +6,7 @@ require_relative '../support/field_errors'
6
6
  # https://guides.rubyonrails.org/active_record_validations.html#validates-with
7
7
  module Dsu
8
8
  module Validators
9
+ # TODO: I18n.
9
10
  class EntriesValidator < ActiveModel::Validator
10
11
  include Support::FieldErrors
11
12
 
data/lib/dsu/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Dsu
4
4
  VERSION_REGEX = /\A\d+\.\d+\.\d+(\.(alpha|rc)\.\d+)?\z/
5
- VERSION = '2.3.1'
5
+ VERSION = '2.3.2'
6
6
  end
@@ -14,6 +14,8 @@ module Dsu
14
14
  end
15
15
 
16
16
  def render
17
+ return presenter.display_nothing_to_export_message if presenter.nothing_to_export?
18
+
17
19
  response = presenter.display_export_prompt
18
20
  presenter.render response: response
19
21
  end
@@ -280,6 +280,7 @@ en:
280
280
  messages:
281
281
  exported: Export successful.
282
282
  exported_to: Entry groups exported to %{file_path}.
283
+ nothing_to_export: No entry groups to export.
283
284
  cancelled: Cancelled.
284
285
  prompts:
285
286
  export_all_confirm: Export all the entries (%{count} entry groups)?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dsu
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.1
4
+ version: 2.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gene M. Angelo, Jr.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-12-26 00:00:00.000000000 Z
11
+ date: 2023-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -188,6 +188,7 @@ files:
188
188
  - lib/dsu/presenters/export/all_presenter.rb
189
189
  - lib/dsu/presenters/export/dates_presenter.rb
190
190
  - lib/dsu/presenters/export/messages.rb
191
+ - lib/dsu/presenters/export/nothing_to_export.rb
191
192
  - lib/dsu/presenters/export/service_callable.rb
192
193
  - lib/dsu/services/color_theme/hydrator_service.rb
193
194
  - lib/dsu/services/configuration/hydrator_service.rb