DependencyManager   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 72
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
dl 0
loc 72
ccs 23
cts 23
cp 1
rs 10
c 0
b 0
f 0
wmc 7

5 Methods

Rating   Name   Duplication   Size   Complexity  
A dependencies_present? 0 3 1
A initialize() 0 4 1
A installation_required? 0 5 1
A request_dependency_installation() 0 6 1
A install() 0 10 3
1 1
require "forwardable"
2 1
require_relative "../output"
3 1
require_relative "exceptions"
4 1
require_relative "gem_installer"
5 1
require_relative "font_downloader"
6
7 1
module Resume
8 1
  module CLI
9
    # Class concerned with managing the dependencies that generation
10
    # of the resume requires, which can vary depending on the resume's locale.
11
    #
12
    # @author Paul Fioravanti
13 1
    class DependencyManager
14 1
      extend Forwardable
15
16
      # Initialises a new instance of a Dependency Manager.
17
      #
18
      # @param dependencies [Hash]
19
      #   A hash containing the gem and font dependencies for resume generation.
20
      # @return [DependencyManager]
21
      #   The dependency manager object.
22 1
      def initialize(dependencies)
23 7
        @gem_installer = GemInstaller.new(dependencies[:gems])
24 7
        @font_downloader = FontDownloader.new(dependencies[:fonts])
25
      end
26
27 1
      def_delegators :@gem_installer,
28
                     :gems,
29
                     :audit_gem_dependencies,
30
                     :output_gem_dependencies,
31
                     :gems_successfully_installed?
32
33 1
      def_delegators :@font_downloader,
34
                     :fonts,
35
                     :audit_font_dependencies,
36
                     :output_font_dependencies,
37
                     :fonts_successfully_downloaded?
38
39
      # Determines whether gem or font dependencies are required to
40
      # generate resume.
41
      #
42
      # @return [true] if installation of dependencies required.
43
      # @return [false] if installation of dependencies not required.
44 1
      def installation_required?
45 3
        audit_gem_dependencies
46 3
        audit_font_dependencies
47 3
        dependencies_present?
48
      end
49
50
      # Asks the user generating the resume for permission to install
51
      # the required dependencies.
52
      #
53
      # @return [nil]
54 1
      def request_dependency_installation
55 1
        Output.warning(:i_need_the_following_to_generate_a_pdf)
56 1
        output_gem_dependencies
57 1
        output_font_dependencies
58 1
        Output.question(:may_i_please_install_them)
59
      end
60
61
      # Attempts to install the dependencies needed to
62
      # generate the resume.
63
      #
64
      # @raise [DependencyInstallationError]
65
      #   if any dependencies are unable to be installed.
66
      # @return [nil]
67
      #   if all dependencies are able to be installed.
68 1
      def install
69
        # rubocop:disable Style/GuardClause
70
        # NOTE: I think a non-guard clause reads better here
71 3
        if gems_successfully_installed? && fonts_successfully_downloaded?
72 1
          Output.success(:dependencies_successfully_installed)
73
        else
74 2
          raise DependencyInstallationError
75
        end
76
        # rubocop:enable Style/GuardClause
77
      end
78
79 1
      private
80
81 1
      def dependencies_present?
82 3
        gems.any? || fonts.any?
83
      end
84
    end
85
  end
86
end
87