xcodesnippets 0.1.0 → 0.2.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.
@@ -2,6 +2,7 @@ $:.unshift(File.dirname(__FILE__))
2
2
 
3
3
  require 'fileutils'
4
4
  require 'xcode_snippets/main'
5
+ require 'xcode_snippets/version'
5
6
 
6
7
  module XcodeSnippets
7
8
  DEFAULT_INSTALLATION_PATH = File.expand_path("~/Library/Developer/Xcode/UserData/ManagedCodeSnippets")
@@ -1,5 +1,7 @@
1
1
  require 'clamp/command'
2
+ require 'highline/import'
2
3
  require 'xcode_snippets/snippet_manager'
4
+ require 'xcode_snippets/migrator'
3
5
 
4
6
  module XcodeSnippets
5
7
  class Main < Clamp::Command
@@ -36,6 +38,28 @@ module XcodeSnippets
36
38
  end
37
39
  end
38
40
 
41
+ subcommand "migrate", "Migrates existing Xcode snippets to a default bundle" do
42
+ option "--skip-confirm", :flag, "Skips confirmation before doing the migration"
43
+
44
+ def execute
45
+ snippets = migrator.migrate_snippets_from(XcodeSnippets.xcode_snippets_path, self)
46
+ migrator.clean_up
47
+ snippets
48
+ end
49
+
50
+ def migrator_should_proceed_with_migration?(migrator, snippets_to_migrate)
51
+ prompt = %Q{*********************************************************************
52
+ Warning: this will move #{snippets_to_migrate.count} code snippets under xcodesnippets control:
53
+ *********************************************************************
54
+
55
+ * #{snippets_to_migrate.map { |s| s.metadata.title}.join("\n* ")}
56
+
57
+ Continue? (y/n)
58
+ }
59
+ agree(prompt) unless skip_confirm?
60
+ end
61
+ end
62
+
39
63
  private
40
64
 
41
65
  def manager
@@ -45,6 +69,10 @@ module XcodeSnippets
45
69
  def manifest
46
70
  Manifest.load(XcodeSnippets.installation_path, XcodeSnippets.xcode_snippets_path)
47
71
  end
72
+
73
+ def migrator
74
+ @migrator ||= XcodeSnippets::Migrator.new(manager)
75
+ end
48
76
 
49
77
  end
50
78
  end
@@ -0,0 +1,42 @@
1
+ module XcodeSnippets
2
+ class Migrator
3
+ def initialize(snippet_manager)
4
+ @snippet_manager = snippet_manager
5
+ end
6
+
7
+ def migrate_snippets_from(path, confirmation_delegate = nil)
8
+ make_temp_dir(path)
9
+ snippet_files = Dir[File.join(path, "*.codesnippet")]
10
+
11
+ snippets = snippet_files.map do |snippet_path|
12
+ XcodeSnippets::Snippet.new(snippet_path)
13
+ end
14
+
15
+ if confirmation_delegate && confirmation_delegate.respond_to?(:migrator_should_proceed_with_migration?)
16
+ return unless confirmation_delegate.migrator_should_proceed_with_migration?(self, snippets)
17
+ end
18
+
19
+ temp_paths = snippets.map do |snippet|
20
+ File.join(@tmp_dir, "#{snippet.metadata.title}.codesnippet").tap do |temp_path|
21
+ FileUtils.mv(snippet.path, temp_path)
22
+ end
23
+ end
24
+
25
+ @snippet_manager.install_snippets_from_paths(temp_paths)
26
+ end
27
+
28
+ def clean_up
29
+ FileUtils.rm_rf(@tmp_dir) if @tmp_dir
30
+ @tmp_dir = nil
31
+ end
32
+
33
+ private
34
+
35
+ def make_temp_dir(path)
36
+ unless @tmp_dir
37
+ @tmp_dir = File.join(path, "migrator")
38
+ FileUtils.mkdir_p(@tmp_dir)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -30,6 +30,10 @@ module XcodeSnippets
30
30
  File.basename(@path)
