Class: CanvasERD::DiagramStore

Inherits:
Object
  • Object
show all
Defined in:
lib/canvas_erd/diagram_store.rb

Defined Under Namespace

Classes: Error, NotFound

Constant Summary collapse

DEFAULT_DIRECTORY =
"docs/erd"
FILENAME_PATTERN =
/\A[^\x00\/\\]+\.erd\.png\z/i

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(root:, directory: DEFAULT_DIRECTORY) ⇒ DiagramStore

Returns a new instance of DiagramStore.

Raises:



16
17
18
19
20
21
22
# File 'lib/canvas_erd/diagram_store.rb', line 16

def initialize(root:, directory: DEFAULT_DIRECTORY)
  @root = File.expand_path(root)
  @directory = File.expand_path(directory, @root)
  return if @directory.start_with?("#{@root}#{File::SEPARATOR}")

  raise Error, "Diagram directory must be inside the Rails application"
end

Instance Attribute Details

#directoryObject (readonly)

Returns the value of attribute directory.



14
15
16
# File 'lib/canvas_erd/diagram_store.rb', line 14

def directory
  @directory
end

Instance Method Details

#namesObject



28
29
30
31
32
# File 'lib/canvas_erd/diagram_store.rb', line 28

def names
  return [] unless Dir.exist?(directory)

  Dir.children(directory).select { |name| valid_filename?(name) && File.file?(path_for(name)) }.sort
end

#read(name) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/canvas_erd/diagram_store.rb', line 34

def read(name)
  bytes = File.binread(path_for(name))
  PngDocument.read(StringIO.new(bytes))
  bytes
rescue Errno::ENOENT
  raise NotFound, "Diagram not found: #{name}"
rescue SystemCallError => error
  raise Error, "Could not read diagram #{name}: #{error.message}"
rescue PngDocument::Error => error
  raise Error, error.message
end

#relative_directoryObject



24
25
26
# File 'lib/canvas_erd/diagram_store.rb', line 24

def relative_directory
  directory.delete_prefix("#{@root}#{File::SEPARATOR}")
end

#write(name, bytes) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
# File 'lib/canvas_erd/diagram_store.rb', line 46

def write(name, bytes)
  path = path_for(name)
  PngDocument.read(StringIO.new(bytes))
  FileUtils.mkdir_p(directory)
  File.binwrite(path, bytes)
  name
rescue SystemCallError => error
  raise Error, "Could not save diagram #{name}: #{error.message}"
rescue PngDocument::Error => error
  raise Error, error.message
end