guard-xcoder 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Franklin Webber
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,59 @@
1
+ # Guard-Shell
2
+
3
+ This little addition (1 proper line of code!) to guard allows you to run shell
4
+ commands when certain files are altered.
5
+
6
+
7
+ ## Install
8
+
9
+ Make sure you have [guard](http://github.com/guard/guard) installed.
10
+
11
+ Install the gem with:
12
+
13
+ gem install guard-shell
14
+
15
+ Add it to your Gemfile:
16
+
17
+ gem 'guard-shell'
18
+
19
+ And then add a basic setup to your Guardfile:
20
+
21
+ guard init shell
22
+
23
+
24
+ ## Usage
25
+
26
+ If you can do something in your shell, it is probably very easy to setup with guard-shell, here are a few examples.
27
+
28
+
29
+ #### Creating Backups of Files On Change
30
+
31
+ guard 'shell' do
32
+ # create a copy of the file with '.backup' at the end
33
+ watch('(.*)') {|m| `cp #{m[0]} #{m[0]}.backup` }
34
+ end
35
+
36
+
37
+ #### Showing git st
38
+
39
+ guard 'shell' do
40
+ watch('.*') { `git st` }
41
+ end
42
+
43
+
44
+ #### Rebuilding a LaTeX File
45
+
46
+ guard 'shell' do
47
+ # builds latex file to pdf and hides output
48
+ watch('(.*).tex') do |m|
49
+ `pdflatex -shell-escape #{m[0]} 1>/dev/null`
50
+ puts "built #{m[1]}.pdf"
51
+ end
52
+ end
53
+
54
+
55
+ #### Saying the Name of the File You Changed
56
+
57
+ guard 'shell' do
58
+ watch('(.*)') {|m| `say #{m[0]}` }
59
+ end
@@ -0,0 +1,142 @@
1
+ require 'guard'
2
+ require 'guard/guard'
3
+ require 'xcoder'
4
+
5
+ module Guard
6
+ class Xcoder < Guard
7
+
8
+ VERSION = '0.1.0'
9
+
10
+ def default_builder_actions
11
+ [ :build ]
12
+ end
13
+
14
+ def default_paths
15
+ [ '.' ]
16
+ end
17
+
18
+ def initialize(watchers=[], options = {})
19
+ @options = {
20
+ :actions => default_builder_actions,
21
+ :paths => default_paths,
22
+ }.update(options)
23
+
24
+ @paths = @options[:paths]
25
+ file_watchers = file_watchers_for_project_watchers watchers
26
+ watchers.replace file_watchers
27
+
28
+ super
29
+ end
30
+
31
+ def start
32
+ projects
33
+ UI.info "[Guard::Xcoder] is now monitoring #{projects.map {|p| p.name }.join(", ")}"
34
+ end
35
+
36
+ def run_all
37
+
38
+ projects.each do |project|
39
+ project.targets.each do |target|
40
+ config = target.config('Debug')
41
+ UI.info(("*" * 80))
42
+ UI.info "Building #{project.name} - #{target.name} - #{config.name}"
43
+ UI.info(("*" * 80))
44
+ config.builder.build
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+ #
51
+ # @param [Array<String>] commands to execute
52
+ #
53
+ def run_on_change(commands)
54
+
55
+ project_name, target_name, config_name = commands.first.split("//")
56
+ builder = Xcode.project(project_name).target(target_name).config(config_name).builder
57
+
58
+ UI.info "[Guard::Xcoder] Performing [ #{@options[:actions].join(", ")} ] for #{project_name} > #{target_name} > #{config_name}"
59
+
60
+ Array(@options[:actions]).each do |operation|
61
+ builder.send(operation)
62
+ end
63
+
64
+ end
65
+
66
+ def projects
67
+ @project ||= begin
68
+ # TODO: projects found multiple times will be duplicated.
69
+ @paths.map {|path| Xcode.find_projects path }.flatten.compact
70
+ end
71
+ end
72
+
73
+ #
74
+ # @param [Array<Watcher>] watchers the existing watchers defined within the Guardfile that specify the path the project, target,
75
+ # and config.
76
+ # @return [Array<Watcher>] a new list of watchers for every file within the matching project > target. Each watcher when matched
77
+ # will return a path to the project//target//config that needs to be built.
78
+ #
79
+ def file_watchers_for_project_watchers(watchers)
80
+
81
+ watchers.map do |watcher|
82
+ watchers_for_source_files_in(watcher.pattern)
83
+ end.flatten.compact
84
+
85
+ end
86
+
87
+ def watchers_for_source_files_in pattern
88
+
89
+ targets_in_path(pattern).map do |target|
90
+
91
+ # TODO: this is currently hard-coded to Debug configuration, though the user can specify Release
92
+
93
+ build_action = lambda { "#{target.project.name}//#{target.name}//Debug" }
94
+
95
+ project_root_dir = File.join(File.dirname(target.project.path), target.name)
96
+
97
+ # Create a watcher for all source build files specified within the target
98
+
99
+ new_guards = target.sources_build_phase.build_files.map do |file|
100
+ full_source_path = File.join(project_root_dir,file.path)
101
+ puts "Source Path: #{full_source_path}"
102
+ create_guard_for full_source_path, build_action
103
+ end
104
+
105
+ # Create a watcher for the pch if one has been specified.
106
+ if target.config('Debug').prefix_header
107
+ prefix_header_path = File.join(File.dirname(target.project.path), target.config('Debug').prefix_header)
108
+ puts prefix_header_path
109
+ new_guards << create_guard_for(prefix_header_path, build_action)
110
+ end
111
+
112
+ new_guards
113
+
114
+ end.flatten.compact
115
+
116
+ end
117
+
118
+ def targets_in_path(pattern)
119
+
120
+ project_name, target_name, config_name = pattern.split("//")
121
+ projects.find_all {|project| project.name == project_name }.map do |project|
122
+ if target_name
123
+ project.targets.find_all {|target| target.name == target_name }
124
+ else
125
+ project.targets
126
+ end
127
+ end.flatten.compact
128
+
129
+ end
130
+
131
+ def create_guard_for full_source_path, command
132
+ relative_source_path = full_source_path.gsub("#{::Guard.listener.directory}/",'')
133
+
134
+ # Given a file that is meant for the sources build phase, it
135
+ # is likely that the file has an accompanying header file so
136
+ # we expand the pattern to include that.
137
+
138
+ source_regex = Regexp.new( Regexp.escape(relative_source_path).to_s.gsub(/(?:m?m)$/,'(?:m?m|h)') )
139
+ ::Guard::Watcher.new(source_regex,command)
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,24 @@
1
+ #
2
+ # guard-xcoder accepts the following parameters:
3
+ #
4
+ # actions => a list of actions that you want to take with the
5
+ # instance of the Builder object for the matching file. This
6
+ # is generally actions like :clean, :build, and :package
7
+ #
8
+ #
9
+ # guard-xcoder defines watchers differently as individual files
10
+ # identified instead the path to the particular project target
11
+ # that you want built.
12
+ guard 'xcoder', :actions => [ :clean, :build ] do
13
+ #
14
+ # builds when any source file within the 'ProjectName' project changes
15
+ # for any target
16
+ watch('ProjectName')
17
+
18
+ #
19
+ # builds when any source file within the project 'Project2' target named
20
+ # 'FirstTarget' has changed.
21
+ #
22
+ watch('Project2//FirstTarget')
23
+
24
+ end
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: guard-xcoder
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Franklin Webber
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-04 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: guard
16
+ requirement: &70236298801440 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.10.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70236298801440
25
+ - !ruby/object:Gem::Dependency
26
+ name: bundler
27
+ requirement: &70236298800540 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '1.0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70236298800540
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ requirement: &70236298799500 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '2.0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70236298799500
47
+ - !ruby/object:Gem::Dependency
48
+ name: guard-rspec
49
+ requirement: &70236298798520 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70236298798520
58
+ description: Guard::Xcoder performs project operations when project files are modified.
59
+ email:
60
+ - franklin.webber@gmail.com
61
+ executables: []
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - lib/guard/xcoder/templates/Guardfile
66
+ - lib/guard/xcoder.rb
67
+ - LICENSE
68
+ - README.md
69
+ homepage: http://github.com/burtlo/guard-xcoder
70
+ licenses: []
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: 1.3.6
87
+ requirements: []
88
+ rubyforge_project: guard-xcoder
89
+ rubygems_version: 1.8.15
90
+ signing_key:
91
+ specification_version: 3
92
+ summary: Guard gem for performing commands with Xcode projects
93
+ test_files: []
94
+ has_rdoc: