cocoapods-keys 1.4.0 → 1.5.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: c5cc6251eb10bbe87ceee4a1f3643dfe4b7506da
4
- data.tar.gz: c243d7584efda5c4c4693c090ba4b50bd7228857
3
+ metadata.gz: 52a2e9e5a65b7647780f3f3bb143293366a86120
4
+ data.tar.gz: a2c043948ff253e77f4b4defaaaf17a9fb35f9fe
5
5
  SHA512:
6
- metadata.gz: 252122f84b76036ad1ad0ec68ae54673f8e76d3c2b02d7305b0a63ffcb4729ade9f8f6736441f8b29635975d82941291b0215f86430ddd47ce6173ffc190a139
7
- data.tar.gz: e46843504016015797d39a682b6a23fb53ccbb1b2e330f07bd0481b9b2e86e833e7ac61752d9b0845e451f81acd027a7f3c12c7f1ee40741e5e36cc49cdddefb
6
+ metadata.gz: 9aa97fd504108cfce1a9442f45ea009dcce868a0371e258c7992f432da6b66507021e8b03e0a4c94eb1bdea5b5cadc46e658b0d6d322b55504d653e5de787416
7
+ data.tar.gz: 695c2710be5f212f3685f065c316eacbe07ef01dcaceca057935a4014d0bff4d3dc3a400e6e42d6e9c2a5ac8a862a550659c753bd44a4155fa3a8b4dba0b4772
@@ -1,5 +1,10 @@
1
1
  ## Master
2
2
 
3
+ ## 1.5.0
4
+
5
+ * Minor error handling improvements [orta]
6
+ * Don't create a shared scheme for Keys [orta]
7
+
3
8
  ## 1.4.0
4
9
 
5
10
  * Adds support for ENV VAR based keys, this makes CI much easier to work with [alloy, orta]
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cocoapods-keys (1.4.0)
4
+ cocoapods-keys (1.5.0)
5
5
  osx_keychain
6
6
 
7
7
  GEM
@@ -102,4 +102,4 @@ DEPENDENCIES
102
102
  rubocop
103
103
 
104
104
  BUNDLED WITH
105
- 1.10.5
105
+ 1.10.6
@@ -3,20 +3,9 @@
3
3
  Once you've followed the setup instructions described in the [Usage](/orta/cocoapods-keys#usage)
4
4
  section of the README, you have two choices.
5
5
 
6
- ## Using the bridge header
7
-
8
- If you want to make your keys available to your whole project:
9
-
10
- 1. Make sure you have a [bridging header](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html) already setup.
11
- 2. In the bridging header, import the generated key file:
12
- ```objectivec
13
- #import <Keys/MyApplicationKeys.h>
14
- ```
15
-
16
6
  ## Importing the framework
17
7
 
18
- If you've added the `use_frameworks!` and only want your Keys to be available in
19
- specific files, simply use Swift's `import` statement. The name of the generated
8
+ Use Swift's `import` statement. The name of the generated
20
9
  module is `Keys`.
21
10
 
