cocoapods-keys 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
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