Module: ParsePackwerk

Extended by:
T::Sig
Defined in:
lib/parse_packwerk/package.rb,
lib/parse_packwerk.rb,
lib/parse_packwerk/constants.rb,
lib/parse_packwerk/violation.rb,
lib/parse_packwerk/extensions.rb,
lib/parse_packwerk/package_set.rb,
lib/parse_packwerk/package_todo.rb,
lib/parse_packwerk/configuration.rb

Overview

typed: strict

Defined Under Namespace

Classes: Configuration, MissingConfiguration, Package, PackageParseError, PackageSet, PackageTodo, Violation

Constant Summary collapse

ROOT_PACKAGE_NAME =
T.let('.'.freeze, String)
PACKAGE_YML_NAME =
T.let('package.yml'.freeze, String)
PACKWERK_YML_NAME =
T.let('packwerk.yml'.freeze, String)
PACKAGE_TODO_YML_NAME =
T.let('package_todo.yml'.freeze, String)
ENFORCE_DEPENDENCIES =
T.let('enforce_dependencies'.freeze, String)
ENFORCE_PRIVACY =
T.let('enforce_privacy'.freeze, String)
ENFORCE_LAYERS =
T.let('enforce_layers'.freeze, String)
DEPENDENCY_VIOLATION_TYPE =
T.let('dependency'.freeze, String)
PRIVACY_VIOLATION_TYPE =
T.let('privacy'.freeze, String)
PUBLIC_PATH =
T.let('public_path'.freeze, String)
METADATA =
T.let('metadata'.freeze, String)
DEPENDENCIES =
T.let('dependencies'.freeze, String)
MetadataYmlType =

Since this metadata is unstructured YAML, it could be any type. We leave it to clients of ‘ParsePackwerk::Package` to add types based on their known usage of metadata.

T.type_alias do
  T::Hash[T.untyped, T.untyped]
end
DEFAULT_EXCLUDE_GLOBS =
T.let(['{bin,node_modules,script,tmp,vendor}/**/*'], T::Array[String])
DEFAULT_PACKAGE_PATHS =
T.let(['**/'], T::Array[String])
DEFAULT_PUBLIC_PATH =
T.let('app/public', String)

Class Method Summary collapse

Class Method Details

.allObject



37
38
39
# File 'lib/parse_packwerk.rb', line 37

def self.all
  packages_by_name.values
end

.bust_cache!Object



134
135
136
137
# File 'lib/parse_packwerk.rb', line 134

def self.bust_cache!
  @packages_by_name = nil
  @package_from_path = nil
end

.find(name) ⇒ Object



42
43
44
# File 'lib/parse_packwerk.rb', line 42

def self.find(name)
  packages_by_name[name]
end

.key_sort_orderObject



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/parse_packwerk.rb', line 103

def self.key_sort_order
  %w[
    enforce_dependencies
    enforce_privacy
    enforce_visibility
    enforce_layers
    public_path
    owner
    layer
    dependencies
    ignored_dependencies
    visible_to
    metadata
  ]
end

.package_from_path(file_path) ⇒ Object



52
53
54
55
56
57
58
59
60
# File 'lib/parse_packwerk.rb', line 52

def self.package_from_path(file_path)
  path_string = file_path.to_s
  @package_from_path = T.let(@package_from_path, T.nilable(T::Hash[String, Package]))
  @package_from_path ||= {}
  @package_from_path[path_string] ||= T.must(begin
    matching_package = all.find { |package| path_string.start_with?("#{package.name}/") || path_string == package.name }
    matching_package || find(ROOT_PACKAGE_NAME)
  end)
end

.write_package_yml!(package) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/parse_packwerk.rb', line 63

def self.write_package_yml!(package)
  FileUtils.mkdir_p(package.directory)

  File.open(package.yml, 'w') do |file|
    merged_config = package.config

    merged_config.merge!('enforce_dependencies' => package.enforce_dependencies)

    if Extensions.privacy_extension_installed?
      merged_config.merge!('enforce_privacy' => package.enforce_privacy)
    end

    if Extensions.layer_extension_installed?
      merged_config.merge!('enforce_layers' => package.enforce_layers)
    end

    unless package.public_path == DEFAULT_PUBLIC_PATH
      merged_config.merge!('public_path' => package.public_path)
    end

    if package.dependencies.nil? || package.dependencies.none?
      merged_config.delete('dependencies')
    else
      merged_config.merge!('dependencies' => package.dependencies)
    end

    if package..any?
      merged_config.merge!('metadata' => package.)
    end

    sorted_keys = key_sort_order
    merged_config = merged_config.to_a.sort_by { |key, _value| T.unsafe(sorted_keys).index(key) || 1000 }.to_h

    raw_yaml = YAML.dump(merged_config)
    stylized_yaml = raw_yaml.gsub("---\n", '')
    file.write(stylized_yaml)
  end
end

.ymlObject



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

def self.yml
  Configuration.fetch
end