31
31
  end
32
32
 
33
+ def metadata
34
+ @metadata ||= MetaData.from_file(path)
35
+ end
36
+
33
37
  def key
34
38
  @bundle ? "#{@bundle.name}/#{name}" : name
35
39
  end
@@ -41,5 +45,20 @@ module XcodeSnippets
41
45
  def symlinked?
42
46
  symlink && File.exist?(symlink)
43
47
  end
48
+
49
+ class MetaData
50
+ def initialize(data)
51
+ @data = data
52
+ end
53
+
54
+ def self.from_file(path)
55
+ raise "Could not parse metadata in file #{path}" unless File.exist?(path)
56
+ new(Plist.parse_xml(path))
57
+ end
58
+
59
+ def title
60
+ @data["IDECodeSnippetTitle"]
61
+ end
62
+ end
44
63
  end
45
64
  end
@@ -0,0 +1,11 @@
1
+ module XcodeSnippets
2
+ module Version
3
+ MAJOR = 0
4
+ MINOR = 2
5
+ TINY = 0
6
+
7
+ def self.to_s
8
+ "#{MAJOR}.#{MINOR}.#{TINY}"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,90 @@
1
+ require File.join(File.dirname(__FILE__), *%w[spec_helper])
2
+
3
+ describe "Migrator" do
4
+
5
+ before do
6
+ @manager = mock("manager")
7
+ @migrator = XcodeSnippets::Migrator.new(@manager)
8
+ create_example_xcode_snippets_directory
9
+ end
10
+
11
+ context "migrating existing snippets" do
12
+
13
+ it "copies each snippet to a temporary directory with a filename that reflects the snippet name" do
14
+ @manager.stub(:install_snippets_from_paths)
15
+ @migrator.migrate_snippets_from(XCODE_SNIPPET_PATH)
16
+ file_at(temporary_snippet_path_for("appledoc class.codesnippet")).should exist
17
+ end
18
+
19
+ it "removes the original snippet" do
20
+ @manager.stub(:install_snippets_from_paths)
21
+ @migrator.migrate_snippets_from(XCODE_SNIPPET_PATH)
22
+ file_at(xcode_snippet_path).should_not exist
23
+ end
24
+
25
+ it "installs each snippet from it's temporary location" do
26
+ @manager.should_receive(:install_snippets_from_paths).with([temporary_snippet_path_for("appledoc class.codesnippet")])
27
+ @migrator.migrate_snippets_from(XCODE_SNIPPET_PATH)
28
+ end
29
+
30
+ it "returns the created snippets" do
31
+ @manager.stub(:install_snippets_from_paths).and_return(["snippet"])
32
+ @migrator.migrate_snippets_from(XCODE_SNIPPET_PATH).should == ["snippet"]
33
+ end
34
+
35
+ end
36
+
37
+ context "migrating with a confirmation delegate" do
38
+
39
+ before do
40
+ @delegate = stub("confirmation-delegate")
41
+ end
42
+
43
+ it "migrates the snippets if the confirmation delegate returns true" do
44
+ @delegate.stub(:migrator_should_proceed_with_migration?).and_return(true)
45
+ @manager.should_receive(:install_snippets_from_paths)
46
+ @migrator.migrate_snippets_from(XCODE_SNIPPET_PATH, @delegate)
47
+ end
48
+
49
+ it "migrates the snippets if the confirmation delegate returns false" do
50
+ @delegate.stub(:migrator_should_proceed_with_migration?).and_return(false)
51
+ @manager.should_receive(:install_snippets_from_paths).never
52
+ @migrator.migrate_snippets_from(XCODE_SNIPPET_PATH, @delegate)
53
+ end
54
+
55
+ end
56
+
57
+ context "cleaning up after migration" do
58
+
59
+ before do
60
+ @manager.stub(:install_snippets_from_paths)
61
+ @migrator.migrate_snippets_from(XCODE_SNIPPET_PATH)
62
+ end
63
+
64
+ it "removes the temporary migrator directory" do
65
+ @migrator.clean_up
66
+ directory(File.join(XCODE_SNIPPET_PATH, "migrator")).should_not exist
67
+ end
68
+
69
+ end
70
+
71
+ private
72
+
73
+ def create_example_xcode_snippets_directory
74
+ FileUtils.cp(example_snippet_path, xcode_snippet_path)
75
+ end
76
+
77
+ def temporary_snippet_path_for(name)
78
+ File.join(XCODE_SNIPPET_PATH, "migrator", name)
79
+ end
80
+
81
+ def example_snippet_path
82
+ File.join(FIXTURES_PATH, "example.codesnippet")
83
+ end
84
+
85
+ def xcode_snippet_path
86
+ @guid ||= UUIDTools::UUID.timestamp_create
87
+ File.join(XCODE_SNIPPET_PATH, "#{@guid}.codesnippet")
88
+ end
89
+
90
+ end
@@ -25,6 +25,28 @@ class FakeUUIDGenerator
25
25
  end
