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

pulibrary / tigerdata-app / 48b1bef5-fe39-4e76-a43a-b10fc80b92ab

22 Oct 2025 11:08AM UTC coverage: 91.051%. Remained the same
48b1bef5-fe39-4e76-a43a-b10fc80b92ab

push

circleci

web-flow
Bump vite from 5.4.20 to 5.4.21 in the npm_and_yarn group across 1 directory (#2062)

Bumps the npm_and_yarn group with 1 update in the / directory:
[vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).

Updates `vite` from 5.4.20 to 5.4.21
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite/releases">vite's
releases</a>.</em></p>
<blockquote>
<h2>v5.4.21</h2>
<p>Please refer to <a
href="https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md">CHANGELOG.md</a>
for details.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md">vite's
changelog</a>.</em></p>
<blockquote>
<h2><!-- raw HTML omitted -->5.4.21 (2025-10-20)<!-- raw HTML omitted
--></h2>
<ul>
<li>fix(dev): trim trailing slash before <code>server.fs.deny</code>
check (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20968">#20968</a>)
(<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20970">#20970</a>)
(<a
href="https://github.com/vitejs/vite/commit/<a class=hub.com/pulibrary/tigerdata-app/commit/cad1d31d0635dd8fd4ddfe6e5a92eb9ff13cd06c">cad1d31d0<a href="https://github.com/pulibrary/tigerdata-app/commit/c2277b4d23cf53321b272bce8dc929ddec37f4ef">&quot;&gt;cad1d31&lt;/a&gt;),
closes &lt;a
href=&quot;https://redirect.github.com/vitejs/vite/issues/20968&quot;&gt;#20968&lt;/a&gt;
&lt;a
href=&quot;https://redirect.github.com/vitejs/vite/issues/20970">#20970</a></li>
<li>chore: update CHANGELOG (<a
href="https://github.com/vitejs/vite/commit/<a class="double-link" href="https://github.com/pulibrary/tigerdata-app/commit/ca88ed7398288ce0c60176ac9a6392f10654c67c">ca88ed739</a><a href="https://github.com/pulibrary/tigerdata-app/commit/c2277b4d23cf53321b272bce8dc929ddec37f4ef">&quot;&gt;ca88ed7&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Commits&lt;/summary&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
href=&quot;https://github.com/vitejs/vite/commit/</a><a class="double-link" href="https://github.com/pulibrary/tigerdata-app/commit/adce3c22c64cc9d44cc8f45cc92b543e3e4bf385">adce3c22c">adce3c2
release: v5.4.21
  • cad1d31 fix(dev): trim trailing slash before server.fs.deny check (
  • 2737 of 3006 relevant lines covered (91.05%)

    381.59 hits per line

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

    100.0
    /app/models/request.rb
    1
    # frozen_string_literal: true
    
    2
    # rubocop:disable Metrics/ClassLength
    
    3
    class Request < ApplicationRecord
    
    5✔
    4
      DRAFT = "draft" # default state set by database
    
    5✔
    5
      SUBMITTED = "submitted" # Ready to be approved
    
    5✔
    6
    
    
    7
      def valid_to_submit?
    
    5✔
    8
        errors.clear
    
    65✔
    9
        # run all validations and then check for errors otherwise ruby stops at the first error
    
    10
        valid_title?
    
    65✔
    11
        valid_data_sponsor?
    
    65✔
    12
        valid_data_manager?
    
    65✔
    13
        valid_departments?
    
    65✔
    14
        valid_quota?
    
    65✔
    15
        valid_project_purpose?
    
    65✔
    16
        valid_description?
    
    65✔
    17
        # Is parent folder really required?  For Skeletor let's skip it.
    
    18
        # valid_parent_folder?
    
    19
        valid_project_folder?
    
    65✔
    20
        # For Skeletor we are setting the requestor to the data sponsor
    
    21
        # valid_requested_by?
    
    22
        errors.count == 0
    
    65✔
    23
      end
    
    24
    
    
    25
      def valid_title?
    
    5✔
    26
        check_errors? do
    
    74✔
    27
          field_present?(project_title, :project_title)
    
    74✔
    28
          valid_length(project_title, 200, :project_title)
    
    74✔
    29
          no_quotes(project_title, :project_title)
    
    74✔
    30
        end
    
    31
      end
    
    32
    
    
    33
      def valid_data_sponsor?
    
    5✔
    34
        check_errors? { validate_uid(data_sponsor, :data_sponsor) }
    
    136✔
    35
      end
    
    36
    
    
    37
      def valid_data_manager?
    
    5✔
    38
        check_errors? { validate_uid(data_manager, :data_manager) }
    
    136✔
    39
      end
    
    40
    
    
    41
      def valid_departments?
    
    5✔
    42
        check_errors? { field_present?(departments, :departments) }
    
    134✔
    43
      end
    
    44
    
    
    45
      def valid_project_purpose?
    
    5✔
    46
        check_errors? { project_purpose_present?(project_purpose, :project_purpose) }
    
    130✔
    47
      end
    
    48
    
    
    49
      def valid_description?
    
    5✔
    50
        check_errors? do
    
    70✔
    51
          field_present?(description, :description)
    
    70✔
    52
          valid_length(description, 1000, :description)
    
    70✔
    53
          no_quotes(description, :description)
    
    70✔
    54
        end
    
    55
      end
    
    56
    
    
    57
      def valid_parent_folder?
    
    5✔
    58
        check_errors? do
    
    2✔
    59
          field_present?(parent_folder, :parent_folder)
    
    2✔
    60
          no_quotes(project_title, :parent_folder)
    
    2✔
    61
        end
    
    62
      end
    
    63
    
    
    64
      def valid_project_folder?
    
    5✔
    65
        check_errors? do
    
    68✔
    66
          field_present?(project_folder, :project_folder)
    
    68✔
    67
          no_quotes(project_folder, :project_folder)
    
    68✔
    68
        end
    
    69
      end
    
    70
    
    
    71
      def valid_quota?
    
    5✔
    72
        if ((quota == "500 GB") || (quota == "2 TB") || (quota == "10 TB") || (quota == "25 TB")) ||
    
    73✔
    73
           (custom_quota? && (storage_size.present? && (storage_size > 0)) && ((storage_unit == "GB") || (storage_unit == "TB")))
    
    5✔
    74
          true
    
    70✔
    75
        else
    
    76
          errors.add(:quota, :invalid, message: "must be one of '500 GB', '2 TB', '10 TB', '25 TB', or 'custom'")
    
    3✔
    77
          false
    
    3✔
    78
        end
    
    79
      end
    
    80
    
    
    81
      def custom_quota?
    
    5✔
    82
        quota == "custom"
    
    325✔
    83
      end
    
    84
    
    
    85
      def valid_requested_by?
    
    5✔
    86
        check_errors? { field_present?(requested_by, :requested_by) }
    
    4✔
    87
      end
    
    88
    
    
    89
      def approve(approver)
    
    5✔
    90
        create_project_operation = ProjectCreate.new
    
    116✔
    91
        result = create_project_operation.call(request: self, approver: approver)
    
    116✔
    92
        if result.success?
    
    116✔
    93
          result.value!
    
    113✔
    94
        else
    
    95
          self.error_message = { message: result.failure }
    
    3✔
    96
          save!
    
    3✔
    97
          cleanup_incomplete_project
    
    3✔
    98
          raise ProjectCreate::ProjectCreateError, result.failure
    
    3✔
    99
        end
    
    100
      end
    
    101
    
    
    102
      def approved_quota_size
    
    5✔
    103
        if approved_quota.present?
    
    127✔
    104
          if approved_quota == "custom"
    
    106✔
    105
            approved_storage_size.to_f
    
    105✔
    106
          else
    
    107
            approved_quota.split.first.to_f
    
    1✔
    108
          end
    
    109
        else
    
    110
          requested_quota_size
    
    21✔
    111
        end
    
    112
      end
    
    113
    
    
    114
      def requested_quota_size
    
    5✔
    115
        if custom_quota?
    
    160✔
    116
          storage_size.to_f
    
    110✔
    117
        else
    
    118
          quota.split.first.to_f
    
    50✔
    119
        end
    
    120
      end
    
    121
    
    
    122
      def approved_quota_unit
    
    5✔
    123
        if approved_quota.present?
    
    130✔
    124
          if approved_quota == "custom"
    
    108✔
    125
            approved_storage_unit
    
    107✔
    126
          else
    
    127
            approved_quota.split.last
    
    1✔
    128
          end
    
    129
        else
    
    130
          requested_quota_unit
    
    22✔
    131
        end
    
    132
      end
    
    133
    
    
    134
      def requested_quota_unit
    
    5✔
    135
        if custom_quota?
    
    160✔
    136
          storage_unit
    
    110✔
    137
        else
    
    138
          quota.split.last
    
    50✔
    139
        end
    
    140
      end
    
    141
    
    
    142
      def submitted?
    
    5✔
    143
        state == Request::SUBMITTED
    
    88✔
    144
      end
    
    145
    
    
    146
      private
    
    5✔
    147
    
    
    148
        def check_errors?
    
    5✔
    149
          original_error_count = errors.count
    
    484✔
    150
          yield
    
    484✔
    151
          original_error_count == errors.count
    
    484✔
    152
        end
    
    153
    
    
    154
        def field_present?(value, name)
    
    5✔
    155
          if value.blank?
    
    283✔
    156
            errors.add(name, :invalid, message: "cannot be empty")
    
    86✔
    157
          end
    
    158
        end
    
    159
    
    
    160
        def validate_uid(uid, field)
    
    5✔
    161
          if uid.blank?
    
    136✔
    162
            errors.add(field, :blank, message: "cannot be empty")
    
    37✔
    163
          elsif User.where(uid: uid).count == 0
    
    99✔
    164
            errors.add(field, :invalid, message: "must be a valid user")
    
    2✔
    165
          end
    
    166
        end
    
    167
    
    
    168
        def project_purpose_present?(project_purpose, field)
    
    5✔
    169
          if project_purpose.blank?
    
    65✔
    170
            errors.add(field, :blank, message: "select a project purpose")
    
    25✔
    171
          end
    
    172
        end
    
    173
    
    
    174
        def valid_length(value, length, field)
    
    5✔
    175
          return if value.blank?
    
    144✔
    176
          if value.length > length
    
    104✔
    177
            errors.add(field, :invalid, message: "cannot exceed #{length} characters")
    
    8✔
    178
          end
    
    179
        end
    
    180
    
    
    181
        def no_quotes(value, field)
    
    5✔
    182
          return if value.blank?
    
    214✔
    183
          if value.include?('"')
    
    149✔
    184
            errors.add(field, :invalid, message: "cannot include quotes")
    
    5✔
    185
          end
    
    186
        end
    
    187
    
    
    188
        # If a request fails to be a approved we make sure there were not orphan
    
    189
        # project records left in our Rails database that do not have a matching
    
    190
        # project in Mediaflux (i.e. collection asset).
    
    191
        def cleanup_incomplete_project
    
    5✔
    192
          project = Project.find_by_id(project_id)
    
    3✔
    193
          if project && project.mediaflux_id.nil?
    
    3✔
    194
            Rails.logger.warn("Deleting project #{project.id} because the approval for request #{id} failed and it was not created in Mediaflux.")
    
    2✔
    195
            project.destroy!
    
    2✔
    196
          end
    
    197
        end
    
    198
    end
    
    199
    # 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