Class: BoringBuilder::Project

Inherits:
Object
  • Object
show all
Defined in:
lib/boringbuilder/project.rb

Constant Summary collapse

DEFAULT_EXCLUDES =
%w[
  .env
  .env.*
  .git
  coverage
  dist
  log
  node_modules
  tmp
  vendor/bundle
].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(configuration) ⇒ Project

Returns a new instance of Project.



19
20
21
# File 'lib/boringbuilder/project.rb', line 19

def initialize(configuration)
  @configuration = configuration
end

Instance Attribute Details

#configurationObject (readonly)

Returns the value of attribute configuration.



17
18
19
# File 'lib/boringbuilder/project.rb', line 17

def configuration
  @configuration
end

Instance Method Details

#app_nameObject



47
48
49
# File 'lib/boringbuilder/project.rb', line 47

def app_name
  @app_name ||= root.basename.to_s.downcase.gsub(/[^a-z0-9]+/, "-").gsub(/\A-+|-+\z/, "")
end

#application_pathObject



92
93
94
# File 'lib/boringbuilder/project.rb', line 92

def application_path
  application.path
end

#application_userObject



96
97
98
# File 'lib/boringbuilder/project.rb', line 96

def application_user
  application.user
end

#artifactObject



120
121
122
123
124
125
126
127
# File 'lib/boringbuilder/project.rb', line 120

def artifact
  @artifact ||= begin
    configured = configuration.artifact
    add_configured_entries(configured)
    add_default_entries(configured) if configured.empty?
    configured
  end
end

#artifact_pathsObject



88
89
90
# File 'lib/boringbuilder/project.rb', line 88

def artifact_paths
  artifact.entries.filter_map { |entry| entry.source if entry.origin == :container }.map(&:to_s)
end

#assets?Boolean

Returns:

  • (Boolean)


76
77
78
79
80
# File 'lib/boringbuilder/project.rb', line 76

def assets?
  return configuration.assets unless configuration.assets.nil?

  root.join("app/assets").directory? || root.join("config/manifest.js").file?
end

#bootsnap?Boolean

Returns:

  • (Boolean)


82
83
84
85
86
# File 'lib/boringbuilder/project.rb', line 82

def bootsnap?
  return configuration.bootsnap unless configuration.bootsnap.nil?

  root.join("Gemfile.lock").read.match?(/^    bootsnap \(/)
end

#container(client, progress: BuildProgress.silent) ⇒ Object



32
33
34
35
36
37
# File 'lib/boringbuilder/project.rb', line 32

def container(client, progress: BuildProgress.silent)
  return Pipeline.new(self, client, progress: progress).build(&configuration.pipeline) if custom_pipeline?

  builder = rails? ? RailsBuild : RubyBuild
  builder.new(self, client, progress: progress).container
end

#custom_pipeline?Boolean

Returns:

  • (Boolean)


151
152
153
# File 'lib/boringbuilder/project.rb', line 151

def custom_pipeline?
  !configuration.pipeline.nil?
end

#frameworkObject



63
64
65
# File 'lib/boringbuilder/project.rb', line 63

def framework
  application.framework
end

#hanami?Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/boringbuilder/project.rb', line 59

def hanami?
  application.hanami?
end

#locked?Boolean

Returns:

  • (Boolean)


67
68
69
# File 'lib/boringbuilder/project.rb', line 67

def locked?
  root.join("Gemfile.lock").file?
end

#output_pathObject



129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/boringbuilder/project.rb', line 129

def output_path
  return configuration.output if configuration.output

  suffix = {
    directory: "rootfs",
    tar: "tar",
    tar_zst: "tar.zst",
    oci: "oci.tar",
    docker: "docker.tar"
  }.fetch(configuration.format)
  platform = configuration.platform&.tr("/", "-") || "native"
  root.join("dist", "#{app_name}-#{platform}.#{suffix}")
end

#planObject



39
40
41
# File 'lib/boringbuilder/project.rb', line 39

def plan
  ProjectPlan.new(self).to_h
end

#rails?Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/boringbuilder/project.rb', line 51

def rails?
  application.rails?
end

#rootObject



43
44
45
# File 'lib/boringbuilder/project.rb', line 43

def root
  configuration.root
end

#ruby?Boolean

Returns:

  • (Boolean)


55
56
57
# File 'lib/boringbuilder/project.rb', line 55

def ruby?
  application.ruby?
end

#ruby_versionObject



71
72
73
74
# File 'lib/boringbuilder/project.rb', line 71

def ruby_version
  @ruby_version ||= mise_ruby_version || tool_versions_ruby_version || ruby_version_file ||
                    gemfile_ruby_version || locked_ruby_version || RUBY_VERSION
end

#runtime_commandObject



104
105
106
# File 'lib/boringbuilder/project.rb', line 104

def runtime_command
  application.runtime_command
end

#runtime_entrypointObject



108
109
110
# File 'lib/boringbuilder/project.rb', line 108

def runtime_entrypoint
  application.runtime_entrypoint
end

#runtime_environmentObject



100
101
102
# File 'lib/boringbuilder/project.rb', line 100

def runtime_environment
  application.runtime_environment
end

#runtime_portObject



112
113
114
# File 'lib/boringbuilder/project.rb', line 112

def runtime_port
  application.runtime_port
end

#source(client) ⇒ Object



143
144
145
# File 'lib/boringbuilder/project.rb', line 143

def source(client)
  client.host.directory(root.to_s, exclude: DEFAULT_EXCLUDES, gitignore: true)
end

#source_file(client, path) ⇒ Object



147
148
149
# File 'lib/boringbuilder/project.rb', line 147

def source_file(client, path)
  client.host.file(root.join(path).to_s)
end

#validate!Object



23
24
25
26
27
28
29
30
# File 'lib/boringbuilder/project.rb', line 23

def validate!
  configuration.validate!
  validate_lockfile!
  validate_application!
  validate_native_javascript!
  Exporters::Resolver.new(self, nil).validate!
  self
end

#web?Boolean

Returns:

  • (Boolean)


116
117
118
# File 'lib/boringbuilder/project.rb', line 116

def web?
  application.web?
end