• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pulibrary / tigerdata-app / bb6442c4-eb43-430c-9683-6ffb5848882a

21 Oct 2025 08:43PM UTC coverage: 87.325% (+0.4%) from 86.877%
bb6442c4-eb43-430c-9683-6ffb5848882a

Pull #2066

circleci

bess
Stop mediaflux when we stop everything else
Pull Request #2066: Stop mediaflux when we stop everything else

2625 of 3006 relevant lines covered (87.33%)

307.22 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.22
/app/presenters/project_xml_presenter.rb
1
# frozen_string_literal: true
2

3
# rubocop:disable Metrics/ClassLength
4
class ProjectXmlPresenter
3✔
5
  attr_reader :project, :project_metadata
3✔
6

7
  # Delegate methods to the project and project_metadata objects
8
  delegate(
3✔
9
    "id",
10
    "in_mediaflux?",
11
    "mediaflux_id",
12
    "title",
13
    to: :project
14
  )
15

16
  delegate(
3✔
17
    "approval_note",
18
    "description",
19
    "data_manager",
20
    "data_sponsor",
21
    "data_user_read_only",
22
    "data_user_read_write",
23
    "departments",
24
    "project_id",
25
    "project_purpose",
26
    "storage_capacity",
27
    "storage_performance_expectations",
28
    "created_by",
29
    "created_on",
30
    "updated_by",
31
    "updated_on",
32
    "schema_version",
33
    to: :project_metadata
34
  )
35

36
  # @param project [Project] The project for the presenter
37
  def initialize(project)
3✔
38
    @project = project
54✔
39
    @project_metadata = @project.metadata_model
54✔
40
  end
41

42
  # @return [Nokogiri::XML::Document] The XML document
43
  delegate :document, to: :build
3✔
44

45
  # @return [Boolean] Whether the request for a Globus mount is approved
46
  def globus_enable_approved?
3✔
47
    project_metadata.globus_request == "Yes"
130✔
48
  end
49

50
  # @return [String] Whether the request for a Globus mount is approved
51
  def globus_enable_approved
3✔
52
    if globus_enable_approved?
127✔
53
      "true"
1✔
54
    else
55
      "false"
126✔
56
    end
57
  end
58

59
  # @return [Boolean] Whether there is a request for a Globus mount
60
  def globus_enable_requested?
3✔
61
    project_metadata.globus_request == "Yes"
46✔
62
  end
63

64
  # @return [String] Whether the request for a Globus mount is requested
65
  def globus_enable_requested
3✔
66
    if globus_enable_requested?
44✔
67
      "true"
1✔
68
    else
69
      "false"
43✔
70
    end
71
  end
72

73
  # @return [Boolean] Whether the request for the SMB mount is approved
74
  def smb_enable_approved?
3✔
75
    project_metadata.smb_request == "Yes"
130✔
76
  end
77

78
  # @return [String] Whether the request for the SMB mount is approved
79
  def smb_enable_approved
3✔
80
    if smb_enable_approved?
84✔
81
      "true"
1✔
82
    else
83
      "false"
83✔
84
    end
85
  end
86

87
  # @return [Boolean] Whether there is a request for SMB mount
88
  def smb_enable_requested?
3✔
89
    project_metadata.smb_request == "Yes"
42✔
90
  end
91

92
  # @return [String] Whether the request for the SMB mount is requested
93
  def smb_enable_requested
3✔
94
    if smb_enable_requested?
41✔
95
      "true"
×
96
    else
97
      "false"
41✔
98
    end
99
  end
100

101
  # @return [String] The project status (mapped to values specified by the TigerData XML schema)
102
  # NOTE: Valid values are one of: 'AdminReview', 'Approved', 'Active', 'Retired', 'Published'
103
  def status
3✔
104
    project_status = project.status
41✔
105
    return if project_status.nil?
41✔
106

107
    project_status.capitalize
41✔
108
  end
109

110
  # @return [ProvenanceEvent] The first project submission event
111
  def submission
3✔
112
    @submission ||= project.provenance_events.find_by(event_type: ProvenanceEvent::SUBMISSION_EVENT_TYPE)
199✔
113
  end
114

115
  # @return [Array<ProvenanceEvent>] The project submission events
116
  def submissions
3✔
117
    [submission]
41✔
118
  end
119

120
  # @return [String] The user ID of the user who requested the project
121
  def requested_by
3✔
122
    return if submission.nil?
42✔
123

124
    submission.event_person
37✔
125
  end
126

127
  # @return [String] The date and time of the request
