Module: CocinaDisplay::Concerns::Events

Included in:
CocinaDisplay::CocinaRecord, RelatedResource
Defined in:
lib/cocina_display/concerns/events.rb

Instance Method Summary collapse

Instance Method Details

#admin_creation_eventCocinaDisplay::Events::Event

The adminMetadata creation event (When was it was deposited?)



93
94
95
# File 'lib/cocina_display/concerns/events.rb', line 93

def admin_creation_event
  @admin_events ||= path("$.description.adminMetadata.event[?(@.type==\"creation\")]").map { |event| CocinaDisplay::Events::Event.new(event) }.first
end

#earliest_preferred_date(dates, ignore_qualified: false) ⇒ CocinaDisplay::Dates::Date?

Choose the earliest, best date from a provided list of event dates. Rules to consider:

  1. Reject any dates that were not parsed.

  2. If ignore_qualified is true, reject any qualified dates.

  3. If there are any primary dates, prefer those dates.

  4. If there are any encoded dates, prefer those dates.

  5. From whatever is left, choose the earliest date.

Parameters:

  • dates (Array<CocinaDisplay::Dates::Date>)

    The list of dates

  • ignore_qualified (Boolean) (defaults to: false)

    Reject qualified dates (e.g. approximate)

Returns:



165
166
167
168
169
170
171
172
173
174
# File 'lib/cocina_display/concerns/events.rb', line 165

def earliest_preferred_date(dates, ignore_qualified: false)
  return nil if dates.empty?

  dates.filter!(&:parsed_date?)
  dates.reject!(&:approximate?) if ignore_qualified
  dates = dates.filter(&:primary?).presence || dates
  dates = dates.filter(&:encoding?).presence || dates

  dates.min
end

#event_date_display_dataArray<CocinaDisplay::DisplayData>

DisplayData for all dates associated with events.

Returns:



134
135
136
# File 'lib/cocina_display/concerns/events.rb', line 134

def event_date_display_data
  CocinaDisplay::DisplayData.from_objects(event_dates)
end

#event_datesArray<CocinaDisplay::Dates::Date>

All dates associated with the object via an event.

Returns:



122
123
124
# File 'lib/cocina_display/concerns/events.rb', line 122

def event_dates
  @event_dates ||= events.flat_map(&:dates)
end

#event_note_display_dataArray<CocinaDisplay::DisplayData>

DisplayData for all notes associated with events.

Returns:



128
129
130
# File 'lib/cocina_display/concerns/events.rb', line 128

def event_note_display_data
  CocinaDisplay::DisplayData.from_objects(events.flat_map(&:notes))
end

#eventsArray<CocinaDisplay::Events::Event>

All root level events associated with the object.

Returns:



87
88
89
# File 'lib/cocina_display/concerns/events.rb', line 87

def events
  @events ||= path("$.description.event.*").map { |event| CocinaDisplay::Events::Event.new(event) }
end

#imprint_eventsArray<CocinaDisplay::Imprint>

Array of CocinaDisplay::Imprint objects for all relevant Cocina events. Considers publication, creation, capture, and copyright events. Considers event types as well as date types if the event is untyped. Prefers events where the date was not encoded, if any.

Returns:

  • (Array<CocinaDisplay::Imprint>)

    The list of Imprint objects



110
111
112
113
114
115
116
117
118
# File 'lib/cocina_display/concerns/events.rb', line 110

def imprint_events
  imprints = events.filter do |event|
    event.has_any_type?("publication", "creation", "capture", "copyright")
  end.map do |event|
    CocinaDisplay::Events::Imprint.new(event.cocina)
  end

  imprints.reject(&:date_encoding?).presence || imprints
end

#imprint_strString?

String for displaying the imprint statement(s). “New York : Meridian Book, 1993, c1967”

Examples:

bt553vr2845

Returns:

  • (String, nil)

See Also:

  • Imprint#to_s


67
68
69
# File 'lib/cocina_display/concerns/events.rb', line 67

def imprint_str
  imprint_events.map(&:to_s).compact_blank.join("; ")
end

#pub_date(ignore_qualified: false) ⇒ CocinaDisplay::Dates::Date?

The earliest preferred publication date as a CocinaDisplay::Dates::Date object. Considers publication, creation, and capture dates in that order. Prefers dates marked as primary and those with a declared encoding.

Parameters:

  • ignore_qualified (Boolean) (defaults to: false)

    Reject qualified dates (e.g. approximate)

Returns:



144
145
146
147
148
149
150
151
152
# File 'lib/cocina_display/concerns/events.rb', line 144