22
11
  ```swift
@@ -1,3 +1,3 @@
1
1
  module CocoaPodsKeys
2
- VERSION = '1.4.0'
2
+ VERSION = '1.5.0'
3
3
  end
@@ -11,6 +11,9 @@ module CocoaPodsKeys
11
11
  @time = time
12
12
  @keys = keyring.camel_cased_keys
13
13
  @name = keyring.code_name.capitalize + 'Keys'
14
+ if /^\d/.match(@name)
15
+ @name = '_' + @name
16
+ end
14
17
 
15
18
  @used_indexes = Set.new
16
19
  @indexed_keys = {}
@@ -6,7 +6,7 @@ module CocoaPodsKeys
6
6
 
7
7
  def initialize(name, path, keys = [])
8
8
  @name = name.to_s
9
- @path = path
9
+ @path = path.to_s
10
10
  @keys = keys
11
11
  end
12
12
 
@@ -26,18 +26,36 @@ module CocoaPodsKeys
26
26
  'cocoapods-keys-'
27
27
  end
28
28
 
29
+ def keychain
30
+ @keychain ||= OSXKeychain.new
31
+ end
32
+
29
33
  def save(key, value)
30
- keychain = OSXKeychain.new
31
34
  keychain[self.class.keychain_prefix + name, key] = value
32
35
  end
33
36
 
34
37
  def keychain_data
35
- keychain = OSXKeychain.new
36
38
  Hash[
37
- @keys.map { |key| [key, ENV[key] || keychain[self.class.keychain_prefix + name, key]] }
39
+ @keys.map { |key| [key, keychain_value(key)] }
38
40
  ]
39
41
  end
40
42
 
43
+ def keychain_has_key?(key)
44
+ has_key = !keychain_value(key).nil?
45
+
46
+ if has_key && !@keys.include?(key)
47
+ @keys << key
48
+ elsif !has_key && @keys.include?(key)
49
+ @keys.delete(key)
50
+ end
51
+
52
+ has_key
53
+ end
54
+
55
+ def keychain_value(key)
56
+ ENV[key] || keychain[self.class.keychain_prefix + name, key]
57
+ end
58
+
41
59
  def camel_cased_keys
42
60
  Hash[keychain_data.map { |(key, value)| [key[0].downcase + key[1..-1], value] }]
43
61
  end
@@ -24,9 +24,30 @@ module CocoaPodsKeys
24
24
  get_all_keyrings.find { |k| k.name == name }
25
25
  end
26
26
 
27
+ def self.get_current_keyring(name, cwd)
28
+ found_by_name = name && get_all_keyrings.find { |k| k.name == name && k.path == cwd.to_s }
29
+ found_by_name || KeyringLiberator.get_keyring(cwd)
30
+ end
31
+
32
+ def self.get_all_keyrings_named(name)
33
+ get_all_keyrings.find_all { |k| k.name == name }
34
+ end
35
+
36
+ def self.prompt_if_already_existing(keyring)
37
+ keyrings = get_all_keyrings_named(keyring.name)
38
+ already_exists = File.exist?(yaml_path_for_path(keyring.path))
39
+ if !already_exists && keyrings.any? { |existing_keyring| File.exist?(yaml_path_for_path(existing_keyring.path)) }
40
+ ui = Pod::UserInterface
41
+ ui.puts "About to create a duplicate keyring file for project #{keyring.name.green}"
42
+ ui.puts 'Entries in your Apple Keychain will be shared between both projects.'
43
+ ui.puts "\nPress enter to continue, or `ctrl + c` to cancel"
44
+ ui.gets
45
+ end
46
+ end
47
+
27
48
  def self.save_keyring(keyring)
28
49
  keys_dir.mkpath
29
-
50
+ prompt_if_already_existing(keyring)
30
51
  yaml_path_for_path(keyring.path).open('w') { |f| f.write(YAML.dump(keyring.to_hash)) }
31
52
  end
32
53
 
@@ -21,12 +21,13 @@ module CocoaPodsKeys
21
21
 
22
22
  def self.search_folders_for_xcodeproj
23
23
  ui = Pod::UserInterface
24
- xcodeprojects = Pathname.glob('**/*.xcodeproj')
24
+ xcodeprojects = Pathname.glob('**/*.xcodeproj').reject { |path| path.to_s.start_with?('Pods/') }
25
25
  if xcodeprojects.length == 1
26
26
  Pathname(xcodeprojects.first).basename('.xcodeproj')
27
27
  else
28
28
  error_message = (xcodeprojects.length > 1) ? 'found too many' : "couldn't find any"
29
- ui.puts 'CocoaPods-Keys ' + error_message + ' Xcode projects. Please give a name for this project.'
29
+ projects = xcodeprojects.map(&:basename).join(' ')
30
+ ui.puts 'CocoaPods-Keys ' + error_message + ' Xcode projects (' + projects + '). Please give a name for this project.'
30
31
 
31
32
  answer = ''
32
33
  loop do
@@ -25,8 +25,7 @@ module CocoaPodsKeys
25
25
  local_user_options = user_options || {}
26
26
  project = local_user_options.fetch('project') { CocoaPodsKeys::NameWhisperer.get_project_name }
27
27
 
28
- keyring = KeyringLiberator.get_keyring_named(project) ||
29
- KeyringLiberator.get_keyring(Dir.getwd) ||
28
+ keyring = KeyringLiberator.get_current_keyring(project, Dir.getwd) ||
30
29
  Keyring.new(project, Dir.getwd, local_user_options['keys'])
31
30
 
32
31
  raise Pod::Informative, 'Could not load keyring' unless keyring
@@ -41,6 +40,13 @@ module CocoaPodsKeys
41
40
 
42
41
  # Add our template podspec
43
42
  add_keys_to_pods(keys_path.relative_path_from(installation_root), user_options)
43
+
44
+ # Remove the shared scheme for this pod
45
+ Pod::HooksManager.register('cocoapods-keys', :post_install) do |context, user_options|
46
+ shared_scheme_path = "Pods/Pods.xcodeproj/xcshareddata/xcschemes/Keys.xcscheme"
47
+ FileUtils.rm(shared_scheme_path) if File.exist?(shared_scheme_path)
48
+ end
49
+
44
50
  end
45
51
 
46
52
  def add_keys_to_pods(keys_path, options)
@@ -16,6 +16,18 @@ module Pod
16
16
 
17
17
  self.abstract_command = true
18
18
  self.default_subcommand = 'list'
19
+
20
+ def create_keyring
21
+ current_dir = Pathname.pwd
22
+ name = @project_name || CocoaPodsKeys::NameWhisperer.get_project_name
23
+ CocoaPodsKeys::Keyring.new(name, current_dir, [])
24
+ end
25
+
26
+ def get_current_keyring
27
+ current_dir = Pathname.pwd
28
+ project = @project_name || CocoaPodsKeys::NameWhisperer.get_project_name
29
+ CocoaPodsKeys::KeyringLiberator.get_current_keyring(project, current_dir)
30
+ end
19
31
  end
20
32
  end
21
33
  end
@@ -35,21 +35,12 @@ module Pod
35
35
  end
36
36
 
37
37
  if keyring.keys.include? @key_name
38
- data = keyring.keychain_data
39
- UI.puts data[@key_name]
38
+ data = keyring.keychain_value(@key_name)
39
+ UI.puts data
40
40
  else
41
41
  raise Informative, 'Could not find value'
42
42
  end
43
43
  end
44
-
45
- def get_current_keyring
46
- current_dir = Pathname.pwd
47
- keyring = CocoaPodsKeys::KeyringLiberator.get_keyring current_dir
48
- if !keyring && @project_name
49
- return CocoaPodsKeys::KeyringLiberator.get_keyring_named @project_name
50
- end
51
- keyring
52
- end
53
44
  end
54
45
  end
55
46
  end
@@ -14,13 +14,12 @@ module Pod
14
14
 
15
15
  def run
16
16
  # List all settings for current app
17
- this_keyring = CocoaPodsKeys::KeyringLiberator.get_keyring(Pathname.pwd)
17
+ this_keyring = get_current_keyring
18
18
  if this_keyring
19
19
  display_current_keyring this_keyring
20
20
  end
21
21
 
22
22
  # List all known bundle ids
23
-
24
23
  all_keyrings = CocoaPodsKeys::KeyringLiberator.get_all_keyrings
25
24
  all_keyrings.each do |keyring|
26
25
  display_keyring(keyring) if !this_keyring || keyring.path != this_keyring.path
@@ -55,15 +55,6 @@ module Pod
55
55
  raise Informative, "Could not find key named #{@key_name}."
56
56
  end
57
57
  end
58
-
59
- def get_current_keyring
60
- current_dir = Pathname.pwd
61
- keyring = CocoaPodsKeys::KeyringLiberator.get_keyring current_dir
62
- if !keyring && @project_name
63
- return CocoaPodsKeys::KeyringLiberator.get_keyring_named @project_name
64
- end
65
- keyring
66
- end
67
58
  end
68
59
  end
69
60
  end
@@ -38,7 +38,7 @@ module Pod
38
38
  # set a key to a folder id in ~/.cocoapods/keys
39
39
  # info "Saving into the keychain."
40
40
 
41
- keyring = current_keyring
41
+ keyring = get_current_keyring || create_keyring
42
42
  keyring.keys << @key_name.tr('-', '_')
43
43
  CocoaPodsKeys::KeyringLiberator.save_keyring keyring
44
44
 
@@ -46,18 +46,6 @@ module Pod
46
46
 
47
47
  UI.puts "Saved #{@key_name} to #{keyring.name}." unless config.silent?
48
48
  end
49
-
50
- def current_keyring
51
- current_dir = Pathname.pwd
52
- keyring = CocoaPodsKeys::KeyringLiberator.get_keyring current_dir
53
-
54
- unless keyring
55
- name = @project_name || CocoaPodsKeys::NameWhisperer.get_project_name
56
- keyring = CocoaPodsKeys::Keyring.new(name, current_dir, [])
57
- end
58
-
59
- keyring
60
- end
61
49
  end
62
50
  end
63
51
  end
@@ -17,16 +17,20 @@ module CocoaPodsKeys
17
17
  options = @user_options || {}
18
18
  current_dir = Pathname.pwd
19
19
  project = options.fetch('project') { CocoaPodsKeys::NameWhisperer.get_project_name }
20
- keyring = KeyringLiberator.get_keyring_named(project) || KeyringLiberator.get_keyring(current_dir)
20
+
21
+ keyring = KeyringLiberator.get_current_keyring(project, current_dir)
22
+
23
+ unless keyring
24
+ check_for_multiple_keyrings(project, current_dir)
25
+ end
21
26
 
22
27
  existing_keyring = !keyring.nil?
23
28
  keyring = CocoaPodsKeys::Keyring.new(project, current_dir, []) unless keyring
24
29
 
25
- data = keyring.keychain_data
26
30
  has_shown_intro = false
27
31
  keys = options.fetch('keys', [])
28
32
  keys.each do |key|
29
- unless ENV[key] || data.keys.include?(key)
33
+ unless keyring.keychain_has_key?(key)
30
34
  unless has_shown_intro
31
35
  ui.puts "\n CocoaPods-Keys has detected a keys mismatch for your setup."
32
36
  has_shown_intro = true
@@ -46,8 +50,23 @@ module CocoaPodsKeys
46
50
  setter.run
47
51
  end
48
52
  end
53
+ CocoaPodsKeys::KeyringLiberator.save_keyring(keyring)
49
54
 
50
55
  existing_keyring || !keys.empty?
51
56
  end
57
+
58
+ def check_for_multiple_keyrings(project, current_dir)
59
+ ui = Pod::UserInterface
60
+ keyrings = KeyringLiberator.get_all_keyrings_named(project)
61
+ if keyrings.count > 1
62
+ ui.puts "Found multiple keyrings for project #{project.inspect}, but"
63
+ ui.puts "no match found for current path (#{current_dir}):"
64
+ keyrings.each do |found_keyring|
65
+ ui.puts "- #{found_keyring.path}"
66
+ end
67
+ ui.puts "\nPress enter to create a new keyring, or `ctrl + c` to cancel"
68
+ ui.gets
69
+ end
70
+ end
52
71
  end
53
72
  end
@@ -29,6 +29,13 @@ describe 'CocoaPodsKeys functional tests' do
29
29
  end
30
30
  end
31
31
 
32
+ after :all do
33
+ KeyringLiberator.get_all_keyrings_named('TestProject').each do |keyring|
34
+ file = KeyringLiberator.yaml_path_for_path(keyring.path)
35
+ FileUtils.rm(file) if File.exist?(file)
36
+ end
37
+ end
38
+
32
39
  it 'does not directly encode the keys into the implementation file' do
33
40
  source = File.read(File.join(@tmpdir, 'Pods/CocoaPodsKeys/TestProjectKeys.m'))
34
41
  expect(source).to_not include('such-data')
@@ -1,7 +1,10 @@
1
1
  require 'spec_helper'
2
+ require 'keyring'
2
3
  require 'key_master'
3
4
  require 'tmpdir'
4
5
 
6
+ include CocoaPodsKeys
7
+
5
8
  describe CocoaPodsKeys::KeyMaster do
6
9
  # Previous tests operated under assumption that
7
10
  # empty keychains were OK. See for more info:
@@ -23,4 +26,19 @@ describe CocoaPodsKeys::KeyMaster do
23
26
  system(`xcrun --sdk macosx --find clang`.strip, '-fsyntax-only', m_file)
24
27
  end
25
28
  end
29
+
30
+ describe '#name' do
31
+ it 'takes keyring with name that starts with number returns augmented the name with underscore' do
32
+ keyring = Keyring.new('500px', '/', ['ARMyKey'])
33
+ keyring.instance_variable_set(:@keychain, FakeKeychain.new('ARMyKey' => 'secretkey'))
34
+ key_master = KeyMaster.new(keyring)
35
+ expect(key_master.name).to eq('_500pxKeys')
36
+ end
37
+ it 'takes keyring with proper name returns proper Keys file' do
38
+ keyring = Keyring.new('Artsy', '/', ['ARMyKey'])
39
+ keyring.instance_variable_set(:@keychain, FakeKeychain.new('ARMyKey' => 'secretkey'))
40
+ key_master = KeyMaster.new(keyring)
41
+ expect(key_master.name).to eq('ArtsyKeys')
42
+ end
43
+ end
26
44
  end
@@ -21,6 +21,13 @@ describe KeyringLiberator do
21
21
  expect(KeyringLiberator.get_keyring_named('test')).to equal(keyring)
22
22
  end
23
23
 
24
+ it 'should find many by name' do
25
+ keyring1 = Keyring.from_hash('name' => 'test', 'path' => 'testpath1', 'keys' => [])
26
+ keyring2 = Keyring.from_hash('name' => 'test', 'path' => 'testpath2', 'keys' => [])
27
+ allow(KeyringLiberator).to receive(:get_all_keyrings).and_return([keyring1, keyring2])
28
+ expect(KeyringLiberator.get_all_keyrings_named('test')).to eq([keyring1, keyring2])
29
+ end
30
+
24
31
  it 'should be nil if nothing found find by name' do
25
32
  keyring = Keyring.from_hash('name' => 'test', 'path' => 'testpath', 'keys' => [])
26
33
  allow(KeyringLiberator).to receive(:get_all_keyrings).and_return([keyring])
@@ -16,4 +16,35 @@ describe KeyringLiberator do
16
16
  keyring = Keyring.new('test', '/', ['ARMyKey'])
17
17
  expect(keyring.keychain_data).to eq('ARMyKey' => 'Hello')
18
18
  end
19
+
20
+ it 'looks up keys from the OSXKeychain' do
21
+ keyring = Keyring.new('test', '/', ['ARMyKey'])
22
+ keyring.instance_variable_set(:@keychain, FakeKeychain.new('KeychainKey' => 'abcde'))
23
+ expect(keyring.keychain_has_key?('KeychainKey')).to be_truthy
24
+ expect(keyring.keychain_value('KeychainKey')).to eq('abcde')
25
+ expect(keyring.keychain_has_key?('NotMyKey')).to be_falsey
26
+ end
27
+
28
+ it 'looks up keys from ENV' do
29
+ keyring = Keyring.new('test', '/', ['ARMyKey'])
30
+ ENV['EnvKey'] = '12345'
31
+ keyring.instance_variable_set(:@keychain, FakeKeychain.new('KeychainKey' => 'abcde'))
32
+ expect(keyring.keychain_has_key?('EnvKey')).to be_truthy
33
+ expect(keyring.keychain_value('EnvKey')).to eq('12345')
34
+ expect(keyring.keychain_has_key?('NotMyKey')).to be_falsey
35
+ end
36
+
37
+ it 'updates its list of keys' do
38
+ keyring = Keyring.new('test', '/', ['NotMyKey'])
39
+ ENV['EnvKey'] = '12345'
40
+ keyring.instance_variable_set(:@keychain, FakeKeychain.new('KeychainKey' => 'abcde'))
41
+
42
+ keyring.keychain_has_key?('KeychainKey')
43
+ keyring.keychain_has_key?('EnvKey')
44
+ keyring.keychain_has_key?('NotMyKey')
45
+
46
+ expect(keyring.keys.include?('KeychainKey')).to be_truthy
47
+ expect(keyring.keys.include?('EnvKey')).to be_truthy
48
+ expect(keyring.keys.include?('NotMyKey')).to be_falsey
49
+ end
19
50
  end
@@ -15,3 +15,13 @@ RSpec.configure do |c|
15
15
 
16
16
  c.color = true
17
17
  end
18
+
19
+ class FakeKeychain
20
+ def initialize(data)
21
+ @data = data
22
+ end
23
+
24
+ def [](_, key)
25
+ @data[key]
26
+ end
27
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-keys
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Orta Therox
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-07-01 00:00:00.000000000 Z
12
+ date: 2015-09-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: osx_keychain