carthage_cache 0.3.1 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b9e4c0f89e316c523b4c0b7c779550416c3aa3d1
4
- data.tar.gz: 27bb06a646fbc19798a251464bb15e2afd3939d6
3
+ metadata.gz: d298e36ed76a7ba934367dd437ccd25f370bb66e
4
+ data.tar.gz: e21ad383a1a9ce54a9faf6271e495def4cdc9a4e
5
5
  SHA512:
6
- metadata.gz: e73634ee8da48c3809cce1e81c72a53f95fe92bb85f5aff51127b16690bde6fff50c5b12665e65a44d674e51f4d698c0873a4b5935ef6bc3bd21249c5e5f7a6a
7
- data.tar.gz: dcfb6577a53c9ec84c88456e52e6ac109cf8c5b6fd4e6d9b624cd844e0c3c373064e3c4b680aa06badbd770ae13e722e6cfefaa4b50fbe0d413bcceca5605778
6
+ metadata.gz: 8deda74fee8bcdc4e87814419324c575d3af920abca7861a7125af4a0d27df255b474a09dd42d4569f7b1becac0639077e111738205bd431875068cc1481be35
7
+ data.tar.gz: 5911f2d074383b5cf017b3812dde21427977613f14900f7c97ae09bc9847c0a858685667928fe0b3140c5d6c1ad35923c5d187b37cf459a8ee11f1e1b60a2853
data/README.md CHANGED
@@ -107,6 +107,38 @@ If you want to check whether a cache exists for the current `Carfile.resolved`
107
107
  carthage_cache exist
108
108
  ```
109
109
 
110
+ If you want to publish an archive that already exists
111
+
112
+ ```
113
+ carthage_cache publish --force
114
+ ```
115
+
116
+ If you want to delete unused libraries from build directory for all targets
117
+
118
+ ```
119
+ carthage_cache prune
120
+ ```
121
+
122
+ You can also prune the build directory before publishing a new archive
123
+
124
+ ```
125
+ carthage_cache publish --prune-build-directory
126
+ ```
127
+
128
+ Both `prune` and `publish` accept `--prune-white-list` to configure frameworks that don't appear in the `Cartfile.resolved` and should not be pruned by associating them with a framework that does appear in `Cartfile.resolved`. Like `CocoaLumberjackSwift`:
129
+
130
+ ```
131
+ carthage_cache publish -p -w .white-list.yml
132
+ ```
133
+ * *`-p` is the short version of `--prune-build-directory`*
134
+ * *`-w` is the short version of `--prune-white-list`*
135
+
136
+ where `.white-list.yml` is
137
+
138
+ ```yaml
139
+ "CocoaLumberjackSwift": "CocoaLumberjack"
140
+ ```
141
+
110
142
  For more information run the help command
111
143
 
112
144
  ```
@@ -53,10 +53,12 @@ command :publish do |c|
53
53
  c.syntax = "#{PROGRAM_NAME} publish [PROJECT_PATH]"
54
54
  c.description = 'Generates and uploads the cache archive for the current Cartfile.resolved.'
55
55
  c.option '-f', '--force', 'Forces to create a new archive even if an archive already exist.'
56
+ c.option '-p', '--prune-build-directory', 'Removes unused frameworks from build directory.'
57
+ c.option '-w', '--prune-white-list PRUNE_WHITE_LIST', String, 'Path to a YAML file containing the prune white list.'
56
58
  c.action do |args, options|
57
- options.default force: false
59
+ options.default force: false, prune: false
58
60
  app = CarthageCache::Application.new(args.first || ".", verbose, config)
59
- app.create_archive(options.force)
61
+ app.create_archive(options.force, options.prune, options.prune_white_list)
60
62
  end
61
63
  end
62
64
 
@@ -64,9 +66,21 @@ command :config do |c|
64
66
  c.syntax = "#{PROGRAM_NAME} config [PROJECT_PATH]"
65
67
  c.description = "Generates a '#{CarthageCache::Configurator::CONFIG_FILE_NAME}' config file."
