xcres 0.4.1 → 0.4.2

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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +2 -4
  3. data/README.md +6 -1
  4. data/lib/xcres/analyzer/analyzer.rb +1 -1
  5. data/lib/xcres/analyzer/resources_analyzer/base_resources_analyzer.rb +13 -6
  6. data/lib/xcres/analyzer/resources_analyzer/bundle_resources_analyzer.rb +4 -9
  7. data/lib/xcres/analyzer/resources_analyzer/loose_resources_analyzer.rb +4 -5
  8. data/lib/xcres/analyzer/resources_analyzer/xcassets_analyzer.rb +7 -11
  9. data/lib/xcres/builder/file_builder.rb +1 -1
  10. data/lib/xcres/command/install_command.rb +4 -3
  11. data/lib/xcres/command/project_command.rb +21 -8
  12. data/lib/xcres/model/xcassets/bundle.rb +1 -1
  13. data/lib/xcres/version.rb +1 -1
  14. data/spec/fixtures/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +5 -0
  15. data/spec/fixtures/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/Contents.json +23 -0
  16. data/spec/fixtures/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat.jpg +0 -0
  17. data/spec/fixtures/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@2x.jpg +0 -0
  18. data/spec/fixtures/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@3x.jpg +0 -0
  19. data/spec/fixtures/Example/Example/Images.xcassets/Doge.imageset/Contents.json +4 -0
  20. data/spec/integration.rb +1 -0
  21. data/spec/integration/build-keyword-clash/after/R.h +0 -2
  22. data/spec/integration/build-keyword-clash/after/R.m +0 -2
  23. data/spec/integration/build/after/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +5 -0
  24. data/spec/integration/build/after/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/Contents.json +23 -0
  25. data/spec/integration/build/after/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat.jpg +0 -0
  26. data/spec/integration/build/after/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@2x.jpg +0 -0
  27. data/spec/integration/build/after/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@3x.jpg +0 -0
  28. data/spec/integration/build/after/Example/Example/Images.xcassets/Doge.imageset/Contents.json +4 -0
  29. data/spec/integration/build/after/R.h +2 -0
  30. data/spec/integration/build/after/R.m +1 -0
  31. data/spec/integration/build/after/execution_output.txt +2 -2
  32. data/spec/integration/build/before/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +5 -0
  33. data/spec/integration/build/before/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/Contents.json +23 -0
  34. data/spec/integration/build/before/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat.jpg +0 -0
  35. data/spec/integration/build/before/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@2x.jpg +0 -0
  36. data/spec/integration/build/before/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@3x.jpg +0 -0
  37. data/spec/integration/build/before/Example/Example/Images.xcassets/Doge.imageset/Contents.json +4 -0
  38. data/spec/integration/install-again/after/Example/Example.xcodeproj.yaml +1 -1
  39. data/spec/integration/install-moved-supporting-files/after/Example/Example.xcodeproj.yaml +1 -1
  40. data/spec/integration/install-moved-supporting-files/after/execution_output.txt +2 -2
  41. data/spec/integration/install-no-supporting-files/after/Example/Example.xcodeproj.yaml +1 -1
  42. data/spec/integration/install-no-supporting-files/after/execution_output.txt +3 -3
  43. data/spec/integration/install/after/Example/Example.xcodeproj.yaml +1 -1
  44. data/spec/integration/install/after/execution_output.txt +1 -1
  45. data/spec/integration/version/after/execution_output.txt +1 -1
  46. data/spec/spec_helper/xcodeproj_project_yaml.rb +15 -0
  47. data/spec/unit/analyzer/resources_analyzer/base_resources_analyzer_spec.rb +41 -8
  48. data/spec/unit/analyzer/resources_analyzer/bundle_resources_analyzer_spec.rb +2 -2
  49. data/spec/unit/model/xcassets/bundle_spec.rb +32 -17
  50. data/spec/unit/model/xcassets/resource_spec.rb +6 -1
  51. metadata +26 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 80b04c8fed347600827fbc19c5e653a9712f34ab
4
- data.tar.gz: 60548aca09f900ee073773231edbd6cfce51a846
3
+ metadata.gz: 582ff4713e27360dad8eac366f7fb972e631696f
4
+ data.tar.gz: 95e46087ebe01b670c0cc4b03493e87963146b17
5
5
  SHA512:
6
- metadata.gz: 032d1b4d09124dd1cecf1c587a8579bacc57e43aa051f68ea9a14300abd5426dddab95e075d9f83caa969aabed65969c25bb2057f2f332af5ed407f6aaec4346
7
- data.tar.gz: d821c4b06474126ec9ca3bf0826b516ccc2143d9b6d42a6ba377229d8656c5218dd9ff553e99bf7ea40cd402e09e2a5e16c3070cf538abb55e9f84c345d10c4a
6
+ metadata.gz: 65b834e686b1f356abced830e74608fac622bc6c0d744ab7da13e8ce3592c18c42968c980b32d155f4bdd890a17ed10f301f4ad393e4a2c336e4d5cbab02d22e
7
+ data.tar.gz: dfa1cc9951f35286e886179f80f5560bcf8ce3c6cda38e287103209353418b30822ddeba41cfb7339237b92a8a866948e84f95c0182bf859e37e5514beca0162
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- xcres (0.4.1)
4
+ xcres (0.4.2)
5
5
  activesupport (>= 3.2.15, < 4)
6
6
  clamp (~> 0.6.3)
7
7
  colored (~> 1.2)
@@ -11,7 +11,6 @@ PATH
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- CFPropertyList (2.2.8)
15
14
  activesupport (3.2.19)
16
15
  i18n (~> 0.6, >= 0.6.4)
17
16
  multi_json (~> 1.0)
@@ -62,8 +61,7 @@ GEM
62
61
  term-ansicolor (1.3.0)
63
62
  tins (~> 1.0)
64
63
  tins (1.3.2)
65
- xcodeproj (0.18.0)
66
- CFPropertyList (~> 2.2)
64
+ xcodeproj (0.19.4)
67
65
  activesupport (~> 3.0)
68
66
  colored (~> 1.2)
69
67
  yard (0.8.7.4)
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # xcres
1
+ # <center>![xcres](/../assets/xcres_banner.png?raw=true)</center>
2
2
 
3
3
  [![Twitter: @mrackwitz](https://img.shields.io/badge/contact-@mrackwitz-blue.svg?style=flat)](https://twitter.com/mrackwitz)
4
4
  [![Gem](https://img.shields.io/gem/v/xcres.svg?style=flat)](http://rubygems.org/gems/xcres)
@@ -176,6 +176,11 @@ also warn you about those. It can be a help, if you want to migrate
176
176
  your project to non-natural language keys.
177
177
 
178
178
 
179
+ ## Credits
180
+
181
+ The logo was designed by [@kuchengnom](https://github.com/kuchengnom).
182
+
183
+
179
184
  ## License
180
185
 
181
186
  xcres is available under MIT License.
@@ -53,7 +53,7 @@ module XCRes
53
53
  # the built sections
54
54
  #
55
55
  def analyze
56
- # Empty stub implementation
56
+ @sections = @sections.compact.reject { |s| s.items.nil? || s.items.empty? }
57
57
  end
58
58
 
59
59
  # Return the Xcode project to analyze
@@ -79,20 +79,27 @@ module XCRes
79
79
  #
80
80
  # @param [Hash] options
81
81
  # valid options are:
82
- # * [Bool] :use_basename?
83
- # if set, it will only use the basename of the path for the key
82
+ # * [Array<Symbol>] :use_basename
83
+ # can contain :key and :path
84
84
  #
85
85
  # @return [Hash{String => Pathname}]
86
86
  #
87
87
  def build_section_data file_paths, options={}
88
- options = { use_basename?: false }.merge options
88
+ options = {
89
+ use_basename: [],
90
+ path_without_ext: false,
91
+ }.merge options
89
92
 
90
93
  # Transform image file paths to keys
91
94
  keys_to_paths = {}
92
95
  for path in file_paths
93
- path = options[:use_basename?] ? File.basename(path) : path.to_s
94
- key = key_from_path(path)
95
- keys_to_paths[key] = path
96
+ basename = File.basename(path)
97
+ key = key_from_path(options[:use_basename].include?(:key) ? basename : path.to_s)
98
+ transformed_path = options[:use_basename].include?(:path) ? basename : path
99
+ if options[:path_without_ext]
100
+ transformed_path = transformed_path.to_s.sub /#{File.extname(path)}$/, ''
101
+ end
102
+ keys_to_paths[key] = transformed_path.to_s
96
103
  end
97
104
 
98
105
  keys_to_paths
@@ -9,7 +9,8 @@ module XCRes
9
9
  class BundleResourcesAnalyzer < BaseResourcesAnalyzer
10
10
 
11
11
  def analyze
12
- @sections = build_sections_for_bundles.compact
12
+ @sections = build_sections_for_bundles
13
+ super
13
14
  end
14
15
 
15
16
  # Build a section for each bundle if it contains any resources
@@ -42,7 +43,7 @@ module XCRes
42
43
  # @param [PBXFileReference] bundle_file_ref
43
44
  # the file reference to the resources bundle file
44
45
  #
45
- # @return [Section?]
46
+ # @return [Section]
46
47
  # a section or nil
47
48
  #
48
49
  def build_section_for_bundle bundle_file_ref
@@ -51,14 +52,8 @@ module XCRes
51
52
 
52
53
  log "Found bundle %s with #%s image files of #%s total files.", bundle_file_ref.path, image_files.count, bundle_files.count
53
54
 
54
- return nil if image_files.empty?
55
-
56
- section_data = build_images_section_data(image_files)
57
-
58
- return nil if section_data.empty?
59
-
60
55
  section_name = basename_without_ext(bundle_file_ref.path)
61
-
56
+ section_data = build_images_section_data(image_files)
62
57
  new_section(section_name, section_data)
63
58
  end
64
59
 
@@ -10,7 +10,8 @@ module XCRes
10
10
  class LooseResourcesAnalyzer < BaseResourcesAnalyzer
11
11
 
12
12
  def analyze
13
- @sections = [build_section_for_loose_images].compact
13
+ @sections = [build_section_for_loose_images]
14
+ super
14
15
  end
15
16
 
16
17
  def exclude_file_patterns
@@ -19,16 +20,14 @@ module XCRes
19
20
 
20
21
  # Build a section for loose image resources in the project
21
22
  #
22
- # @return [Section?]
23
+ # @return [Section]
23
24
  #
24
25
  def build_section_for_loose_images
25
26
  image_files = find_image_files(resources_files.map(&:path))
26
27
 
27
28
  log "Found #%s image files in project.", image_files.count
28
29
 
29
- return nil if image_files.empty?
30
-
31
- data = build_images_section_data(image_files, use_basename?: true)
30
+ data = build_images_section_data(image_files, use_basename: [:key, :path])
32
31
 
33
32
  new_section('Images', data)
34
33
  end
@@ -10,9 +10,8 @@ module XCRes
10
10
  class XCAssetsAnalyzer < BaseResourcesAnalyzer
11
11
 
12
12
  def analyze
13
- sections = []
14
- sections += build_sections_for_xcassets
15
- @sections = sections.compact
13
+ @sections = build_sections_for_xcassets
14
+ super
16
15
  end
17
16
 
18
17
  # Build a section for each asset catalog if it contains any resources
@@ -38,21 +37,18 @@ module XCRes
38
37
  # @param [XCAssets::Bundle] xcassets_bundle
39
38
  # the file reference to the resources bundle file
40
39
  #
41
- # @return [Section?]
40
+ # @return [Section]
42
41
  # a section or nil
43
42
  #
44
43
  def build_section_for_xcassets bundle
45
44
  log "Found asset catalog %s with #%s image files.",
46
45
  bundle.path.basename, bundle.resources.count
47
46
 
48
- return nil if bundle.resources.empty?
49
-
50
- section_data = build_images_section_data(bundle.resources.map(&:name))
51
-
52
- return nil if section_data.empty?
53
-
54
47
  section_name = "#{basename_without_ext(bundle.path)}Assets"
55
-
48
+ section_data = build_images_section_data(bundle.resources.map(&:path), {
49
+ use_basename: [:path],
50
+ path_without_ext: true
51
+ })
56
52
  new_section(section_name, section_data)
57
53
  end
58
54
 
@@ -10,7 +10,7 @@ class XCRes::FileBuilder
10
10
  # Ensure that the given directory exists
11
11
  output_dir = File.dirname output_path
12
12
  unless Dir.exist? output_dir
13
- logger.success 'Directory did not exist. Will been created.'
13
+ logger.success 'Directory did not exist. Will be created.'
14
14
  Dir.mkdir output_dir
15
15
  end
16
16
 
@@ -45,20 +45,20 @@ class XCRes::InstallCommand < XCRes::ProjectCommand
45
45
  def find_parent_group
46
46
  # Get main group and ensure that it exists
47
47
  main_group = project.main_group
48
- raise ArgumentError, "Didn't found main group" if main_group.nil?
48
+ raise ArgumentError, "Didn't find main group" if main_group.nil?
49
49
 
50
50
  # Get target-specific group, if the default project layout is in use
51
51
  src_group = main_group.groups.find { |g| g.path == target.name }
52
52
  if src_group != nil
53
53
  log "Found target group, will use its path as base output path."
54
54
  else
55
- log "Didn't found target group, expected a group with path '#{target.name}'."
55
+ log "Didn't find target group, expected a group with path '#{target.name}'."
56
56
  end
57
57
 
58
58
  # Find 'Supporting Files' group
59
59
  groups = main_group.recursive_children_groups
60
60
  support_files_group = groups.find { |g| g.name == 'Supporting Files' }
61
- warn "Didn't found support files group" if support_files_group.nil?
61
+ warn "Didn't find support files group" if support_files_group.nil?
62
62
 
63
63
  support_files_group || src_group || main_group
64
64
  end
@@ -101,6 +101,7 @@ class XCRes::InstallCommand < XCRes::ProjectCommand
101
101
  # Set shell script
102
102
  script_output_path = output_path.relative_path_from(src_root_path)
103
103
  build_phase.shell_script = "xcres --no-ansi build $PROJECT_FILE_PATH $SRCROOT/#{script_output_path}\n"
104
+ build_phase.show_env_vars_in_log = '0'
104
105
 
105
106
  # Find or create 'Resources' group in 'Supporting Files'
106
107
  res_group = parent_group.groups.find { |g| g.name == 'Resources' }
@@ -9,11 +9,11 @@ class XCRes::ProjectCommand < XCRes::Command
9
9
  option ['--[no-]documented'], :flag, 'Add documentation to the generated files', default: true
10
10
  #option ['-d', '--dry-run'], :flag, 'Does nothing on the file system'
11
11
 
12
- option ['-t', '--target'], 'TARGET', 'Application target to use', attribute_name: :target_name
12
+ option ['-t', '--target'], 'TARGET', 'Target to search & analyze', attribute_name: :target_name
13
13
  option ['-x', '--exclude'], 'FILE_PATTERN', 'File pattern which should be excluded (default: ["InfoPlist.strings"])', multivalued: true, attribute_name: :exclude_file_patterns, default: ['InfoPlist.strings']
14
14
  option ['-n', '--name'], 'NAME', 'Name of the resources constant (default: `basename OUTPUT_PATH`)', attribute_name: :resources_constant_name
15
15
  option ['-l', '--language'], 'LANGUAGE', 'Default language to build the keys', attribute_name: :default_language do |language|
16
- raise ArgumentError.new 'Expected a two-letter code conforming ISO 639-1 as LANGUAGE' unless String(language).length == 2
16
+ raise ArgumentError.new 'Expected a two-letter code conforming to ISO 639-1 as LANGUAGE' unless String(language).length == 2
17
17
  language
18
18
  end
19
19
 
@@ -50,8 +50,12 @@ class XCRes::ProjectCommand < XCRes::Command
50
50
  # @return [PBXNativeTarget]
51
51
  #
52
52
  def target
53
- if target_name != nil
54
- application_targets.find { |t| t.name == target }
53
+ @target ||= if target_name != nil
54
+ target = native_targets.find { |t| t.name == target_name }
55
+ if target.nil?
56
+ raise ArgumentError.new "Unknown target '#{target_name}'. "
57
+ end
58
+ target
55
59
  else
56
60
  if application_targets.count == 1
57
61
  application_targets.first
@@ -62,14 +66,23 @@ class XCRes::ProjectCommand < XCRes::Command
62
66
  end
63
67
  end
64
68
 
69
+ # Find all native targets in the project
70
+ #
71
+ # @return [Array<PBXNativeTarget>]
72
+ #
73
+ def native_targets
74
+ @native_targets ||= project.targets.select do |target|
75
+ target.is_a?(Xcodeproj::Project::Object::PBXNativeTarget)
76
+ end
77
+ end
78
+
65
79
  # Find all application targets in the project
66
80
  #
67
81
  # @return [Array<PBXNativeTarget>]
68
82
  #
69
83
  def application_targets
70
- @application_targets ||= project.targets.select do |target|
71
- target.is_a?(Xcodeproj::Project::Object::PBXNativeTarget) \
72
- && target.product_type == Xcodeproj::Constants::PRODUCT_TYPE_UTI[:application]
84
+ @application_targets ||= native_targets.select do |target|
85
+ target.product_type == Xcodeproj::Constants::PRODUCT_TYPE_UTI[:application]
73
86
  end
74
87
  end
75
88
 
@@ -88,7 +101,7 @@ class XCRes::ProjectCommand < XCRes::Command
88
101
 
89
102
  def discover_xcodeproj_file_path!
90
103
  if xcodeproj_file_path.nil?
91
- warn 'Argument XCODEPROJ is not set. Use the current directory.'
104
+ warn 'Argument XCODEPROJ is not set. Using the current directory.'
92
105
  discover_xcodeproj_file_path_in_dir! '.'
93
106
  elsif Dir.exist?(xcodeproj_file_path) && !File.fnmatch('*.xcodeproj', xcodeproj_file_path)
94
107
  warn 'Argument XCODEPROJ is a directory. ' \
@@ -43,7 +43,7 @@ module XCRes::XCAssets
43
43
  #
44
44
  def read
45
45
  @resource_paths = Dir.chdir(path) do
46
- Dir['*'].map { |p| Pathname(p) }
46
+ Dir['**/Contents.json'].map { |p| Pathname(p) + '..' }
47
47
  end
48
48
  @resources = @resource_paths.map do |path|
49
49
  Resource.new(self, path)
@@ -4,6 +4,6 @@ module XCRes
4
4
  #
5
5
  # XCRes’s version, following [semver](http://semver.org).
6
6
  #
7
- VERSION = "0.4.1"
7
+ VERSION = "0.4.2"
8
8
 
9
9
  end
@@ -14,6 +14,11 @@
14
14
  "idiom" : "iphone",
15
15
  "size" : "60x60",
16
16
  "scale" : "2x"
17
+ },
18
+ {
19
+ "idiom" : "iphone",
20
+ "size" : "60x60",
21
+ "scale" : "3x"
17
22
  }
18
23
  ],
19
24
  "info" : {
@@ -0,0 +1,23 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "idiom" : "universal",
5
+ "scale" : "1x",
6
+ "filename" : "GrumpyCat.jpg"
7
+ },
8
+ {
9
+ "idiom" : "universal",
10
+ "scale" : "2x",
11
+ "filename" : "GrumpyCat@2x.jpg"
12
+ },
13
+ {
14
+ "idiom" : "universal",
15
+ "scale" : "3x",
16
+ "filename" : "GrumpyCat@3x.jpg"
17
+ }
18
+ ],
19
+ "info" : {
20
+ "version" : 1,
21
+ "author" : "xcode"
22
+ }
23
+ }
@@ -9,6 +9,10 @@
9
9
  "idiom" : "universal",
10
10
  "scale" : "2x",
11
11
  "filename" : "doge@2x.png"
12
+ },
13
+ {
14
+ "idiom" : "universal",
15
+ "scale" : "3x"
12
16
  }
13
17
  ],
14
18
  "info" : {
@@ -16,6 +16,7 @@ CLIntegracon.configure do |c|
16
16
  c.ignores '**.DS_Store'
17
17
  c.ignores '.gitkeep'
18
18
  c.ignores %r[/xcuserdata/]
19
+ c.ignores %r[/DerivedData/]
19
20
 
20
21
  # Transform produced project files to YAMLs
21
22
  c.transform_produced "**/*.xcodeproj" do |path|
@@ -8,8 +8,6 @@
8
8
  #import <Foundation/Foundation.h>
9
9
 
10
10
  extern const struct R {
11
- struct Images {
12
- } Images;
13
11
  struct Strings {
14
12
  } Strings;
15
13
  } R;
@@ -8,8 +8,6 @@
8
8
  #import "R.h"
9
9
 
10
10
  const struct R R = {
11
- .Images = {
12
- },
13
11
  .Strings = {
14
12
  },
15
13
  };
@@ -14,6 +14,11 @@
14
14
  "idiom" : "iphone",
15
15
  "size" : "60x60",
16
16
  "scale" : "2x"
17
+ },
18
+ {
19
+ "idiom" : "iphone",
20
+ "size" : "60x60",
21
+ "scale" : "3x"
17
22
  }
18
23
  ],
19
24
  "info" : {
@@ -0,0 +1,23 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "idiom" : "universal",
5
+ "scale" : "1x",
6
+ "filename" : "GrumpyCat.jpg"
7
+ },
8
+ {
9
+ "idiom" : "universal",
10
+ "scale" : "2x",
11
+ "filename" : "GrumpyCat@2x.jpg"
12
+ },
13
+ {
14
+ "idiom" : "universal",
15
+ "scale" : "3x",
16
+ "filename" : "GrumpyCat@3x.jpg"
17
+ }
18
+ ],
19
+ "info" : {
20
+ "version" : 1,
21
+ "author" : "xcode"
22
+ }
23
+ }
@@ -9,6 +9,10 @@
9
9
  "idiom" : "universal",
10
10
  "scale" : "2x",
11
11
  "filename" : "doge@2x.png"
12
+ },
13
+ {
14
+ "idiom" : "universal",
15
+ "scale" : "3x"
12
16
  }
13
17
  ],
14
18
  "info" : {
@@ -21,6 +21,8 @@ extern const struct R {
21
21
  struct ImagesAssets {
22
22
  /// AppIcon
23
23
  __unsafe_unretained NSString *app;
24
+ /// GrumpyCat
25
+ __unsafe_unretained NSString *catsGrumpy;
24
26
  /// Doge
25
27
  __unsafe_unretained NSString *doge;
26
28
  /// LaunchImage
@@ -17,6 +17,7 @@ const struct R R = {
17
17
  },
18
18
  .ImagesAssets = {
19
19
  .app = @"AppIcon",
20
+ .catsGrumpy = @"GrumpyCat",
20
21
  .doge = @"Doge",
21
22
  .launch = @"LaunchImage",
22
23
  },
@@ -7,8 +7,8 @@
7
7
  Ⓥ Add section for Icons with 2 elements
8
8
  Ⓥ Found #1 image files in project.
9
9
  Ⓥ Found #1 asset catalogs in project.
10
- Ⓥ Found asset catalog Images.xcassets with #3 image files.
11
- Ⓥ Add section for ImagesAssets with 3 elements
10
+ Ⓥ Found asset catalog Images.xcassets with #4 image files.
11
+ Ⓥ Add section for ImagesAssets with 4 elements
12
12
  Ⓥ Strings files in project: ["en.lproj/InfoPlist.strings", "en.lproj/Localizable.strings", "de.lproj/Localizable.strings"]
13
13
  Ⓥ Native development languages: ["en"]
14
14
  Ⓥ Used languages for .strings files: ["en", "de"]
@@ -14,6 +14,11 @@
14
14
  "idiom" : "iphone",
15
15
  "size" : "60x60",
16
16
  "scale" : "2x"
17
+ },
18
+ {
19
+ "idiom" : "iphone",
20
+ "size" : "60x60",
21
+ "scale" : "3x"
17
22
  }
18
23
  ],
19
24
  "info" : {
@@ -0,0 +1,23 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "idiom" : "universal",
5
+ "scale" : "1x",
6
+ "filename" : "GrumpyCat.jpg"
7
+ },
8
+ {
9
+ "idiom" : "universal",
10
+ "scale" : "2x",
11
+ "filename" : "GrumpyCat@2x.jpg"
12
+ },
13
+ {
14
+ "idiom" : "universal",
15
+ "scale" : "3x",
16
+ "filename" : "GrumpyCat@3x.jpg"
17
+ }
18
+ ],
19
+ "info" : {
20
+ "version" : 1,
21
+ "author" : "xcode"
22
+ }
23
+ }
@@ -9,6 +9,10 @@
9
9
  "idiom" : "universal",
