Class: HeadMusic::Content::Credits

Inherits:
Object
  • Object
show all
Includes:
Enumerable, ValueEquality
Defined in:
lib/head_music/content/credits.rb

Overview

The credits attaching at one level — work, project, or publication — and the single place the level constraint is enforced.

Constant Summary collapse

LEVELS =
HeadMusic::Content::Role::LEVELS

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(level, credits = []) ⇒ Credits

Returns a new instance of Credits.

Raises:

  • (ArgumentError)


20
21
22
23
24
25
26
# File 'lib/head_music/content/credits.rb', line 20

def initialize(level, credits = [])
  @level = level&.to_sym
  raise ArgumentError, "unknown credit level: #{level.inspect}" unless LEVELS.include?(@level)

  @credits = Array(credits).map { |credit| ensure_credit(credit) }.freeze
  freeze
end

Instance Attribute Details

#credits ⇒ Object (readonly)

Returns the value of attribute credits.



16
17
18
# File 'lib/head_music/content/credits.rb', line 16

def credits
  @credits
end

#level ⇒ Object (readonly)

Returns the value of attribute level.



16
17
18
# File 'lib/head_music/content/credits.rb', line 16

def level
  @level
end

Class Method Details

.from_h(array, level:) ⇒ Object



12
13
14
# File 'lib/head_music/content/credits.rb', line 12

def self.from_h(array, level:)
  new(level, Array(array))
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql? Originally defined in module ValueEquality

#add(person, role) ⇒ Object



32
33
34
# File 'lib/head_music/content/credits.rb', line 32

def add(person, role)
  self.class.new(level, credits + [HeadMusic::Content::Credit.new(person: person, role: role)])
end

#each ⇒ Object



28
29
30
# File 'lib/head_music/content/credits.rb', line 28

def each(&)
  credits.each(&)
end

#empty? ⇒ Boolean

Returns:

  • (Boolean)


45
46
47
# File 'lib/head_music/content/credits.rb', line 45

def empty?
  credits.empty?
end

#ensure_credit(credit) ⇒ Object (private)



59
60
61
62
63
# File 'lib/head_music/content/credits.rb', line 59

def ensure_credit(credit)
  credit = HeadMusic::Content::Credit.from_h(credit) if credit.is_a?(Hash)
  validate_level(credit)
  credit
end

#for(role) ⇒ Object



36
37
38
39
# File 'lib/head_music/content/credits.rb', line 36

def for(role)
  wanted = HeadMusic::Content::Role.get(role)
  credits.select { |credit| credit.role == wanted }
end

#hash ⇒ Object Originally defined in module ValueEquality

#names(role) ⇒ Object



41
42
43
# File 'lib/head_music/content/credits.rb', line 41

def names(role)
  self.for(role).map { |credit| credit.person.full_name }
end

#size ⇒ Object



49
50
51
# File 'lib/head_music/content/credits.rb', line 49

def size
  credits.size
end

#to_h ⇒ Object



53
54
55
# File 'lib/head_music/content/credits.rb', line 53

def to_h
  credits.map(&:to_h)
end

#validate_level(credit) ⇒ Object (private)

Raises:

  • (ArgumentError)


65
66
67
68
69
# File 'lib/head_music/content/credits.rb', line 65

def validate_level(credit)
  return if credit.role.level == level

  raise ArgumentError, "#{credit.role.key} is a #{credit.role.level} role, not a #{level} role"
end