66
68
  c.action do |args, options|
67
- configurator = CarthageCache::Configurator.new(args.first || ".")
69
+ terminal = CarthageCache::Terminal.new(verbose)
70
+ configurator = CarthageCache::Configurator.new(terminal, args.first || ".")
68
71
  wizard = CarthageCache::ConfiguratorWizard.new(method(:ask), method(:password))
69
72
  config = wizard.start
70
73
  configurator.save_config(config)
71
74
  end
72
75
  end
76
+
77
+ command :prune do |c|
78
+ c.syntax = "#{PROGRAM_NAME} prune [PROJECT_PATH]"
79
+ c.description = 'Removes unused frameworks from build directory.'
80
+ c.option '-w', '--prune-white-list PRUNE_WHITE_LIST', String, 'Path to a YAML file containing the prune white list.'
81
+ c.action do |args, options|
82
+ options.default force: false, prune: false
83
+ app = CarthageCache::Application.new(args.first || ".", verbose, config)
84
+ app.prune_build_directory(options.prune_white_list)
85
+ end
86
+ end
@@ -7,12 +7,14 @@ require "carthage_cache/carthage_resolved_file"
7
7
  require "carthage_cache/project"
8
8
  require "carthage_cache/repository"
9
9
  require "carthage_cache/terminal"
10
+ require "carthage_cache/configuration_validator"
10
11
  require "carthage_cache/configuration"
11
12
  require "carthage_cache/configurator"
12
13
  require "carthage_cache/configurator_wizard"
13
14
  require "carthage_cache/shell_command_executor.rb"
14
15
  require "carthage_cache/application.rb"
15
16
  require "carthage_cache/swift_version_resolver.rb"
17
+ require "carthage_cache/build_collector.rb"
16
18
 
17
19
  module CarthageCache
18
20
 
@@ -1,3 +1,5 @@
1
+ require 'yaml'
2
+
1
3
  module CarthageCache
2
4
 
3
5
  class Application
@@ -13,7 +15,7 @@ module CarthageCache
13
15
  def initialize(project_path, verbose, config, repository: Repository, terminal: Terminal, swift_version_resolver: SwiftVersionResolver)
14
16
  @terminal = terminal.new(verbose)
15
17
  @archiver = Archiver.new
16
- @config = Configurator.new(project_path, config).config
18
+ @config = Configurator.new(@terminal, project_path, config).config
17
19
  @repository = repository.new(@config.bucket_name, @config.hash_object[:aws_s3_client_options])
18
20
  @project = Project.new(project_path, CACHE_DIR_NAME, @terminal, @config.tmpdir, swift_version_resolver.new)
19
21
  end
@@ -32,8 +34,22 @@ module CarthageCache
32
34
  end
33
35
  end
34
36
 
35
- def create_archive(force = false)
36
- archive_builder.build if force || !archive_exist?
37
+ def create_archive(force = false, prune = false, prune_white_list = nil)
38
+ if force || !archive_exist?
39
+ prune_build_directory(prune_white_list) if prune
40
+ archive_builder.build
41
+ end
42
+ end
43
+
44
+ def prune_build_directory(white_list)
45
+ if white_list && File.exist?(white_list)
46
+ terminal.vputs "Prunning build directory with white list '#{white_list}' ..."
47
+ white_list = YAML.load(File.read(white_list))
48
+ else
49
+ white_list = {}
50
+ terminal.vputs "Prunning build directory ..."
51
+ end
52
+ build_collector.delete_unused_frameworks(white_list)
37
53
  end
38
54
 
39
55
  private
@@ -46,6 +62,10 @@ module CarthageCache
46
62
  @archive_builder ||= ArchiveBuilder.new(terminal, repository, archiver, project)
47
63
  end
48
64
 
65
+ def build_collector
66
+ @build_collector ||= BuildCollector.new(terminal, project.carthage_build_directory, project.all_frameworks)
67
+ end
68
+
49
69
  end