10
10
  "scale" : "2x",
11
11
  "filename" : "doge@2x.png"
12
+ },
13
+ {
14
+ "idiom" : "universal",
15
+ "scale" : "3x"
12
16
  }
13
17
  ],
14
18
  "info" : {
@@ -34,7 +34,7 @@ Targets:
34
34
  shellPath: "/bin/sh"
35
35
  shellScript: |
36
36
  xcres --no-ansi build $PROJECT_FILE_PATH $SRCROOT/Example/Resources/R
37
- showEnvVarsInLog: '1'
37
+ showEnvVarsInLog: '0'
38
38
  buildActionMask: '2147483647'
39
39
  runOnlyForDeploymentPostprocessing: '0'
40
40
  - SourcesBuildPhase:
@@ -35,7 +35,7 @@ Targets:
35
35
  shellPath: "/bin/sh"
36
36
  shellScript: |
37
37
  xcres --no-ansi build $PROJECT_FILE_PATH $SRCROOT/Supporting_Files/Resources/R
38
- showEnvVarsInLog: '1'
38
+ showEnvVarsInLog: '0'
39
39
  buildActionMask: '2147483647'
40
40
  runOnlyForDeploymentPostprocessing: '0'
41
41
  - SourcesBuildPhase:
@@ -2,7 +2,7 @@
2
2
  Ⓥ Verbose mode is enabled.
3
3
  ⚠ Argument XCODEPROJ is a directory. Try to locate the Xcode project in this directory.
4
4
  ✓ Use Example/Example.xcodeproj as XCODEPROJ.
5
- Ⓥ Didn't found target group, expected a group with path 'Example'.
5
+ Ⓥ Didn't find target group, expected a group with path 'Example'.
6
6
  Execute build first:
7
7
  Ⓥ Verbose mode is enabled.
8
8
  ✓ Use Example/Example.xcodeproj as XCODEPROJ.
@@ -17,6 +17,6 @@ Execute build first:
17
17
  Ⓥ Preferred languages: ["en"]
18
18
  Ⓥ Strings files after language selection: ["InfoPlist.strings"]
19
19
  Ⓥ Non-ignored .strings files: []
20
- ✓ Directory did not exist. Will been created.
20
+ ✓ Directory did not exist. Will be created.
21
21
  ✓ Successfully updated: ROOT/tmp/integration/install-moved-supporting-files/Example/Supporting_Files/Resources/R.h
22
22
  ✓ Successfully integrated into Example/Example.xcodeproj
@@ -35,7 +35,7 @@ Targets:
35
35
  shellPath: "/bin/sh"
36
36
  shellScript: |
37
37
  xcres --no-ansi build $PROJECT_FILE_PATH $SRCROOT/Resources/R
38
- showEnvVarsInLog: '1'
38
+ showEnvVarsInLog: '0'
39
39
  buildActionMask: '2147483647'
40
40
  runOnlyForDeploymentPostprocessing: '0'
41
41
  - SourcesBuildPhase:
@@ -2,8 +2,8 @@
2
2
  Ⓥ Verbose mode is enabled.
3
3
  ⚠ Argument XCODEPROJ is a directory. Try to locate the Xcode project in this directory.
4
4
  ✓ Use Example/Example.xcodeproj as XCODEPROJ.
5
- Ⓥ Didn't found target group, expected a group with path 'Example'.
6
- ⚠ Didn't found support files group
5
+ Ⓥ Didn't find target group, expected a group with path 'Example'.
6
+ ⚠ Didn't find support files group
7
7
  Execute build first:
8
8
  Ⓥ Verbose mode is enabled.
9
9
  ✓ Use Example/Example.xcodeproj as XCODEPROJ.
@@ -18,6 +18,6 @@ Execute build first:
18
18
  Ⓥ Preferred languages: ["en"]
19
19
  Ⓥ Strings files after language selection: ["InfoPlist.strings"]
20
20
  Ⓥ Non-ignored .strings files: []
21
- ✓ Directory did not exist. Will been created.
21
+ ✓ Directory did not exist. Will be created.
22
22
  ✓ Successfully updated: ROOT/tmp/integration/install-no-supporting-files/Example/Resources/R.h
23
23
  ✓ Successfully integrated into Example/Example.xcodeproj
@@ -34,7 +34,7 @@ Targets:
34
34
  shellPath: "/bin/sh"
35
35
  shellScript: |
36
36
  xcres --no-ansi build $PROJECT_FILE_PATH $SRCROOT/Example/Resources/R
37
- showEnvVarsInLog: '1'
37
+ showEnvVarsInLog: '0'
38
38
  buildActionMask: '2147483647'
39
39
  runOnlyForDeploymentPostprocessing: '0'
40
40
  - SourcesBuildPhase:
@@ -17,6 +17,6 @@ Execute build first:
17
17
  Ⓥ Preferred languages: ["en"]
18
18
  Ⓥ Strings files after language selection: ["en.lproj/InfoPlist.strings"]
19
19
  Ⓥ Non-ignored .strings files: []
20
- ✓ Directory did not exist. Will been created.
20
+ ✓ Directory did not exist. Will be created.
21
21
  ✓ Successfully updated: ROOT/tmp/integration/install/Example/Example/Resources/R.h
22
22
  ✓ Successfully integrated into Example/Example.xcodeproj
@@ -1,3 +1,3 @@
1
1
  xcres version --verbose --no-ansi 2>&1
2
2
  Ⓥ Verbose mode is enabled.
3
- 0.4.1
3
+ 0.4.2
@@ -12,6 +12,21 @@ class Xcodeproj::Project::Object::PBXShellScriptBuildPhase
12
12
  end
13
13
  end
14
14
 
15
+ class Xcodeproj::Project::Object::XCBuildConfiguration
16
+ def pretty_print
17
+ data = {}
18
+ data['Build Settings'] = {}.tap do |sorted_settings|
19
+ build_settings.keys.sort.each do |key|
20
+ sorted_settings[key] = build_settings[key]
21
+ end
22
+ end
23
+ if base_configuration_reference
24
+ data['Base Configuration'] = base_configuration_reference.pretty_print
25
+ end
26
+ { name => data }
27
+ end
28
+ end
29
+
15
30
  class Xcodeproj::Project
16
31
  def to_yaml
17
32
  pretty_print_output = pretty_print
@@ -20,16 +20,37 @@ describe 'XCRes::ResourcesAnalyzer::BaseResourcesAnalyzer' do
20
20
  @analyzer.build_images_section_data([]).should.eql?({})
21
21
  end
22
22
 
23
- describe 'option use_basename? is not given' do
23
+ describe 'option use_basename is not given' do
24
24
  it 'builds an items hash and keep the path' do
25
25
  @analyzer.build_images_section_data([Pathname('b/a.m'), Pathname('b/a.gif')])
26
26
  .should.eql?({ 'b/a' => 'b/a.gif' })
27
27
  end
28
28
  end
29
29
 
30
- describe 'option use_basename? is given as true' do
30
+ describe 'option use_basename is given as []' do
31
+ it 'builds an items hash and keep the path' do
32
+ @analyzer.build_images_section_data([Pathname('b/a.m'), Pathname('b/a.gif')], use_basename: [])
33
+ .should.eql?({ 'b/a' => 'b/a.gif' })
34
+ end
35
+ end
36
+
37
+ describe 'option use_basename is given as [:key]' do
31
38
  it 'builds an items hash and remove the path' do
32
- @analyzer.build_images_section_data([Pathname('b/a.m'), Pathname('b/a.gif')], use_basename?: true)
39
+ @analyzer.build_images_section_data([Pathname('b/a.m'), Pathname('b/a.gif')], use_basename: [:key])
40
+ .should.eql?({ 'a' => 'b/a.gif' })
41
+ end
42
+ end
43
+
44
+ describe 'option use_basename is given as [:path]' do
45
+ it 'builds an items hash and remove the path' do
46
+ @analyzer.build_images_section_data([Pathname('b/a.m'), Pathname('b/a.gif')], use_basename: [:path])
47
+ .should.eql?({ 'b/a' => 'a.gif' })
48
+ end
49
+ end
50
+
51
+ describe 'option use_basename is given as [:key,:path]' do
52
+ it 'builds an items hash and remove the path' do
53
+ @analyzer.build_images_section_data([Pathname('b/a.m'), Pathname('b/a.gif')], use_basename: [:key, :path])
33
54
  .should.eql?({ 'a' => 'a.gif' })
34
55
  end
35
56
  end
@@ -78,19 +99,31 @@ describe 'XCRes::ResourcesAnalyzer::BaseResourcesAnalyzer' do
78
99
  @analyzer.build_section_data([]).should.be.eql?({})
79
100
  end
80
101
 
81
- it 'returns a hash with the basename if option use_basename? is enabled' do
102
+ it 'returns a hash with the basename if option use_basename is [:key]' do
103
+ @analyzer.expects(:key_from_path).with('b').returns('b')
104
+ @analyzer.build_section_data(@file_paths, use_basename: [:key])
105
+ .should.be.eql?({ 'b' => 'a/b' })
106
+ end
107
+
108
+ it 'returns a hash with the basename if option use_basename is [:path]' do
109
+ @analyzer.expects(:key_from_path).with('a/b').returns('a/b')
110
+ @analyzer.build_section_data(@file_paths, use_basename: [:path])
111
+ .should.be.eql?({ 'a/b' => 'b' })
112
+ end
113
+
114
+ it 'returns a hash with the basename if option use_basename is [:key, :path]' do
82
115
  @analyzer.expects(:key_from_path).with('b').returns('b')
83
- @analyzer.build_section_data(@file_paths, use_basename?: true)
116
+ @analyzer.build_section_data(@file_paths, use_basename: [:key, :path])
84
117
  .should.be.eql?({ 'b' => 'b' })
85
118
  end
86
119
 
87
- it 'returns a hash with relative paths if option use_basename? is disabled' do
120
+ it 'returns a hash with relative paths if option use_basename is []' do
88
121
  @analyzer.expects(:key_from_path).with('a/b').returns('a/b')
89
- @analyzer.build_section_data(@file_paths, use_basename?: false)
122
+ @analyzer.build_section_data(@file_paths, use_basename: [])
90
123
  .should.be.eql?({ 'a/b' => 'a/b' })
91
124
  end
92
125
 
93
- it 'returns a hash with relative paths if option use_basename? is not given' do
126
+ it 'returns a hash with relative paths if option use_basename is not given' do
94
127
  @analyzer.expects(:key_from_path).with('a/b').returns('a/b')
95
128
  @analyzer.build_section_data(@file_paths)
96
129
  .should.be.eql?({ 'a/b' => 'a/b' })
@@ -39,13 +39,13 @@ describe 'XCRes::ResourcesAnalyzer::BundleResourcesAnalyzer' do
39
39
 
40
40
  it 'should return nil if the bundle does not contain any images' do
41
41
  @analyzer.expects(:find_files_in_dir).with(@mock_bundle.real_path).returns([Pathname('a.m')])
42
- @analyzer.build_section_for_bundle(@mock_bundle).should.be.nil?
42
+ @analyzer.build_section_for_bundle(@mock_bundle).items.should.be.empty
43
43
  end
44
44
 
45
45
  it 'should return nil if the bundle does not contain any valid images' do
46
46
  @analyzer.expects(:find_files_in_dir).with(@mock_bundle.real_path).returns([Pathname('a.gif')])
47
47
  @analyzer.exclude_file_patterns = ['a.gif']
48
- @analyzer.build_section_for_bundle(@mock_bundle).should.be.nil?
48
+ @analyzer.build_section_for_bundle(@mock_bundle).items.should.be.empty
49
49
  end
50
50
 
51
51
  it 'should build a new section if the bundle contain valid images' do
@@ -43,12 +43,19 @@ module XCAssetsSpec
43
43
  it 'should set the resource paths' do
44
44
  @bundle.resource_paths.should.be.eql? [
45
45
  Pathname('AppIcon.appiconset'),
46
+ Pathname('Cats/GrumpyCat.imageset'),
46
47
  Pathname('Doge.imageset'),
47
48
  Pathname('LaunchImage.launchimage'),
48
49
  ]
49
50
  end
50
51
 
51
52
  shared 'XCAssets resource' do
53
+ path = @name
54
+
55
+ before do
56
+ @res = @bundle.resources.find { |r| r.path.to_s == path }
57
+ end
58
+
52
59
  it 'should match the info' do
53
60
  @res.info.should.be.eql?({ "version" => 1, "author" => "xcode" })
54
61
  end
@@ -56,14 +63,8 @@ module XCAssetsSpec
56
63
 
57
64
  describe 'resources' do
58
65
  describe 'AppIcon.appiconset' do
59
- before { @res = @bundle.resources[0] }
60
-
61
66
  behaves_like 'XCAssets resource'
62
67
 
63
- it 'should match the path' do
64
- @res.path.should.be.eql? Pathname('AppIcon.appiconset')
65
- end
66
-
67
68
  it 'should match the name' do
68
69
  @res.name.should.be.eql? 'AppIcon'
69
70
  end
@@ -77,19 +78,38 @@ module XCAssetsSpec
77
78
  ResourceImage.new(idiom: 'iphone', scale: 2, size: '29x29'),
78
79
  ResourceImage.new(idiom: 'iphone', scale: 2, size: '40x40'),
79
80
  ResourceImage.new(idiom: 'iphone', scale: 2, size: '60x60'),
81
+ ResourceImage.new(idiom: 'iphone', scale: 3, size: '60x60'),
80
82
  ]
81
83
  end
82
84
  end
83
85
 
84
- describe 'Doge.imageset' do
85
- before { @res = @bundle.resources[1] }
86
-
86
+ describe 'Cats/GrumpyCat.imageset' do
87
87
  behaves_like 'XCAssets resource'
88
88
 
89
- it 'should match the path' do
90
- @res.path.should.be.eql? Pathname('Doge.imageset')
89
+ it 'should match the name' do
90
+ @res.name.should.be.eql? 'GrumpyCat'
91
91
  end
92
92
 
93
+ it 'should match the type' do
94
+ @res.type.should.be.eql? 'imageset'
95
+ end
96
+
97
+ it 'should match the info' do
98
+ @res.info.should.be.eql?({ "version" => 1, "author" => "xcode" })
99
+ end
100
+
101
+ it 'should match the images' do
102
+ @res.images.should.be.eql? [
103
+ ResourceImage.new(idiom: 'universal', scale: 1, filename: 'GrumpyCat.jpg'),
104
+ ResourceImage.new(idiom: 'universal', scale: 2, filename: 'GrumpyCat@2x.jpg'),
105
+ ResourceImage.new(idiom: 'universal', scale: 3, filename: 'GrumpyCat@3x.jpg'),
106
+ ]
107
+ end
108
+ end
109
+
110
+ describe 'Doge.imageset' do
111
+ behaves_like 'XCAssets resource'
112
+
93
113
  it 'should match the name' do