def pub_date(ignore_qualified: false)
  pub_event_dates = event_dates.filter { |date| date.type == "publication" }
  creation_event_dates = event_dates.filter { |date| date.type == "creation" }
  capture_event_dates = event_dates.filter { |date| date.type == "capture" }

  [pub_event_dates, creation_event_dates, capture_event_dates].flat_map do |dates|
    earliest_preferred_date(dates, ignore_qualified: ignore_qualified)
  end.compact.first
end

#pub_date_edtf(ignore_qualified: false) ⇒ Date?

The earliest preferred publication date as a Date object. If the date was a range or interval, uses the start (or end if no start). Considers publication, creation, and capture dates in that order. Prefers dates marked as primary and those with a declared encoding.

Parameters:

  • ignore_qualified (Boolean) (defaults to: false)

    Reject qualified dates (e.g. approximate)

Returns:

  • (Date, nil)

See Also:



11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/cocina_display/concerns/events.rb', line 11

def pub_date_edtf(ignore_qualified: false)
  return unless (date = pub_date(ignore_qualified: ignore_qualified))

  if date.is_a? CocinaDisplay::Dates::DateRange
    date = date.start&.known? ? date.start : date.stop
  end

  return unless date&.known?
  return date.date.from if date.date.is_a?(EDTF::Interval)

  date.date
end

#pub_year_int(ignore_qualified: false) ⇒ Integer?

Note:

6 BCE will return -5; 4 CE will return 4.

The earliest preferred publication year as an integer. If the date was a range or interval, uses the start (or end if no start). Considers publication, creation, and capture dates in that order. Prefers dates marked as primary and those with a declared encoding.

Parameters:

  • ignore_qualified (Boolean) (defaults to: false)

    Reject qualified dates (e.g. approximate)

Returns:

  • (Integer, nil)


31
32
33
# File 'lib/cocina_display/concerns/events.rb', line 31

def pub_year_int(ignore_qualified: false)
  pub_date_edtf(ignore_qualified: ignore_qualified)&.year
end

#pub_year_ints(ignore_qualified: false) ⇒ Array<Integer>?

Note:

6 BCE will appear as -5; 4 CE will appear as 4.

The range of preferred publication years as an array of integers. Considers publication, creation, and capture dates in that order. Prefers dates marked as primary and those with a declared encoding.

Parameters:

  • ignore_qualified (Boolean) (defaults to: false)

    Reject qualified dates (e.g. approximate)

Returns:

  • (Array<Integer>, nil)


41
42
43
44
45
46
# File 'lib/cocina_display/concerns/events.rb', line 41

def pub_year_ints(ignore_qualified: false)
  date = pub_date(ignore_qualified: ignore_qualified)
  return unless date

  date.to_a.map(&:year).compact.uniq.sort
end

#pub_year_str(ignore_qualified: false) ⇒ String?

String for displaying the earliest preferred publication year or range. Considers publication, creation, and capture dates in that order. Prefers dates marked as primary and those with a declared encoding.

Examples:

Year range

CocinaRecord.fetch('bb099mt5053').pub_year_str #=> "1932 - 2012"

Parameters:

  • ignore_qualified (Boolean) (defaults to: false)

    Reject qualified dates (e.g. approximate)

Returns:

  • (String, nil)


55
56
57
58
59
60
# File 'lib/cocina_display/concerns/events.rb', line 55

def pub_year_str(ignore_qualified: false)
  date = pub_date(ignore_qualified: ignore_qualified)
  return unless date

  date.decoded_value(allowed_precisions: [:year, :decade, :century])
end

#publication_countriesArray<String>

List of countries of publication as strings. Considers locations for all publication, creation, and capture events.

Returns:

  • (Array<String>)


81
82
83
# File 'lib/cocina_display/concerns/events.rb', line 81

def publication_countries
  publication_events.flat_map { |event| event.locations.map(&:country_name) }.compact_blank.uniq
end

#publication_eventsArray<CocinaDisplay::Events::Event>

All events that could be used to select a publication date. Includes publication, creation, and capture events. Considers event types as well as date types if the event is untyped.

Returns:



101
102
103
# File 'lib/cocina_display/concerns/events.rb', line 101

def publication_events
  events.filter { |event| event.has_any_type?("publication", "creation", "capture") }
end

#publication_placesArray<String>

List of places of publication as strings. Considers locations for all publication, creation, and capture events.

Returns:

  • (Array<String>)


74
75
76
# File 'lib/cocina_display/concerns/events.rb', line 74

def publication_places
  publication_events.flat_map { |event| event.locations.map(&:to_s) }.compact_blank.uniq
end