50
70
 
51
71
  end
@@ -0,0 +1,50 @@
1
+ require 'fileutils'
2
+
3
+ module CarthageCache
4
+
5
+ class BuildCollector
6
+
7
+ attr_reader :terminal
8
+ attr_reader :build_directory
9
+ attr_reader :required_frameworks
10
+
11
+ def initialize(terminal, build_directory, required_frameworks)
12
+ @terminal = terminal
13
+ @build_directory = build_directory
14
+ @required_frameworks = Set.new(required_frameworks)
15
+ end
16
+
17
+ def delete_unused_frameworks(white_list = {})
18
+ terminal.vputs "Deleting unused frameworks from '#{build_directory}' ..."
19
+ list_built_frameworks.each do |framework_path|
20
+ if delete_framework?(framework_path, white_list)
21
+ terminal.vputs "Deleting '#{framework_path}' because is not longer needed."
22
+ FileUtils.rm_r(framework_path)
23
+ FileUtils.rm_r("#{framework_path}.dSYM")
24
+ # TODO delete corresponding .bcsymbolmap file
25
+ end
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def delete_framework?(framework_path, white_list)
32
+ framework = framework_name(framework_path)
33
+ if required_frameworks.include?(white_list[framework])
34
+ false
35
+ else
36
+ ! required_frameworks.include?(framework)
37
+ end
38
+ end
39
+
40
+ def list_built_frameworks
41
+ Dir[File.join(build_directory, "/**/*.framework")]
42
+ end
43
+
44
+ def framework_name(framework_path)
45
+ Pathname.new(framework_path).basename(".framework").to_s
46
+ end
47
+
48
+ end
49
+
50
+ end
@@ -5,14 +5,17 @@ module CarthageCache
5
5
  class CartfileResolvedFile
6
6
 
7
7
  attr_reader :file_path
8
+ attr_reader :terminal
9
+ attr_reader :swift_version_resolver
8
10
 
9
- def initialize(file_path, swift_version_resolver = SwiftVersionResolver.new)
11
+ def initialize(file_path, terminal, swift_version_resolver = SwiftVersionResolver.new)
10
12
  @file_path = file_path
11
13
  @swift_version_resolver = swift_version_resolver
14
+ @terminal = terminal
12
15
  end
13
16
 
14
17
  def digest
15
- @digest ||= Digest::SHA256.hexdigest(content + "#{swift_version}")
18
+ @digest ||= generate_digest
16
19
  end
17
20
 
18
21
  def content
@@ -20,9 +23,27 @@ module CarthageCache
20
23
  end
21
24
 
22
25
  def swift_version
23
- @swift_version ||= @swift_version_resolver.swift_version
26
+ @swift_version ||= swift_version_resolver.swift_version
24
27
  end
25
28
 
29
+ def frameworks
30
+ @frameworks ||= content.each_line.map { |line| extract_framework_name(line) }
31
+ end
32
+
33
+ private
34
+
35
+ def generate_digest
36
+ terminal.vputs "Generating carthage_cache archive digest using swift version '#{swift_version}' and " \
37
+ "the content of '#{file_path}'"
38
+ generated_digest = Digest::SHA256.hexdigest(content + "#{swift_version}")
39
+ terminal.vputs "Generated digest: #{generated_digest}"
40
+ generated_digest
41
+ end
42
+
43
+ def extract_framework_name(cartfile_line)
44
+ cartfile_line.split(" ")[1].split("/").last.gsub('"', "")
45
+ end
46
+
26
47
  end
27
48
 
28
49
  end
@@ -13,17 +13,11 @@ module CarthageCache
13
13
  end
14
14
 
15
15
  def self.valid?(config)
16
- config[:bucket_name] &&
17
- config.has_key?(:aws_s3_client_options) &&
18
- config[:aws_s3_client_options][:region] &&
19
- config[:aws_s3_client_options][:access_key_id] &&
20
- config[:aws_s3_client_options][:secret_access_key]
16
+ ConfigurationValidator.new(config).valid?
21
17
  end
22
18
 
23
19
  def self.parse(str)
24
- config = YAML.load(str)
25
- raise "Invalid configuration" unless valid?(config)
26
- new(config)
20
+ new(YAML.load(str))
27
21
  end
28
22
 
29
23
  def self.default
@@ -54,7 +48,7 @@ module CarthageCache
54
48
  end
55
49
 
56
50
  def valid?
57
- self.class.valid?(hash_object)
51
+ self.class.valid?(self)
58
52
  end
59
53
 
60
54
  def merge(c)
@@ -0,0 +1,116 @@
1
+ module CarthageCache
2
+
3
+ class MissingConfigurationKey < Struct.new(:keyname, :solution)
4
+
5
+ def self.missing_bucket_name
6
+ solution = "You need to specify the AWS S3 bucket to be used.\n" \
7
+ "You can either pass the '--bucket-name' option or " \
8
+ " add ':bucket_name: YOUR_BUCKET_NAME' to " \
9
+ ".carthage_cache.yml file.\nYou can also run " \
10
+ "'carthage_cache config' to generate the config file."
11
+ self.new(:bucket_name, solution)
12
+ end
13
+
14
+ def self.missing_aws_key(keyname, name)
15
+ solution = "You need to specify the AWS #{name} to be used.\n" \
16
+ "You can either define a enviromental variable " \
17
+ "AWS_REGION or add ':#{keyname}: YOUR_KEY_VALUE' " \
18
+ "under the :aws_s3_client_options: key in the " \
19
+ ".carthage_cache.yml file.\nYou can also run " \
20
+ "'carthage_cache config' to generate the config file."
21
+ self.new("aws_s3_client_options.#{keyname}", solution)
22
+ end
23
+
24
+ def self.missing_aws_region
25
+ missing_aws_key("region", "region")
26
+ end
27
+
28
+ def self.missing_aws_access_key_id
29
+ missing_aws_key("access_key_id", "access key ID")
30
+ end
31
+
32
+ def self.missing_aws_secret_access_key
33
+ missing_aws_key("secret_access_key", "secret access key")
34
+ end
35
+
36
+ end
37
+
38
+ class ValidationResult
39
+
40
+ def self.valid
41
+ self.new(nil)
42
+ end
43
+
44
+ def self.invalid(error)
45
+ self.new(error)
46
+ end
47
+
48
+ attr_reader :error
49
+
50
+ def initialize(error)
51
+ @error = error
52
+ end
53
+
54
+ def valid?
55
+ @error == nil
56
+ end
57
+
58
+ end
59
+
60
+ class ConfigurationValidator
61
+
62
+ attr_reader :config
63
+
64
+ def initialize(config)
65
+ @config = config
66
+ end
67
+
68
+ def valid?
69
+ validate.valid?
70
+ end
71
+
72
+ def validate
73
+ return missing_bucket_name unless has_bucket_name?
74
+ return missing_aws_region unless has_aws_region?
75
+ return missing_aws_access_key_id unless has_aws_access_key_id?
76
+ return missing_aws_secret_access_key unless has_aws_secret_access_key?
77
+ ValidationResult.valid
78
+ end
79
+
80
+ private
81
+
82
+ def has_bucket_name?
83
+ config.bucket_name
84
+ end
85
+
86
+ def has_aws_region?
87
+ config.aws_region
88
+ end
89
+
90
+ def has_aws_access_key_id?
91
+ config.aws_access_key_id
92
+ end
93
+
94
+ def has_aws_secret_access_key?
95
+ config.aws_secret_access_key
96
+ end
97
+
98
+ def missing_bucket_name
99
+ ValidationResult.invalid(MissingConfigurationKey.missing_bucket_name)
100
+ end
101
+
102
+ def missing_aws_region
103
+ ValidationResult.invalid(MissingConfigurationKey.missing_aws_region)
104
+ end
105
+
106
+ def missing_aws_access_key_id
107
+ ValidationResult.invalid(MissingConfigurationKey.missing_aws_access_key_id)
108
+ end
109
+
110
+ def missing_aws_secret_access_key
111
+ ValidationResult.invalid(MissingConfigurationKey.missing_aws_secret_access_key)
112
+ end
113
+
114
+ end
115
+
116
+ end
@@ -8,14 +8,16 @@ module CarthageCache
8
8
 
9
9
  attr_reader :config_file_path
10
10
  attr_reader :base_config
11
+ attr_reader :terminal
11
12
 
12
- def initialize(project_path, base_config = {})
13
+ def initialize(terminal, project_path, base_config = {})
13
14
  @config_file_path = File.join(project_path, CONFIG_FILE_NAME)
14
15
  @base_config = merge_config(base_config)
16
+ @terminal = terminal
15
17
  end
16
18
 
17
19
  def config
18
- @config ||= load_config
20
+ @config ||= load_config!
19
21
  end
20
22
 
21
23
  def save_config(config)
@@ -29,15 +31,30 @@ module CarthageCache
29
31
  File.exist?(config_file_path)
30
32
  end
31
33
 
34
+ def load_config!
35
+ config = load_config
36
+ validate!(config)
37
+ config
38
+ end
39
+
32
40
  def load_config
33
41
  if config_file_exist?
34
42
  config = Configuration.parse(File.read(config_file_path))
35
- config.merge(base_config)
43
+ config = config.merge(base_config)
36
44
  else
37
45
  base_config
38
46
  end
39
47
  end
40
48
 
49
+ def validate!(config)
50
+ validator = ConfigurationValidator.new(config)
51
+ result = validator.validate
52
+ unless result.valid?
53
+ terminal.error "error: #{result.error.solution}"
54
+ exit 1
55
+ end
56
+ end
57
+
41
58
  def remove_nil_keys(hash)
42
59
  hash.inject({}) do |new_hash, (k,v)|
43
60
  unless v.nil? || (v.respond_to?(:empty?) && v.empty?)
@@ -13,7 +13,7 @@ module CarthageCache
13
13
  @cache_dir_name = cache_dir_name
14
14
  @terminal = terminal
15
15
  @tmpdir_base_path = tmpdir
16
- @cartfile = CartfileResolvedFile.new(cartfile_resolved_path, swift_version_resolver)
16
+ @cartfile = CartfileResolvedFile.new(cartfile_resolved_path, terminal, swift_version_resolver)
17
17
  end
18
18
 
19
19
  def archive_filename
@@ -32,6 +32,10 @@ module CarthageCache
32
32
  @carthage_build_directory ||= File.join(project_path, "Carthage", "Build")
33
33
  end
34
34
 
35
+ def all_frameworks
36
+ cartfile.frameworks
37
+ end
38
+
35
39
  private
36
40
 
37
41
  def cartfile_resolved_path
@@ -16,6 +16,10 @@ module CarthageCache
16
16
  puts(message) if verbose
17
17
  end
18
18
 
19
+ def error(message)
20
+ STDERR.puts(message)
21
+ end
22
+
19
23
  end
20
24
 
21
25
  end
@@ -1,3 +1,3 @@
1
1
  module CarthageCache
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: carthage_cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Guido Marucci Blas
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-26 00:00:00.000000000 Z
11
+ date: 2016-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -137,8 +137,10 @@ files:
137
137
  - lib/carthage_cache/archive_builder.rb
138
138
  - lib/carthage_cache/archive_installer.rb
139
139
  - lib/carthage_cache/archiver.rb
140
+ - lib/carthage_cache/build_collector.rb
140
141
  - lib/carthage_cache/carthage_resolved_file.rb
141
142
  - lib/carthage_cache/configuration.rb
143
+ - lib/carthage_cache/configuration_validator.rb
142
144
  - lib/carthage_cache/configurator.rb
143
145
  - lib/carthage_cache/configurator_wizard.rb
144
146
  - lib/carthage_cache/description.rb