128
  def request_date_time
3✔
129
    return if submission.nil?
42✔
130

131
    value = submission.created_at
37✔
132
    value.strftime("%Y-%m-%dT%H:%M:%S%:z")
37✔
133
  end
134

135
  # @return [String] The user ID of the user who approved the project
136
  def approved_by
3✔
137
    return if approval_note.nil?
42✔
138

139
    approval_note[:note_by]
3✔
140
  end
141

142
  # @return [String] The date and time of the approval
143
  def approval_date_time
3✔
144
    return nil if approval_note.nil?
42✔
145

146
    approval_note[:note_date_time]
3✔
147
  end
148

149
  # @return [String] Whether or not the project data use agreement
150
  def data_use_agreement?
3✔
151
    project_metadata.data_use_agreement.present?
42✔
152
  end
153

154
  # @return [String] The project resource type
155
  def project_resource_type
3✔
156
    project_metadata.resource_type
42✔
157
  end
158

159
  # @return [Boolean] Whether the project is provisional
160
  def provisional_project?
3✔
161
    project_metadata.provisional
42✔
162
  end
163

164
  # @return [String] Whether or not the project is associated with HPC
165
  delegate :hpc, to: :project_metadata
3✔
166

167
  # @return [String] The project visibility
168
  delegate :project_visibility, to: :project_metadata
3✔
169

170
  # @return [Boolean] Whether the project directory request is approved
171
  def project_directory_approved?
3✔
172
    expectations = storage_performance_expectations
41✔
173
    expectations[:approved] || false
41✔
174
  end
175

176
  # @return [Boolean] Whether the project storage capacity request is approved
177
  def storage_capacity_approved?
3✔
178
    storage_capacity_size = storage_capacity["size"] || {}
41✔
179
    return false unless storage_capacity_size.key?(:approved)
41✔
180

181
    approved_size = storage_capacity_size[:approved] || 0
5✔
182
    approved_size > 0
5✔
183
  end
184

185
  # @return [Boolean] Whether the project storage request is approved
186
  def storage_performance_requested?
3✔
187
    requested = storage_performance_expectations[:requested]
41✔
188
    requested.present?
41✔
189
  end
190

191
  # @return [Array<String>] The project directory paths
192
  def project_directory
3✔
193
    [project.project_directory]
126✔
194
  end
195

196
  # @param index [Integer] The index of the project directory
197
  # @return [String] The project directory path
198
  def project_directory_path(index)
3✔
199
    entry = project_directory[index]
41✔
200
    entry
41✔
201
  end
202

203
  # @param index [Integer] The index of the project directory
204
  # @return [String] The protocol for the project directory
205
  def project_directory_protocol(index)
3✔
206
    entry = project_directory[index]
42✔
207
    segments = entry.split("://")
42✔
208

209
    if segments.length > 1
42✔
210
      value = segments[0]
×
211
      value.upcase
×
212
    else
213
      ProjectMetadata.default_directory_protocol
42✔
214
    end
215
  end
216

217
  # @param index [Integer] The index of the department code to retrieve
218
  # @return [String] The department code for departments associated with the project
219
  def department(index)
3✔
220
    value = departments[index]
44✔
221
    if value.length < 6
44✔
222
      value = value.rjust(6, "0")
42✔
223
    end
224
    value
44✔
225
  end
226

227
  # @return [String] The department code for the project
228
  def department_code(index)
3✔
229
    departments[index]
44✔
230
  end
231

232
  # @return [String] The requested project storage capacity
233
  def requested_storage
3✔
234
    storage_performance_expectations[:requested] || nil
42✔
235
  end
236

237
  private
3✔
238

239
    def xml_builder_config
3✔
240
      Rails.configuration.xml_builder
82✔
241
    end
242

243
    def presenter_builder_config
3✔
244
      xml_builder_config[:project] || {}
82✔
245
    end
246

247
    def find_builder_args(key)
3✔
248
      raise "No builder config for #{key}" unless presenter_builder_config.key?(key)
41✔
249

250
      values = presenter_builder_config[key]
41✔
251
      values[:presenter] = self
41✔
252
      values
41✔
253
    end
254

255
    def builder
3✔
256
      @builder ||= begin
41✔
257
                     builder_args = find_builder_args(:resource)
41✔
258
                     XmlTreeBuilder.new(**builder_args)
41✔
259
                   end
260
    end
261

262
    delegate :build, to: :builder
3✔
263
end
264
# rubocop:enable Metrics/ClassLength
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc