label_weaver 0.0.4 → 0.0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7c9548ad5700605d0b7809e4a1e7d41444728bdfdb31aefa23da2aab812bf250
4
- data.tar.gz: 9eff12ebcc85a52eb4e46768d3a37f72a61eb9087464fcaea50bfdf731918115
3
+ metadata.gz: 6bbe89444ed69fe936e7e64cb7c0e2b36c013df2afef71f1b33ae65a17e67fa3
4
+ data.tar.gz: db4917c239cf6502e3da219f7fe215af11d5fa5dd3668e16b01fad2389c93243
5
5
  SHA512:
6
- metadata.gz: b825c71ab2b865e46af1df187f5f125ee5ec234b900e2f9e9e5df5105410cf2ee013aec6ada2ea306e8aa90362ed562d93259634a71eb4abcec60c7a1a19d00f
7
- data.tar.gz: d04fb881bcc8ff5ad003b6fd2664bee1b0359d920d550754e95db838572857fe2c0b7eb23b20ea57669a224eb1a82b53245bb25411259a322c8aec4f5c334990
6
+ metadata.gz: edb992f4593c2de938debe63bc4ee1f60bf4f308b80e859a82c1fb6e3318f45aca96096c8b0859f33c72e916f61f2bffb5f627af4effae44b4135313490b92f1
7
+ data.tar.gz: 2d51c191608b5070f20f31ef818b26d4d21d67839427655974e8ff55b3911ce41b3a501418e9151bd1d61f8fc1d49393fdaa68f01e225d673687913f8a59f553
data/README.md CHANGED
@@ -7,7 +7,10 @@
7
7
  * [LabelWeaver](#labelweaver)
8
8
  * [Installation](#installation)
9
9
  * [Setting up a new whitelabel project](#setting-up-a-new-whitelabel-project)
10
- * [Developing the whitelabel project](#developing-the-whitelabel-project)
10
+ * [Developing a whitelabel project](#developing-a-whitelabel-project)
11
+ * [Starting local development](#starting-local-development)
12
+ * [Stopping local development](#stopping-local-development)
13
+ * [Diffs](#diffs)
11
14
  * [CI Usage](#ci-usage)
12
15
  <!-- TOC -->
13
16
 
@@ -24,10 +27,39 @@ gem install label_weaver
24
27
 
25
28
  ## Setting up a new whitelabel project
26
29
 
27
-
28
30
  ## Developing a whitelabel project
29
31
 
30
- ### Local Development
32
+ ### Starting local development
33
+
34
+ ```
35
+ label_weaver develop --start
36
+ ```
37
+
38
+ This command will perform the following actions:
39
+
40
+ 1. Run any `before_start` hooks
41
+ 2. Clone or check out the base repository
42
+ 3. Copy all files from the base repository to the whitelabel project that do not already exist
43
+ 4. Merge configured files
44
+ 5. Run any `after_start` hooks
45
+
46
+ Please note that the gem will inform you about files with a newer version in the base repository.
47
+ This could mean that you have to update them in your whitelabel project as well to ensure compatibility.
48
+
49
+ ### Stopping local development
50
+
51
+ ```
52
+ label_weaver develop --stop
53
+ ```
54
+
55
+ This command will perform the following actions:
56
+
57
+ 1. Run any `before_start` hooks
58
+ 2. Restore all files that were automatically created through merging
59
+ 3. Remove all files from the project that do not differ from the base project
60
+ 4. Run any `after_start` hooks
61
+
62
+ You should be left with only the changed files in your repository now.
31
63
 
32
64
  ### Diffs
33
65
 
data/label_weaver.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "label_weaver"
5
- spec.version = "0.0.4"
5
+ spec.version = "0.0.5"
6
6
  spec.authors = ["Stefan Exner"]
7
7
  spec.email = ["stex@stex.codes"]
8
8
  spec.homepage = "https://gitlab.com/lopo-tech/label_weaver"
@@ -23,10 +23,9 @@ module LabelWeaver
23
23
  end
24
24
 
25
25
  Hooks.new.run(:develop, :before_start)
26
-
27
26
  repo.clone_or_update
28
27
  copy_repository_files
29
-
28
+ handle_file_merges
30
29
  Hooks.new.run(:develop, :after_start)
31
30
  end
32
31
 
@@ -53,6 +52,15 @@ module LabelWeaver
53
52
  end
54
53
  end
55
54
 
55
+ def handle_file_merges
56
+ merger = ::LabelWeaver::Merger.new(project_root_dir: context.project_root_dir, repo:)
57
+ if merger.present?
58
+ logger.info "Merging files..."
59
+
60
+ merger.merge!
61
+ end
62
+ end
63
+
56
64
  def repo
57
65
  @repo ||= LabelWeaver::TempRepo.new(
58
66
  context.repository_dir,
@@ -23,6 +23,7 @@ module LabelWeaver
23
23
  end
24
24
 
25
25
  Hooks.new.run(:develop, :before_stop)
26
+ restore_merged_files
26
27
  remove_base_files
27
28
  Hooks.new.run(:develop, :after_stop)
28
29
  end
@@ -37,9 +38,8 @@ module LabelWeaver
37
38
  project_file = context.project_root_dir + relative_filename
38
39
 
39
40
  if project_file.exist?
40
- # TODO: Should we get a time component in here to check for possible newer base repo files?
41
41
  if digest(project_file) != digest(repository_file)
42
- logger.info "File '#{relative_filename}' is kept as it was changed in the whitelabel project (r: #{repo.timestamp_for(repository_file)} vs w: #{project_file.mtime})."
42
+ logger.debug "File '#{relative_filename}' is kept as it was changed in the whitelabel project (r: #{repo.timestamp_for(repository_file)} vs w: #{project_file.mtime})."
43
43
  else
44
44
  logger.debug "Deleting file '#{relative_filename}'..."
45
45
  project_file.unlink
@@ -59,6 +59,15 @@ module LabelWeaver
59
59
  remove_empty_tree(dir.parent)
60
60
  end
61
61
 
62
+ def restore_merged_files
63
+ merger = ::LabelWeaver::Merger.new(project_root_dir: context.project_root_dir, repo:)
64
+ if merger.present?
65
+ logger.info "Restoring merged files..."
66
+
67
+ merger.restore!
68
+ end
69
+ end
70
+
62
71
  def digest(file)
63
72
  Digest::SHA1.file(file).hexdigest
64
73
  end
@@ -18,6 +18,7 @@ module LabelWeaver
18
18
  optional(:after_stop).array(:string)
19
19
  end
20
20
  end
21
+ optional(:merges).array(:hash)
21
22
  end
22
23
  end
23
24
  end
@@ -9,6 +9,15 @@ hooks:
9
9
  develop:
10
10
  after_start:
11
11
  - echo "Development Mode Started"
12
+
13
+ # Define files from the base and whitelabel projects that should be merged into
14
+ # a new or existing file.
15
+ # Currently supported formats are JSON and YAML
16
+ #merges:
17
+ # - source_file: package.json
18
+ # target_file: package.json
19
+ # overrides_file: package.whitelabel.json
20
+
12
21
  # Files here will be appended on whitelabel development instead of being skipped if the
13
22
  # file already exists in a project
14
23
  #append:
@@ -6,9 +6,10 @@ module LabelWeaver
6
6
  Model = Data.define(
7
7
  :excludes,
8
8
  :git,
9
- :hooks
9
+ :hooks,
10
+ :merges
10
11
  ) do
11
- def initialize(git:, hooks: {}, excludes: [])
12
+ def initialize(git:, hooks: {}, excludes: [], merges: [])
12
13
  super
13
14
  end
14
15
  end
@@ -0,0 +1,77 @@
1
+ module LabelWeaver
2
+ class Merger
3
+ include Import[:configuration, :logger]
4
+
5
+ attr_reader :project_root_dir, :repo
6
+
7
+ def initialize(project_root_dir:, repo:, configuration: nil, logger: nil)
8
+ @configuration = configuration
9
+ @logger = logger
10
+ @project_root_dir = project_root_dir
11
+ @repo = repo
12
+ end
13
+
14
+ def present?
15
+ merge_entries.any?
16
+ end
17
+
18
+ def merge!
19
+ merge_entries.each do |entry|
20
+ entry => {source_file:, target_file:, overrides_file:}
21
+ logger.debug "Merging '#{overrides_file}' and '#{source_file}' into '#{target_file}'..."
22
+
23
+ merge_file(project_root_dir + source_file, project_root_dir + target_file, project_root_dir + overrides_file)
24
+ end
25
+ end
26
+
27
+ def restore!
28
+ merge_entries.each do |entry|
29
+ logger.debug "Restoring '#{entry[:target_file]}'..."
30
+
31
+ restore_file(entry[:target_file])
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def merge_file(source_file, target_file, overrides_file)
38
+ source = load_file(source_file)
39
+ overrides = load_file(overrides_file)
40
+
41
+ write_file(target_file, source.deep_merge(overrides))
42
+ end
43
+
44
+ def restore_file(relative_file_path)
45
+ repository_file = repo.root_path + relative_file_path
46
+ project_file = project_root_dir + relative_file_path
47
+
48
+ FileUtils.cp(repository_file, project_file, preserve: true)
49
+ end
50
+
51
+ def merge_entries
52
+ configuration.merges.map { _1.transform_keys(&:to_sym) }
53
+ end
54
+
55
+ def load_file(file)
56
+ case file.extname
57
+ when ".yaml", ".yml"
58
+ YAML.load_file(file)
59
+ when ".json"
60
+ JSON.parse(File.read(file))
61
+ else
62
+ raise ArgumentError, "Unsupported file type: #{file.extname}"
63
+ end
64
+ end
65
+
66
+ def write_file(file, content)
67
+ case file.extname
68
+ when ".yaml", ".yml"
69
+ File.write(file, content.to_yaml)
70
+ when ".json"
71
+ File.write(file, JSON.pretty_generate(content))
72
+ else
73
+ raise ArgumentError, "Unsupported file type: #{file.extname}"
74
+ end
75
+ end
76
+ end
77
+ end
@@ -17,6 +17,8 @@ module LabelWeaver
17
17
  @logger = logger
18
18
  end
19
19
 
20
+ alias_method :root_path, :repository_path
21
+
20
22
  #
21
23
  # @return [Time] the last time the file was part of a commit, closest we can get to an mtime
22
24
  #
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: label_weaver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Exner
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-09-12 00:00:00.000000000 Z
11
+ date: 2024-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cogger
@@ -220,6 +220,7 @@ files:
220
220
  - lib/label_weaver/container.rb
221
221
  - lib/label_weaver/hooks.rb
222
222
  - lib/label_weaver/import.rb
223
+ - lib/label_weaver/merger.rb
223
224
  - lib/label_weaver/temp_repo.rb
224
225
  homepage: https://gitlab.com/lopo-tech/label_weaver
225
226
  licenses: