Class: Opencdd::Parcel::Workbook

Inherits:
Object
  • Object
show all
Defined in:
lib/opencdd/parcel/workbook.rb

Defined Under Namespace

Classes: ProjectInfo, SheetMapEntry

Constant Summary collapse

HEADER_ROW_NAMES =
%i[
  class_id class_name source_language translation_language
  property_id property_name datatype value_format pattern
  default_value requirement unit
].freeze
MANDATORY_HEADER_ROWS =
%i[class_id property_id].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(sheets:, sheetmap: [], project: nil, source_path: nil, hidden_header_rows: nil) ⇒ Workbook

Returns a new instance of Workbook.



23
24
25
26
27
28
29
30
31
32
# File 'lib/opencdd/parcel/workbook.rb', line 23

def initialize(sheets:, sheetmap: [], project: nil, source_path: nil,
               hidden_header_rows: nil)
  @sheets = sheets
  @sheetmap = sheetmap
  @project = project
  @source_path = source_path
  @hidden_header_rows = validate_hidden(hidden_header_rows)
  reindex
  freeze
end

Instance Attribute Details

#projectObject (readonly)

Returns the value of attribute project.



21
22
23
# File 'lib/opencdd/parcel/workbook.rb', line 21

def project
  @project
end

#sheetmapObject (readonly)

Returns the value of attribute sheetmap.



21
22
23
# File 'lib/opencdd/parcel/workbook.rb', line 21

def sheetmap
  @sheetmap
end

#sheetsObject (readonly)

Returns the value of attribute sheets.



21
22
23
# File 'lib/opencdd/parcel/workbook.rb', line 21

def sheets
  @sheets
end

#source_pathObject (readonly)

Returns the value of attribute source_path.



21
22
23
# File 'lib/opencdd/parcel/workbook.rb', line 21

def source_path
  @source_path
end

Instance Method Details

#base_languageObject



111
112
113
# File 'lib/opencdd/parcel/workbook.rb', line 111

def base_language
  @project&.base_language || "en"
end

#class_sheetObject



91
# File 'lib/opencdd/parcel/workbook.rb', line 91

def class_sheet      ; sheets_of_type(:class).first      ; end

#each_sheet(&block) ⇒ Object



99
100
101
# File 'lib/opencdd/parcel/workbook.rb', line 99

def each_sheet(&block)
  @sheets.each(&block)
end

#hidden_header_rowsObject



34
35
36
# File 'lib/opencdd/parcel/workbook.rb', line 34

def hidden_header_rows
  @hidden_header_rows.dup
end

#hide_header_row!(name) ⇒ Object

Raises:

  • (ArgumentError)


38
39
40
41
42
43
44
# File 'lib/opencdd/parcel/workbook.rb', line 38

def hide_header_row!(name)
  sym = name.to_sym
  raise ArgumentError, "unknown header row: #{sym.inspect}" unless HEADER_ROW_NAMES.include?(sym)
  raise ArgumentError, "cannot hide mandatory header row: #{sym.inspect}" if MANDATORY_HEADER_ROWS.include?(sym)
  @hidden_header_rows << sym
  self
end

#import_into(sheet_name, file_path, format: nil) ⇒ Object

Raises:

  • (ArgumentError)


68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/opencdd/parcel/workbook.rb', line 68

def import_into(sheet_name, file_path, format: nil)
  target = sheet(sheet_name)
  raise ArgumentError, "unknown sheet: #{sheet_name.inspect}" unless target

  format ||= detect_format(file_path)
  temp = read_external_sheet(file_path, format, target.meta_class_irdi)
  unless meta_codes_match?(target.meta_class_irdi, temp.meta_class_irdi)
    raise ArgumentError,
          "meta-class mismatch: target=#{target.meta_class_irdi} source=#{temp.meta_class_irdi}"
  end
  target.merge_rows_from(temp)
  self
end

#merge(other) ⇒ Object



115
116
117
118
119
120
121
# File 'lib/opencdd/parcel/workbook.rb', line 115

def merge(other)
  merged_sheets = @sheets + other.sheets
  merged_map    = @sheetmap + other.sheetmap
  merged_proj   = @project || other.project
  Workbook.new(sheets: merged_sheets, sheetmap: merged_map, project: merged_proj,
               source_path: @source_path)
end

#parcel_idObject



103
104
105
# File 'lib/opencdd/parcel/workbook.rb', line 103

def parcel_id
  @project&.parcel_id
end

#project_idObject



107
108
109
# File 'lib/opencdd/parcel/workbook.rb', line 107

def project_id
  @project&.project_id
end

#property_sheetObject



92
# File 'lib/opencdd/parcel/workbook.rb', line 92

def property_sheet   ; sheets_of_type(:property).first   ; end

#register_sheet(sheet) ⇒ Object

Raises:

  • (ArgumentError)


51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/opencdd/parcel/workbook.rb', line 51

def register_sheet(sheet)
  raise ArgumentError, "sheet already registered: #{sheet.name}" if @sheets_by_name.key?(sheet.name.to_s)
  @sheets << sheet
  @sheets_by_name[sheet.name.to_s] = sheet
  @sheetmap << SheetMapEntry.new(
    project_id: @project&.project_id || "LOCAL",
    parcel_id:  @project&.parcel_id,
    class_irdi: sheet.meta_class_irdi,
    content_no: 0,
    sheet_no:   @sheets.size,
    sheet_name: sheet.name,
    type:       parcel_type_label_for(sheet.type),
    target:     "",
  )
  self
end

#relation_sheetObject



96
# File 'lib/opencdd/parcel/workbook.rb', line 96

def relation_sheet   ; sheets_of_type(:relation).first   ; end

#sheet(name) ⇒ Object



82
83
84
# File 'lib/opencdd/parcel/workbook.rb', line 82

def sheet(name)
  @sheets_by_name[name.to_s]
end

#sheets_of_type(type) ⇒ Object



86
87
88
89
# File 'lib/opencdd/parcel/workbook.rb', line 86

def sheets_of_type(type)
  type = type.to_sym
  @sheets.select { |s| s.type == type }
end

#show_header_row!(name) ⇒ Object



46
47
48
49
# File 'lib/opencdd/parcel/workbook.rb', line 46

def show_header_row!(name)
  @hidden_header_rows.delete(name.to_sym)
  self
end

#unit_sheetObject



93
# File 'lib/opencdd/parcel/workbook.rb', line 93

def unit_sheet       ; sheets_of_type(:unit).first       ; end

#value_list_sheetObject



94
# File 'lib/opencdd/parcel/workbook.rb', line 94

def value_list_sheet ; sheets_of_type(:value_list).first ; end

#value_term_sheetObject



95
# File 'lib/opencdd/parcel/workbook.rb', line 95

def value_term_sheet ; sheets_of_type(:value_term).first ; end

#view_control_sheetObject



97
# File 'lib/opencdd/parcel/workbook.rb', line 97

def view_control_sheet; sheets_of_type(:view_control).first; end