pray-cli 1.9.2 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/lib/pray/cli/commands/workflow.rb +1 -1
- data/lib/pray/cli/helpers.rb +2 -1
- data/lib/pray/compose_dest.rb +59 -0
- data/lib/pray/format_serialize.rb +6 -1
- data/lib/pray/lockfile.rb +32 -6
- data/lib/pray/lockfile_serialize.rb +15 -0
- data/lib/pray/manifest.rb +11 -10
- data/lib/pray/manifest_json.rb +4 -4
- data/lib/pray/manifest_parser.rb +1 -0
- data/lib/pray/manifest_parser_blocks.rb +5 -2
- data/lib/pray/manifest_parser_helpers.rb +34 -5
- data/lib/pray/materialize.rb +5 -3
- data/lib/pray/package_spec.rb +19 -0
- data/lib/pray/path_safety.rb +9 -0
- data/lib/pray/plan.rb +5 -11
- data/lib/pray/render.rb +43 -65
- data/lib/pray/render_content.rb +36 -0
- data/lib/pray/render_dest.rb +215 -0
- data/lib/pray/render_layout.rb +21 -0
- data/lib/pray/render_patch.rb +107 -0
- data/lib/pray/resolve.rb +5 -48
- data/lib/pray/resolve_exports.rb +79 -0
- data/lib/pray/verify.rb +2 -0
- data/lib/pray/verify_provisioned.rb +55 -0
- data/lib/pray/version.rb +2 -2
- data/lib/pray.rb +6 -0
- metadata +8 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pray
|
|
4
|
+
module ResolveExports
|
|
5
|
+
module_function
|
|
6
|
+
|
|
7
|
+
def select_exports(declaration, spec)
|
|
8
|
+
unless declaration.exports.empty?
|
|
9
|
+
declaration.exports.each do |export|
|
|
10
|
+
unless spec.exports.key?(export)
|
|
11
|
+
raise Error.resolution("package #{declaration.name} does not export #{export}")
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
return declaration.exports
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
roles = declaration.roles || []
|
|
18
|
+
return spec.exports.keys.sort if roles.empty? && declaration.file.nil?
|
|
19
|
+
|
|
20
|
+
effective_roles = roles.dup
|
|
21
|
+
effective_roles << "file" if declaration.file && !effective_roles.include?("file")
|
|
22
|
+
|
|
23
|
+
selected = []
|
|
24
|
+
effective_roles.each do |role|
|
|
25
|
+
compatible = if role == "fragment"
|
|
26
|
+
fragment_role_exports(spec)
|
|
27
|
+
else
|
|
28
|
+
spec.exports.filter_map do |name, export|
|
|
29
|
+
name if Destination.export_kind_matches_role?(export.kind, role)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
case compatible.length
|
|
33
|
+
when 1
|
|
34
|
+
selected << compatible.first unless selected.include?(compatible.first)
|
|
35
|
+
when 0
|
|
36
|
+
raise Error.resolution(
|
|
37
|
+
"package #{declaration.name} has no export compatible with #{role}"
|
|
38
|
+
)
|
|
39
|
+
else
|
|
40
|
+
raise Error.resolution(
|
|
41
|
+
"package #{declaration.name} has multiple exports compatible with #{role}; set export: \"name\""
|
|
42
|
+
)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
selected
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def load_export_bodies(file_bytes, spec, selected_exports)
|
|
49
|
+
export_bodies = {}
|
|
50
|
+
selected_exports.each do |export_name|
|
|
51
|
+
entry = spec.exports[export_name]
|
|
52
|
+
raise Error.resolution("package #{spec.name} is missing export #{export_name}") unless entry
|
|
53
|
+
next unless %w[fragment file].include?(entry.kind)
|
|
54
|
+
|
|
55
|
+
bytes = file_bytes[entry.path]
|
|
56
|
+
unless bytes
|
|
57
|
+
raise Error.integrity("package file missing for export #{export_name}: #{entry.path}")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
text = bytes.dup.force_encoding(Encoding::UTF_8)
|
|
61
|
+
unless text.valid_encoding?
|
|
62
|
+
if entry.kind == "fragment"
|
|
63
|
+
raise Error.integrity("package file is not valid utf-8 for export #{export_name}")
|
|
64
|
+
end
|
|
65
|
+
next
|
|
66
|
+
end
|
|
67
|
+
export_bodies[export_name] = Hashing.normalize_line_endings(text)
|
|
68
|
+
end
|
|
69
|
+
export_bodies
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def fragment_role_exports(spec)
|
|
73
|
+
fragments = spec.exports.filter_map { |name, export| name if export.kind == "fragment" }
|
|
74
|
+
return fragments unless fragments.empty?
|
|
75
|
+
|
|
76
|
+
spec.exports.filter_map { |name, export| name if export.kind == "file" }
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
data/lib/pray/verify.rb
CHANGED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pray
|
|
4
|
+
module VerifyProvisioned
|
|
5
|
+
module_function
|
|
6
|
+
|
|
7
|
+
def push_findings(project, report)
|
|
8
|
+
push_exclusive_file_export_findings(project, report)
|
|
9
|
+
Render.planned_provisioned_files(project).each do |file|
|
|
10
|
+
path_text = file.path.to_s.tr("\\", "/")
|
|
11
|
+
absolute = File.join(project.project_root, file.path)
|
|
12
|
+
if File.symlink?(absolute)
|
|
13
|
+
report.findings << VerificationFinding.new(
|
|
14
|
+
kind: "verify_error",
|
|
15
|
+
message: "Provisioned file `#{path_text}` is a symbolic link. Remove the link or choose another destination."
|
|
16
|
+
)
|
|
17
|
+
next
|
|
18
|
+
end
|
|
19
|
+
unless File.file?(absolute)
|
|
20
|
+
report.findings << VerificationFinding.new(
|
|
21
|
+
kind: "verify_error",
|
|
22
|
+
message: "Provisioned file `#{path_text}` from `#{file.package}` is missing. Run `pray install` to materialize it."
|
|
23
|
+
)
|
|
24
|
+
next
|
|
25
|
+
end
|
|
26
|
+
destination_bytes = File.binread(absolute)
|
|
27
|
+
expected_bytes = Render.expected_provisioned_bytes(file.source, project.manifest.symbols || {})
|
|
28
|
+
next if Hashing.sha256_prefixed(destination_bytes) == Hashing.sha256_prefixed(expected_bytes.b)
|
|
29
|
+
|
|
30
|
+
report.findings << VerificationFinding.new(
|
|
31
|
+
kind: "package_integrity",
|
|
32
|
+
message: "Provisioned file `#{path_text}` no longer matches package `#{file.package}`. Run `pray install` to restore it."
|
|
33
|
+
)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def push_exclusive_file_export_findings(project, report)
|
|
38
|
+
project.packages.each do |package|
|
|
39
|
+
destination = package.declaration.file
|
|
40
|
+
next unless destination
|
|
41
|
+
|
|
42
|
+
has_file_export = package.selected_exports.any? do |name|
|
|
43
|
+
export = package.spec.exports[name]
|
|
44
|
+
export && export.kind == "file"
|
|
45
|
+
end
|
|
46
|
+
next if has_file_export
|
|
47
|
+
|
|
48
|
+
report.findings << VerificationFinding.new(
|
|
49
|
+
kind: "verify_error",
|
|
50
|
+
message: "Package `#{package.declaration.name}` declares file: \"#{destination}\" but has no selected file export."
|
|
51
|
+
)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
data/lib/pray/version.rb
CHANGED
data/lib/pray.rb
CHANGED
|
@@ -20,10 +20,16 @@ require_relative "pray/project_context"
|
|
|
20
20
|
require_relative "pray/environment"
|
|
21
21
|
require_relative "pray/resolve_context"
|
|
22
22
|
require_relative "pray/resolve_source"
|
|
23
|
+
require_relative "pray/resolve_exports"
|
|
23
24
|
require_relative "pray/invocation"
|
|
24
25
|
require_relative "pray/resolve"
|
|
26
|
+
require_relative "pray/compose_dest"
|
|
27
|
+
require_relative "pray/render_patch"
|
|
25
28
|
require_relative "pray/render"
|
|
29
|
+
require_relative "pray/render_dest"
|
|
30
|
+
require_relative "pray/render_layout"
|
|
26
31
|
require_relative "pray/verify_position"
|
|
32
|
+
require_relative "pray/verify_provisioned"
|
|
27
33
|
require_relative "pray/verify"
|
|
28
34
|
require_relative "pray/resource_limits"
|
|
29
35
|
require_relative "pray/http_body"
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pray-cli
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.10.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andrei Makarov
|
|
@@ -113,6 +113,7 @@ files:
|
|
|
113
113
|
- lib/pray/cli/parse_auth.rb
|
|
114
114
|
- lib/pray/cli/parse_trust.rb
|
|
115
115
|
- lib/pray/cli/suggest.rb
|
|
116
|
+
- lib/pray/compose_dest.rb
|
|
116
117
|
- lib/pray/confess.rb
|
|
117
118
|
- lib/pray/config.rb
|
|
118
119
|
- lib/pray/constraint.rb
|
|
@@ -146,8 +147,13 @@ files:
|
|
|
146
147
|
- lib/pray/registry_install.rb
|
|
147
148
|
- lib/pray/registry_integrity.rb
|
|
148
149
|
- lib/pray/render.rb
|
|
150
|
+
- lib/pray/render_content.rb
|
|
151
|
+
- lib/pray/render_dest.rb
|
|
152
|
+
- lib/pray/render_layout.rb
|
|
153
|
+
- lib/pray/render_patch.rb
|
|
149
154
|
- lib/pray/resolve.rb
|
|
150
155
|
- lib/pray/resolve_context.rb
|
|
156
|
+
- lib/pray/resolve_exports.rb
|
|
151
157
|
- lib/pray/resolve_source.rb
|
|
152
158
|
- lib/pray/resource_limits.rb
|
|
153
159
|
- lib/pray/serve.rb
|
|
@@ -164,6 +170,7 @@ files:
|
|
|
164
170
|
- lib/pray/trust_ops.rb
|
|
165
171
|
- lib/pray/verify.rb
|
|
166
172
|
- lib/pray/verify_position.rb
|
|
173
|
+
- lib/pray/verify_provisioned.rb
|
|
167
174
|
- lib/pray/version.rb
|
|
168
175
|
- pray-cli.gemspec
|
|
169
176
|
homepage: https://pray.kisko.dev
|