Class: FileSystem

Inherits:
Object
  • Object
show all
Defined in:
lib/jirametrics/file_system.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeFileSystem

Returns a new instance of FileSystem.



8
9
10
11
12
13
14
# File 'lib/jirametrics/file_system.rb', line 8

def initialize
  # In almost all cases, this will be immediately replaced in the Exporter
  # but if we fail before we get that far, this will at least let a useful
  # error show up on the console.
  @logfile = $stdout
  @log_only = false
end

Instance Attribute Details

#log_onlyObject

Returns the value of attribute log_only.



6
7
8
# File 'lib/jirametrics/file_system.rb', line 6

def log_only
  @log_only
end

#logfileObject

Returns the value of attribute logfile.



6
7
8
# File 'lib/jirametrics/file_system.rb', line 6

def logfile
  @logfile
end

#logfile_nameObject

Returns the value of attribute logfile_name.



6
7
8
# File 'lib/jirametrics/file_system.rb', line 6

def logfile_name
  @logfile_name
end

Instance Method Details

#compress(node) ⇒ Object

In some Jira instances, a sizeable portion of the JSON is made up of empty fields. I’ve seen cases where this simple compression will drop the filesize by half.



102
103
104
105
106
107
108
109
110
# File 'lib/jirametrics/file_system.rb', line 102

def compress node
  if node.is_a? Hash
    node.reject! { |_key, value| value.nil? || (value.is_a?(Array) && value.empty?) }
    node.each_value { |value| compress value }
  elsif node.is_a? Array
    node.each { |a| compress a }
  end
  node
end

#deprecated(message:, date:, depth: 2) ⇒ Object



128
129
130
131
132
133
134
135
136
# File 'lib/jirametrics/file_system.rb', line 128

def deprecated message:, date:, depth: 2
  text = +''
  text << "Deprecated(#{date}): "
  text << message
  caller(1..depth).each do |line|
    text << "\n-> Called from #{line}"
  end
  log text, also_write_to_stderr: true
end

#dir_exist?(path) ⇒ Boolean

Returns:

  • (Boolean)


120
121
122
# File 'lib/jirametrics/file_system.rb', line 120

def dir_exist? path
  File.exist?(path) && File.directory?(path)
end

#end_progressObject



94
95
96
97
98
# File 'lib/jirametrics/file_system.rb', line 94

def end_progress
  return if log_only

  $stderr.puts '' # rubocop:disable Style/StderrPuts
end

#error(message, more: nil) ⇒ Object



54
55
56
# File 'lib/jirametrics/file_system.rb', line 54

def error message, more: nil
  log "Error: #{message}", more: more, also_write_to_stderr: true
end

#file_exist?(filename) ⇒ Boolean

Returns:

  • (Boolean)


116
117
118
# File 'lib/jirametrics/file_system.rb', line 116

def file_exist? filename
  File.exist?(filename) && File.file?(filename)
end

#foreach(root, &block) ⇒ Object



112
113
114
# File 'lib/jirametrics/file_system.rb', line 112

def foreach root, &block
  Dir.foreach root, &block
end

#load(filename, supress_deprecation: false) ⇒ Object

Effectively the same as File.read except it forces the encoding to UTF-8



17
18
19
20
21
22
23
# File 'lib/jirametrics/file_system.rb', line 17

def load filename, supress_deprecation: false
  if filename.end_with?('.json') && !supress_deprecation
    deprecated(message: 'call load_json instead', date: '2024-11-13')
  end

  File.read filename, encoding: 'UTF-8'
end

#load_json(filename, fail_on_error: true) ⇒ Object



25
26
27
28
29
# File 'lib/jirametrics/file_system.rb', line 25

def load_json filename, fail_on_error: true
  return nil if fail_on_error == false && File.exist?(filename) == false

  JSON.parse load(filename, supress_deprecation: true)
end

#log(message, more: nil, also_write_to_stderr: false) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/jirametrics/file_system.rb', line 58

def log message, more: nil, also_write_to_stderr: false
  message += " See #{logfile_name} for more details about this message." if more

  logfile.puts message
  logfile.puts more if more
  return if log_only || !also_write_to_stderr

  # Obscure edge-case where we're trying to log something before logging is even
  # set up. Quick escape here so that we don't dump the error twice.
  return if logfile == $stdout

  $stderr.puts message # rubocop:disable Style/StderrPuts
end

#log_start(message) ⇒ Object



72
73
74
75
76
77
78
# File 'lib/jirametrics/file_system.rb', line 72

def log_start message
  logfile.puts message
  return if log_only || logfile == $stdout

  $stderr.print message
  $stderr.flush
end

#mkdir(path) ⇒ Object



42
43
44
# File 'lib/jirametrics/file_system.rb', line 42

def mkdir path
  FileUtils.mkdir_p path
end

#progress_dotObject



87
88
89
90
91
92
# File 'lib/jirametrics/file_system.rb', line 87

def progress_dot
  return if log_only

  $stderr.print '.'
  $stderr.flush
end

#save_file(content:, filename:) ⇒ Object



35
36
37
38
39
40
# File 'lib/jirametrics/file_system.rb', line 35

def save_file content:, filename:
  file_path = File.dirname(filename)
  FileUtils.mkdir_p file_path unless File.exist?(file_path)

  File.write(filename, content)
end

#save_json(json:, filename:) ⇒ Object



31
32
33
# File 'lib/jirametrics/file_system.rb', line 31

def save_json json:, filename:
  save_file content: JSON.pretty_generate(compress json), filename: filename
end

#start_progressObject



80
81
82
83
84
85
# File 'lib/jirametrics/file_system.rb', line 80

def start_progress
  return if log_only

  $stderr.print '  '
  $stderr.flush
end


124
125
126
# File 'lib/jirametrics/file_system.rb', line 124

def unlink filename
  File.unlink filename
end

#utime(file:, time:) ⇒ Object



46
47
48
# File 'lib/jirametrics/file_system.rb', line 46

def utime file:, time:
  File.utime time, time, file
end

#warning(message, more: nil) ⇒ Object



50
51
52
# File 'lib/jirametrics/file_system.rb', line 50

def warning message, more: nil
  log "Warning: #{message}", more: more, also_write_to_stderr: true
end