Class: PlanMyStuff::IssueMetadata

Inherits:
BaseMetadata show all
Defined in:
lib/plan_my_stuff/issue_metadata.rb

Constant Summary collapse

PRIORITY_LIST_METADATA_DEPRECATION =
'PlanMyStuff: IssueMetadata#priority_list / #priority_list_priority are deprecated. priority_list moved to ' \
"GitHub Issue Fields ('Priority List' single_select, 'Priority List Priority' number) in 0.20.0. Reads " \
'now come from issue_fields; legacy writes forward to set_issue_fields! on save. The metadata accessors ' \
'will be removed in 1.0.0.'

Constants inherited from BaseMetadata

BaseMetadata::SCHEMA_VERSION

Instance Attribute Summary collapse

Attributes inherited from BaseMetadata

#app_name, #created_by, #custom_fields, #gem_version, #rails_env, #schema_version, #visibility

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from BaseMetadata

#internal?, #public?, #to_json, #validate_custom_fields!

Constructor Details

#initializeIssueMetadata

Returns a new instance of IssueMetadata.



176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/plan_my_stuff/issue_metadata.rb', line 176

def initialize
  super
  @visibility_allowlist = []
  @auto_complete = true
  @links = []
  @approvals = []
  @waiting_on_user_at = nil
  @waiting_on_approval_at = nil
  @next_reminder_at = nil
  @reminder_days = nil
  @closed_by_inactivity = false
  @archived_at = nil
end

Instance Attribute Details

#approvalsArray<PlanMyStuff::Approval>

Returns manager approvals required on this issue. See Issue.request_approvals! and Issue#fully_approved?.

Returns:

  • (Array<PlanMyStuff::Approval>)

    manager approvals required on this issue. See Issue.request_approvals! and Issue#fully_approved?.



27
28
29
# File 'lib/plan_my_stuff/issue_metadata.rb', line 27

def approvals
  @approvals
end

#archived_atTime?

Returns when the archive sweep tagged this issue as archived.

Returns:

  • (Time, nil)

    when the archive sweep tagged this issue as archived



40
41
42
# File 'lib/plan_my_stuff/issue_metadata.rb', line 40

def archived_at
  @archived_at
end

#auto_completeBoolean

Returns whether to auto-complete on deployment (default: true).

Returns:

  • (Boolean)

    whether to auto-complete on deployment (default: true)



20
21
22
# File 'lib/plan_my_stuff/issue_metadata.rb', line 20

def auto_complete
  @auto_complete
end

#closed_by_inactivityBoolean

Returns whether this issue was auto-closed by the inactivity sweep.

Returns:

  • (Boolean)

    whether this issue was auto-closed by the inactivity sweep



38
39
40
# File 'lib/plan_my_stuff/issue_metadata.rb', line 38

def closed_by_inactivity
  @closed_by_inactivity
end

#commit_shaString?

Returns merged PR commit SHA for release tracking.

Returns:

  • (String, nil)

    merged PR commit SHA for release tracking



18
19
20
# File 'lib/plan_my_stuff/issue_metadata.rb', line 18

def commit_sha
  @commit_sha
end

#issues_urlString?

Returns user-facing URL in the consuming app.

Returns:

  • (String, nil)

    user-facing URL in the consuming app



14
15
16
# File 'lib/plan_my_stuff/issue_metadata.rb', line 14

def issues_url
  @issues_url
end

Returns metadata-backed issue relationships. Only :related links live here; native relationships (blocking, parent, sub_ticket, duplicate_of) live on GitHub.

Returns:

  • (Array<PlanMyStuff::Link>)

    metadata-backed issue relationships. Only :related links live here; native relationships (blocking, parent, sub_ticket, duplicate_of) live on GitHub.



24
25
26
# File 'lib/plan_my_stuff/issue_metadata.rb', line 24

def links
  @links
end

#next_reminder_atTime?

Returns when the next reminder event should fire for this issue.

Returns:

  • (Time, nil)

    when the next reminder event should fire for this issue



33
34
35
# File 'lib/plan_my_stuff/issue_metadata.rb', line 33

def next_reminder_at
  @next_reminder_at
end

#reminder_daysArray<Integer>?

Returns per-issue override of config.reminder_days; applies to both waiting kinds.

