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.
@@ -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
@@ -165,6 +165,8 @@ module Pray
165
165
  )
166
166
  end
167
167
 
168
+ VerifyProvisioned.push_findings(project, report)
169
+
168
170
  [report, rendered_targets, fresh_targets]
169
171
  end
170
172
 
@@ -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
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pray
4
- VERSION = "1.9.2"
5
- GENERATED_BY = "pray 1.9.2"
4
+ VERSION = "1.10.0"
5
+ GENERATED_BY = "pray 1.10.0"
6
6
  end
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.9.2
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