Application   A
last analyzed

Complexity

Total Complexity 12

Size/Duplication

Total Lines 92
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
dl 0
loc 92
ccs 45
cts 45
cp 1
rs 10
c 0
b 0
f 0
wmc 12

7 Methods

Rating   Name   Duplication   Size   Complexity  
A permission_granted? 0 4 1
A generate_resume() 0 6 1
A prepare_resume_data() 0 5 1
A open_resume() 0 7 2
A install_dependencies() 0 12 2
A start() 0 10 2
A initialize() 0 5 1
1 1
require "forwardable"
2 1
require_relative "../output"
3 1
require_relative "../pdf/document"
4 1
require_relative "settings"
5 1
require_relative "argument_parser"
6 1
require_relative "resume_data_fetcher"
7 1
require_relative "exceptions"
8 1
require_relative "dependency_manager"
9 1
require_relative "content_parser"
10 1
require_relative "file_system"
11
12 1
module Resume
13 1
  module CLI
14
    # The entry point for starting the CLI.
15
    #
16
    # @author Paul Fioravanti
17 1
    class Application
18 1
      extend Forwardable
19
20 1
      POSITIVE_INPUT = /\A(y|yes)\z/i.freeze
21 1
      private_constant :POSITIVE_INPUT
22
23
      # Configures and calls to start the CLI.
24
      #
25
      # @return [nil]
26 1
      def self.start
27 6
        Settings.configure
28 5
        catch(:halt) do
29 5
          ArgumentParser.parse
30 4
          resume = ResumeDataFetcher.fetch
31 4
          new(resume).start
32
        end
33
      rescue Error => error
34 2
        Output.messages(error.messages)
35
      end
36
37 1
      def self.permission_granted?
38
        # NOTE: Change back to `match?` when AppVeyor gets a Ruby 2.4 build.
39 4
        Kernel.gets.chomp.match(POSITIVE_INPUT)
40
      end
41 1
      private_class_method :permission_granted?
42
43 1
      private_class_method :new
44
45
      # Creates a new instance of the CLI Application
46
      #
47
      # @param resume [Hash] The hash containing resume data.
48
      # @return [Application]
49 1
      def initialize(resume)
50 4
        @resume = resume
51
        @dependency_manager =
52 4
          DependencyManager.new(resume[:dependencies])
53
      end
54
55 1
      def_delegators :@dependency_manager,
56
                     :installation_required?,
57
                     :request_dependency_installation,
58
                     :install
59
60
      # Starts the CLI.
61
      #
62
      # @raise [DependencyInstallationPermissionError]
63
      #   if permission is not granted to install dependencies.
64
      # @return [nil]
65 1
      def start
66 4
        install_dependencies if installation_required?
67 2
        generate_resume
68 2
        open_resume
69
      end
70
71 1
      private
72
73 1
      attr_accessor :resume, :title, :filename
74
75 1
      def install_dependencies
76 2
        request_dependency_installation
77
        # rubocop:disable Style/GuardClause
78
        # NOTE: I think a non-guard clause reads better here
79 2
        if self.class.__send__(:permission_granted?)
80 1
          Output.success(:thank_you_kindly)
81 1
          install
82
        else
83 1
          raise DependencyInstallationPermissionError
84
        end
85
        # rubocop:enable Style/GuardClause
86
      end
87
88 1
      def generate_resume
89 2
        prepare_resume_data
90 2
        Output.plain(:generating_pdf)
91 2
        PDF::Document.generate(resume, title, filename)
92 2
        Output.success(:resume_generated_successfully)
93
      end
94
95 1
      def prepare_resume_data
96 2
        self.resume = ContentParser.parse(resume)
97 2
        self.title = resume[:title]
98 2
        self.filename = "#{title}_#{I18n.locale}.pdf"
99
      end
100
101 1
      def open_resume
102 2
        Output.question(:would_you_like_me_to_open_the_resume)
103 2
        if self.class.__send__(:permission_granted?)
104 1
          FileSystem.open_document(filename)
105
        end
106 2
        Output.info(:thanks_for_looking_at_my_resume, filename: filename)
107
      end
108
    end
109
  end
110
end
111