Returns:

  • (Array<Integer>, nil)

    per-issue override of config.reminder_days; applies to both waiting kinds



36
37
38
# File 'lib/plan_my_stuff/issue_metadata.rb', line 36

def reminder_days
  @reminder_days
end

#responded_atTime?

Returns first support action timestamp, nil until set.

Returns:

  • (Time, nil)

    first support action timestamp, nil until set



12
13
14
# File 'lib/plan_my_stuff/issue_metadata.rb', line 12

def responded_at
  @responded_at
end

#visibility_allowlistArray<Integer>

Returns user IDs of non-support users allowed to view internal comments.

Returns:

  • (Array<Integer>)

    user IDs of non-support users allowed to view internal comments



16
17
18
# File 'lib/plan_my_stuff/issue_metadata.rb', line 16

def visibility_allowlist
  @visibility_allowlist
end

#waiting_on_approval_atTime?

Returns when the issue entered “waiting on approval” state.

Returns:

  • (Time, nil)

    when the issue entered “waiting on approval” state



31
32
33
# File 'lib/plan_my_stuff/issue_metadata.rb', line 31

def waiting_on_approval_at
  @waiting_on_approval_at
end

#waiting_on_user_atTime?

Returns when the issue entered “waiting on user reply” state.

Returns:

  • (Time, nil)

    when the issue entered “waiting on user reply” state



29
30
31
# File 'lib/plan_my_stuff/issue_metadata.rb', line 29

def waiting_on_user_at
  @waiting_on_user_at
end

Class Method Details

.build(user:, visibility: 'public', custom_fields: {}) ⇒ IssueMetadata

Builds a new IssueMetadata for issue creation, auto-filling gem defaults

Parameters:

  • user (Object, Integer)

    user object or user_id

  • custom_fields (Hash) (defaults to: {})

    app-defined field values

Returns:



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/plan_my_stuff/issue_metadata.rb', line 85

def build(user:, visibility: 'public', custom_fields: {})
   = new
  apply_common_build(
    ,
    user: user,
    visibility: visibility,
    custom_fields_data: custom_fields,
    custom_fields_schema: PlanMyStuff.configuration.custom_fields_for(:issue),
  )

  .responded_at = nil
  .issues_url = build_issues_url(PlanMyStuff.configuration)
  .visibility_allowlist = []
  .commit_sha = nil
  .auto_complete = true
  .links = []
  .approvals = []
  .waiting_on_user_at = nil
  .waiting_on_approval_at = nil
  .next_reminder_at = nil
  .reminder_days = nil
  .closed_by_inactivity = false
  .archived_at = nil

  
end

.from_hash(hash) ⇒ IssueMetadata

Builds an IssueMetadata from a parsed hash (e.g. from MetadataParser)

Parameters:

  • hash (Hash)

Returns:



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/plan_my_stuff/issue_metadata.rb', line 49

def from_hash(hash)
   = new
  apply_common_from_hash(, hash, PlanMyStuff.configuration.custom_fields_for(:issue))

  .responded_at = parse_time(hash[:responded_at])
  .issues_url = hash[:issues_url]
  if hash.key?(:priority_list) || hash.key?(:priority_list_priority)
    PlanMyStuff.deprecator.warn(PRIORITY_LIST_METADATA_DEPRECATION)
    .instance_variable_set(:@priority_list, hash[:priority_list]) if hash.key?(:priority_list)
    if hash.key?(:priority_list_priority)
      .instance_variable_set(:@priority_list_priority, hash[:priority_list_priority])
    end
    .instance_variable_set(:@legacy_priority_list_pending, true)
  end
  .visibility_allowlist = Array.wrap(hash[:visibility_allowlist])
  .commit_sha = hash[:commit_sha]
  .auto_complete = hash.fetch(:auto_complete, true)
  .links = normalize_links(hash[:links])
  .approvals = normalize_approvals(hash[:approvals])
  .waiting_on_user_at = parse_time(hash[:waiting_on_user_at])
  .waiting_on_approval_at = parse_time(hash[:waiting_on_approval_at])
  .next_reminder_at = parse_time(hash[:next_reminder_at])
  .reminder_days = normalize_reminder_days(hash[:reminder_days])
  .closed_by_inactivity = hash.fetch(:closed_by_inactivity, false)
  .archived_at = parse_time(hash[:archived_at])

  
end

Instance Method Details

#auto_complete?Boolean

Returns:

  • (Boolean)


191
192
193
# File 'lib/plan_my_stuff/issue_metadata.rb', line 191

def auto_complete?
  !!auto_complete
end

#priority_listObject?

Deprecated.

Use Issue#priority_list?. Removed in 1.0.0.

Returns:

  • (Object, nil)


199
200
201
202
# File 'lib/plan_my_stuff/issue_metadata.rb', line 199

def priority_list
  PlanMyStuff.deprecator.warn(PRIORITY_LIST_METADATA_DEPRECATION)
  @priority_list
end

#priority_list=(value) ⇒ Object

Deprecated.

Use Issue#update!(issue_fields: { ‘Priority List’ => ‘Yes’ }). Removed in 1.0.0.

Parameters:

  • value (Object)

Returns:

  • (Object)


210
211
212
213
214
# File 'lib/plan_my_stuff/issue_metadata.rb', line 210

def priority_list=(value)
  PlanMyStuff.deprecator.warn(PRIORITY_LIST_METADATA_DEPRECATION)
  @legacy_priority_list_pending = true
  @priority_list = value
end

#priority_list?Boolean

Deprecated.

Use Issue#priority_list?. Removed in 1.0.0.

Returns:

  • (Boolean)


220
221
222
223
# File 'lib/plan_my_stuff/issue_metadata.rb', line 220

def priority_list?
  PlanMyStuff.deprecator.warn(PRIORITY_LIST_METADATA_DEPRECATION)
  !!@priority_list
end

#priority_list_priorityObject?

Deprecated.

Use Issue#priority_list_priority. Removed in 1.0.0.

Returns:

  • (Object, nil)


229
230
231
232
# File 'lib/plan_my_stuff/issue_metadata.rb', line 229

def priority_list_priority
  PlanMyStuff.deprecator.warn(PRIORITY_LIST_METADATA_DEPRECATION)
  @priority_list_priority
end

#priority_list_priority=(value) ⇒ Object

Deprecated.

Use Issue#update!(issue_fields: { ‘Priority List Priority’ => N }). Removed in 1.0.0.

Parameters:

  • value (Object)

Returns:

  • (Object)


240
241
242
243
244
# File 'lib/plan_my_stuff/issue_metadata.rb', line 240

def priority_list_priority=(value)
  PlanMyStuff.deprecator.warn(PRIORITY_LIST_METADATA_DEPRECATION)
  @legacy_priority_list_pending = true
  @priority_list_priority = value
end

#responded?Boolean

Returns:

  • (Boolean)


247
248
249
# File 'lib/plan_my_stuff/issue_metadata.rb', line 247

def responded?
  !responded_at.nil?
end

#to_hHash

Returns:

  • (Hash)


269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
# File 'lib/plan_my_stuff/issue_metadata.rb', line 269

def to_h
  super.merge(
    responded_at: PlanMyStuff.format_time(responded_at),
    issues_url: issues_url,
    visibility_allowlist: visibility_allowlist,
    commit_sha: commit_sha,
    auto_complete: auto_complete,
    links: links.map(&:to_h),
    approvals: approvals.map(&:to_h),
    waiting_on_user_at: PlanMyStuff.format_time(waiting_on_user_at),
    waiting_on_approval_at: PlanMyStuff.format_time(waiting_on_approval_at),
    next_reminder_at: PlanMyStuff.format_time(next_reminder_at),
    reminder_days: reminder_days,
    closed_by_inactivity: closed_by_inactivity,
    archived_at: PlanMyStuff.format_time(archived_at),
  )
end

#visible_to?(user) ⇒ Boolean

Checks whether a user can see this issue’s internal content. Public issues are always visible. Internal issues are visible if the user is support staff or their ID is in the visibility_allowlist.

Parameters:

  • user (Object, Integer)

    user object or user_id

Returns:

  • (Boolean)


259
260
261
262
263
264
265
266
# File 'lib/plan_my_stuff/issue_metadata.rb', line 259

def visible_to?(user)
  return true if public?

  resolved = PlanMyStuff::UserResolver.resolve(user)
  return true if PlanMyStuff::UserResolver.support?(resolved)

  visibility_allowlist.include?(PlanMyStuff::UserResolver.user_id(resolved))
end