94
114
  @res.name.should.be.eql? 'Doge'
95
115
  end
@@ -106,19 +126,14 @@ module XCAssetsSpec
106
126
  @res.images.should.be.eql? [
107
127
  ResourceImage.new(idiom: 'universal', scale: 1, filename: 'doge.png'),
108
128
  ResourceImage.new(idiom: 'universal', scale: 2, filename: 'doge@2x.png'),
129
+ ResourceImage.new(idiom: 'universal', scale: 3),
109
130
  ]
110
131
  end
111
132
  end
112
133
 
113
134
  describe 'LaunchImage.launchimage' do
114
- before { @res = @bundle.resources[2] }
115
-
116
135
  behaves_like 'XCAssets resource'
117
136
 
118
- it 'should match the path' do
119
- @res.path.should.be.eql? Pathname('LaunchImage.launchimage')
120
- end
121
-
122
137
  it 'should match the name' do
123
138
  @res.name.should.be.eql? 'LaunchImage'
124
139
  end
@@ -31,7 +31,11 @@ module XCAssetsSpec
31
31
  "idiom" => "universal",
32
32
  "scale" => "2x",
33
33
  "filename" => "doge@2x.png"
34
- }
34
+ },
35
+ {
36
+ "idiom" => "universal",
37
+ "scale" => "3x"
38
+ },
35
39
  ],
36
40
  "info" => expected_info
37
41
  }
@@ -130,6 +134,7 @@ module XCAssetsSpec
130
134
  @res.images.should.be.eql? [
131
135
  ResourceImage.new(idiom: 'universal', scale: 1, filename: 'doge.png'),
132
136
  ResourceImage.new(idiom: 'universal', scale: 2, filename: 'doge@2x.png'),
137
+ ResourceImage.new(idiom: 'universal', scale: 3),
133
138
  ]
134
139
  end
135
140
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xcres
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marius Rackwitz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-03 00:00:00.000000000 Z
11
+ date: 2014-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -261,6 +261,10 @@ files:
261
261
  - spec/fixtures/Example/Example/Example-Info.plist
262
262
  - spec/fixtures/Example/Example/Example-Prefix.pch
263
263
  - spec/fixtures/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json
264
+ - spec/fixtures/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/Contents.json
265
+ - spec/fixtures/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat.jpg
266
+ - spec/fixtures/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@2x.jpg
267
+ - spec/fixtures/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@3x.jpg
264
268
  - spec/fixtures/Example/Example/Images.xcassets/Doge.imageset/Contents.json
265
269
  - spec/fixtures/Example/Example/Images.xcassets/Doge.imageset/doge.png
266
270
  - spec/fixtures/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png
@@ -366,6 +370,10 @@ files:
366
370
  - spec/integration/build/after/Example/Example/Icons.bundle/tab_bar/tabbar_map.png
367
371
  - spec/integration/build/after/Example/Example/Icons.bundle/tab_bar/tabbar_map@2x.png
368
372
  - spec/integration/build/after/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json
373
+ - spec/integration/build/after/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/Contents.json
374
+ - spec/integration/build/after/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat.jpg
375
+ - spec/integration/build/after/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@2x.jpg
376
+ - spec/integration/build/after/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@3x.jpg
369
377
  - spec/integration/build/after/Example/Example/Images.xcassets/Doge.imageset/Contents.json
370
378
  - spec/integration/build/after/Example/Example/Images.xcassets/Doge.imageset/doge.png
371
379
  - spec/integration/build/after/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png
@@ -390,6 +398,10 @@ files:
390
398
  - spec/integration/build/before/Example/Example/Icons.bundle/tab_bar/tabbar_map.png
391
399
  - spec/integration/build/before/Example/Example/Icons.bundle/tab_bar/tabbar_map@2x.png
392
400
  - spec/integration/build/before/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json
401
+ - spec/integration/build/before/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/Contents.json
402
+ - spec/integration/build/before/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat.jpg
403
+ - spec/integration/build/before/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@2x.jpg
404
+ - spec/integration/build/before/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@3x.jpg
393
405
  - spec/integration/build/before/Example/Example/Images.xcassets/Doge.imageset/Contents.json
394
406
  - spec/integration/build/before/Example/Example/Images.xcassets/Doge.imageset/doge.png
395
407
  - spec/integration/build/before/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png
@@ -552,6 +564,10 @@ test_files:
552
564
  - spec/fixtures/Example/Example/Example-Info.plist
553
565
  - spec/fixtures/Example/Example/Example-Prefix.pch
554
566
  - spec/fixtures/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json
567
+ - spec/fixtures/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/Contents.json
568
+ - spec/fixtures/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat.jpg
569
+ - spec/fixtures/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@2x.jpg
570
+ - spec/fixtures/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@3x.jpg
555
571
  - spec/fixtures/Example/Example/Images.xcassets/Doge.imageset/Contents.json
556
572
  - spec/fixtures/Example/Example/Images.xcassets/Doge.imageset/doge.png
557
573
  - spec/fixtures/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png
@@ -657,6 +673,10 @@ test_files:
657
673
  - spec/integration/build/after/Example/Example/Icons.bundle/tab_bar/tabbar_map.png
658
674
  - spec/integration/build/after/Example/Example/Icons.bundle/tab_bar/tabbar_map@2x.png
659
675
  - spec/integration/build/after/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json
676
+ - spec/integration/build/after/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/Contents.json
677
+ - spec/integration/build/after/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat.jpg
678
+ - spec/integration/build/after/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@2x.jpg
679
+ - spec/integration/build/after/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@3x.jpg
660
680
  - spec/integration/build/after/Example/Example/Images.xcassets/Doge.imageset/Contents.json
661
681
  - spec/integration/build/after/Example/Example/Images.xcassets/Doge.imageset/doge.png
662
682
  - spec/integration/build/after/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png
@@ -681,6 +701,10 @@ test_files:
681
701
  - spec/integration/build/before/Example/Example/Icons.bundle/tab_bar/tabbar_map.png
682
702
  - spec/integration/build/before/Example/Example/Icons.bundle/tab_bar/tabbar_map@2x.png
683
703
  - spec/integration/build/before/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json
704
+ - spec/integration/build/before/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/Contents.json
705
+ - spec/integration/build/before/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat.jpg
706
+ - spec/integration/build/before/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@2x.jpg
707
+ - spec/integration/build/before/Example/Example/Images.xcassets/Cats/GrumpyCat.imageset/GrumpyCat@3x.jpg
684
708
  - spec/integration/build/before/Example/Example/Images.xcassets/Doge.imageset/Contents.json
685
709
  - spec/integration/build/before/Example/Example/Images.xcassets/Doge.imageset/doge.png
686
710
  - spec/integration/build/before/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png