# frozen_string_literal: true require 'spec_helper' require 'ostruct' require 'tempfile' require_relative '../lib/cocoapods-pack/spec_generator' describe_with_private_methods SpecGenerator do def source_spec(opts = {}) fixed_root = { name: 'MySample', dependencies: [], attributes_hash: { 'name' => 'MySample' }.merge(opts[:attributes_hash] || {}) } OpenStruct.new(fixed_root.merge(opts[:root] || {})) end context 'for dynamic frameworks' do let(:use_frameworks) { true } temp_file = Tempfile.new('MySample.zip') it 'generates a ruby podspec' do artifact_repo_url = 'http://example.com/MySample.zip' spec = SpecGenerator.new source_podspec, artifact_repo_url, temp_file, true expect(spec.generate_ruby_string).to eq(expected_output) expect(spec.generate.to_pretty_json).to eq(Pod::Specification.from_string(expected_output, 'name.podspec').to_pretty_json) end it 'works with multiple platforms' do source_podspec = source_spec spec = SpecGenerator.new source_podspec, 'url/MySample.zip', temp_file, true spec.add_platform(Pod::Platform.new(:ios, '8.0'), 'MySample.xcframework') spec.add_platform(Pod::Platform.new(:osx), 'MySample.xcframework') spec.add_platform(Pod::Platform.new(:watchos, '3.0'), 'MySample.xcframework') expected_output = %(# Generated by cocoapods-pack #{CocoapodsPack::VERSION} - Do not manually modify. Pod::Spec.new do |s| s.name = 'MySample' s.source = {:http=>"url/MySample.zip", :sha256=>"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} s.ios.deployment_target = '8.0' s.ios.vendored_frameworks = 'ios/MySample.xcframework' s.osx.deployment_target = nil s.osx.vendored_frameworks = 'osx/MySample.xcframework' s.watchos.deployment_target = '3.0' s.watchos.vendored_frameworks = 'watchos/MySample.xcframework' end ) expect(spec.generate_ruby_string).to eq(expected_output) expect(spec.generate.to_pretty_json).to eq(Pod::Specification.from_string(expected_output, 'name.podspec').to_pretty_json) end it 'works with a single platform' do source_podspec = source_spec spec = SpecGenerator.new source_podspec, 'url/MySample.zip', temp_file, true spec.add_platform(Pod::Platform.new(:ios), 'MySample.xcframework') expected_output = %(# Generated by cocoapods-pack #{CocoapodsPack::VERSION} - Do not manually modify. Pod::Spec.new do |s| s.name = 'MySample' s.source = {:http=>"url/MySample.zip", :sha256=>"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} s.platform = :ios s.ios.vendored_frameworks = 'ios/MySample.xcframework' end ) expect(spec.generate_ruby_string).to eq(expected_output) expect(spec.generate.to_pretty_json).to eq(Pod::Specification.from_string(expected_output, 'name.podspec').to_pretty_json) end it 'works with dependencies' do source_podspec = source_spec(root: { dependencies: [Pod::Dependency.new('Dependency1', ['~> 1.0']), Pod::Dependency.new('Dependency2', ['>= 0']), Pod::Dependency.new('Dependency3', ['>= 0', '< 2.0'])] }) spec = SpecGenerator.new source_podspec, 'url/MySample.zip', temp_file, true expected_output = %(# Generated by cocoapods-pack #{CocoapodsPack::VERSION} - Do not manually modify. Pod::Spec.new do |s| s.name = 'MySample' s.source = {:http=>"url/MySample.zip", :sha256=>"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} s.dependency 'Dependency1', '~> 1.0' s.dependency 'Dependency2', '>= 0' s.dependency 'Dependency3', '< 2.0', '>= 0' end ) expect(spec.generate_ruby_string).to eq(expected_output) expect(spec.generate.to_pretty_json).to eq(Pod::Specification.from_string(expected_output, 'name.podspec').to_pretty_json) end it 'works with vendored_libraries' do source_podspec = source_spec(attributes_hash: { 'vendored_libraries' => ['lib1.a', 'lib2.a'] }) spec = SpecGenerator.new source_podspec, 'url/MySample.zip', temp_file, true expected_output = %(# Generated by cocoapods-pack #{CocoapodsPack::VERSION} - Do not manually modify. Pod::Spec.new do |s| s.name = 'MySample' s.source = {:http=>"url/MySample.zip", :sha256=>"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} s.vendored_libraries = 'lib1.a', 'lib2.a' end ) expect(spec.generate_ruby_string).to eq(expected_output) expect(spec.generate.to_pretty_json).to eq(Pod::Specification.from_string(expected_output, 'name.podspec').to_pretty_json) end it 'works with platform vendored_libraries' do source_podspec = source_spec(attributes_hash: { 'ios' => { 'vendored_libraries' => 'ioslib.a' } }) spec = SpecGenerator.new source_podspec, 'url/MySample.zip', temp_file, true spec.add_platform(Pod::Platform.new(:ios), 'MySample.xcframework') expected_output = %(# Generated by cocoapods-pack #{CocoapodsPack::VERSION} - Do not manually modify. Pod::Spec.new do |s| s.name = 'MySample' s.source = {:http=>"url/MySample.zip", :sha256=>"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} s.platform = :ios s.ios.vendored_frameworks = 'ios/MySample.xcframework' s.ios.vendored_libraries = 'ioslib.a' end ) expect(spec.generate_ruby_string).to eq(expected_output) expect(spec.generate.to_pretty_json).to eq(Pod::Specification.from_string(expected_output, 'name.podspec').to_pretty_json) end it 'works with vendored_frameworks' do source_podspec = source_spec(attributes_hash: { 'vendored_frameworks' => ['lib1.framework', 'lib2.framework'] }) spec = SpecGenerator.new source_podspec, 'url/MySample.zip', temp_file, true expected_output = %(# Generated by cocoapods-pack #{CocoapodsPack::VERSION} - Do not manually modify. Pod::Spec.new do |s| s.name = 'MySample' s.source = {:http=>"url/MySample.zip", :sha256=>"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} s.vendored_frameworks = 'lib1.framework', 'lib2.framework' end ) expect(spec.generate_ruby_string).to eq(expected_output) expect(spec.generate.to_pretty_json).to eq(Pod::Specification.from_string(expected_output, 'name.podspec').to_pretty_json) end it 'works with platform vendored_frameworks' do source_podspec = source_spec(attributes_hash: { 'ios' => { 'vendored_frameworks' => 'ioslib.framework' } }) spec = SpecGenerator.new source_podspec, 'url/MySample.zip', temp_file, true spec.add_platform(Pod::Platform.new(:ios), 'MySample.xcframework') expected_output = %(# Generated by cocoapods-pack #{CocoapodsPack::VERSION} - Do not manually modify. Pod::Spec.new do |s| s.name = 'MySample' s.source = {:http=>"url/MySample.zip", :sha256=>"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} s.platform = :ios s.ios.vendored_frameworks = 'ios/MySample.xcframework', 'ioslib.framework' end ) expect(spec.generate_ruby_string).to eq(expected_output) expect(spec.generate.to_pretty_json).to eq(Pod::Specification.from_string(expected_output, 'name.podspec').to_pretty_json) end it 'works with glob paths' do source_podspec = source_spec(attributes_hash: { 'ios' => { 'vendored_libraries' => '*.a' } }) spec = SpecGenerator.new source_podspec, 'url/MySample.zip', temp_file, true spec.add_platform(Pod::Platform.new(:ios), 'MySample.xcframework') expected_output = %(# Generated by cocoapods-pack #{CocoapodsPack::VERSION} - Do not manually modify. Pod::Spec.new do |s| s.name = 'MySample' s.source = {:http=>"url/MySample.zip", :sha256=>"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} s.platform = :ios s.ios.vendored_frameworks = 'ios/MySample.xcframework' s.ios.vendored_libraries = '*.a' end ) expect(spec.generate_ruby_string).to eq(expected_output) expect(spec.generate.to_pretty_json).to eq(Pod::Specification.from_string(expected_output, 'name.podspec').to_pretty_json) end it 'works with resources' do source_podspec = source_spec(attributes_hash: { 'resources' => ['a.png'], 'preserve_paths' => ['script.sh', 'run.sh'] }) spec = SpecGenerator.new source_podspec, 'url/MySample.zip', temp_file, true expected_output = %(# Generated by cocoapods-pack #{CocoapodsPack::VERSION} - Do not manually modify. Pod::Spec.new do |s| s.name = 'MySample' s.source = {:http=>"url/MySample.zip", :sha256=>"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} s.resources = 'a.png' s.preserve_paths = 'script.sh', 'run.sh' end ) expect(spec.generate_ruby_string).to eq(expected_output) expect(spec.generate.to_pretty_json).to eq(Pod::Specification.from_string(expected_output, 'name.podspec').to_pretty_json) end xit 'works with module maps and static libraries' do source_podspec = source_spec(root: { module_map: 'module.modulemap' }) spec = SpecGenerator.new source_podspec, 'url/MySample.zip', temp_file, true spec.add_platform(Pod::Platform.new(:ios, '7.0'), 'MySample.xcframework') expected_output = %(# Generated by cocoapods-pack #{CocoapodsPack::VERSION} - Do not manually modify. Pod::Spec.new do |s| s.name = 'MySample' s.source = {:http=>"url/MySample.zip", :sha256=>"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} s.platform = :ios, '7.0' s.ios.module_map = 'ios/include/module.modulemap' s.ios.vendored_frameworks = 'ios/MySample.xcframework' end ) expect(spec.generate_ruby_string).to eq(expected_output) expect(spec.generate.to_pretty_json).to eq(Pod::Specification.from_string(expected_output, 'name.podspec').to_pretty_json) end end let :source_podspec do description = <<-DESCRIPTION A longer description of MySample in Markdown format. It's lines. DESCRIPTION source_spec(attributes_hash: { 'name' => 'MySample', 'version' => '0.0.1', 'summary' => 'A short description of MySample.', 'description' => description, 'homepage' => 'http://squareup.com/', 'license' => { 'type' => 'MIT', 'text' => "Copyright 2012\nPermission is granted to...\n" }, 'authors' => { 'Jack Dorsey' => 'notsoeasytogivethisaway@gmail.com' }, 'swift_versions' => '5.0', 'platforms' => { 'ios' => nil }, 'source' => { 'git' => 'local only', 'tag' => '0.0.1' }, 'source_files' => ['MySample', 'MySample/**/*.{h,m,swift}'], 'exclude_files' => 'MySample/Exclude', 'artifact_repo_url' => 'http://example.com/my.zip' }) end let :expected_output do %(# Generated by cocoapods-pack #{CocoapodsPack::VERSION} - Do not manually modify. Pod::Spec.new do |s| s.name = 'MySample' s.version = '0.0.1' s.summary = 'A short description of MySample.' s.license = {"type"=>"MIT", "text"=>"Copyright 2012\\nPermission is granted to...\\n"} s.authors = {"Jack Dorsey"=>"notsoeasytogivethisaway@gmail.com"} s.homepage = 'http://squareup.com/' s.description = 'A longer description of MySample in Markdown format.\\nIt\\'s lines.\\n' s.source = {:http=>"http://example.com/MySample.zip", :sha256=>"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} s.swift_versions = '5.0' end ) end end