26
26
  end
27
27
 
28
+ class FileQuery
29
+ def initialize(path)
30
+ @path = path
31
+ end
32
+
33
+ def exist?
34
+ File.exist?(@path)
35
+ end
36
+
37
+ def to_s
38
+ "<file at #{@path}>"
39
+ end
40
+ end
41
+
42
+ def file_at(path)
43
+ FileQuery.new(path)
44
+ end
45
+
46
+ def directory(path)
47
+ FileQuery.new(path)
48
+ end
49
+
28
50
  def setup_testing_environment!
29
51
  [SNIPPETS_PATH, XCODE_SNIPPET_PATH].each do |dir|
30
52
  FileUtils.rm_rf(dir) && FileUtils.mkdir_p(dir)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xcodesnippets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -14,7 +14,7 @@ default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: clamp
17
- requirement: &2152335840 !ruby/object:Gem::Requirement
17
+ requirement: &2156053140 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 0.2.1
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2152335840
25
+ version_requirements: *2156053140
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: uuidtools
28
- requirement: &2152335260 !ruby/object:Gem::Requirement
28
+ requirement: &2156045060 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 2.1.2
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *2152335260
36
+ version_requirements: *2156045060
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: plist
39
- requirement: &2152334680 !ruby/object:Gem::Requirement
39
+ requirement: &2156044380 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 3.1.0
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *2152334680
47
+ version_requirements: *2156044380
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rspec
50
- requirement: &2152334200 !ruby/object:Gem::Requirement
50
+ requirement: &2156043980 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *2152334200
58
+ version_requirements: *2156043980
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: cucumber
61
- requirement: &2152333660 !ruby/object:Gem::Requirement
61
+ requirement: &2156043300 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *2152333660
69
+ version_requirements: *2156043300
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: ruby-debug19
72
- requirement: &2152333120 !ruby/object:Gem::Requirement
72
+ requirement: &2156042600 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,7 +77,7 @@ dependencies:
77
77
  version: '0'
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *2152333120
80
+ version_requirements: *2156042600
81
81
  description:
82
82
  email: luke@lukeredpath.co.uk
83
83
  executables:
@@ -90,13 +90,16 @@ files:
90
90
  - README.md
91
91
  - bin/xcodesnippets
92
92
  - spec/bundle_spec.rb
93
+ - spec/migrator_spec.rb
93
94
  - spec/snippet_manager_spec.rb
94
95
  - spec/spec_helper.rb
95
96
  - lib/xcode_snippets/bundle.rb
96
97
  - lib/xcode_snippets/main.rb
97
98
  - lib/xcode_snippets/manifest.rb
99
+ - lib/xcode_snippets/migrator.rb
98
100
  - lib/xcode_snippets/snippet.rb
99
101
  - lib/xcode_snippets/snippet_manager.rb
102
+ - lib/xcode_snippets/version.rb
100
103
  - lib/xcode_snippets.rb
101
104
  has_rdoc: true
102
105
  homepage: http://lukeredpath.co.uk