mactag 0.5.4 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,70 +4,235 @@ module Mactag
4
4
  # Mactag DSL.
5
5
  #
6
6
  class Dsl
7
+ attr_reader :builder
8
+
7
9
  def initialize(builder)
8
10
  @builder = builder
9
11
  end
10
12
 
11
13
  ##
12
14
  #
13
- # @see Mactag::Tag::App
15
+ # This is the method used to index. Three different things can be
16
+ # indexed: the current project, gems and Rails (which really is a
17
+ # collection of gems).
14
18
  #
15
- def app(*tags)
16
- if tags.empty?
17
- raise ArgumentError.new('App requires at least one argument')
18
- end
19
-
20
- tags.each do |tag|
21
- @builder << Mactag::Tag::App.new(tag)
19
+ # = App
20
+ #
21
+ # App indexes files in the current project.
22
+ #
23
+ # == Examples
24
+ #
25
+ # Mactag do
26
+ # # Index single file.
27
+ # index 'lib/super_duper.rb'
28
+ #
29
+ # # Index all ruby files in lib, recursive.
30
+ # index 'lib/**/*.rb'
31
+ #
32
+ # # Index all helper and model ruby files.
33
+ # index 'app/helpers/*.rb', 'app/models/*.rb'
34
+ #
35
+ # # Same as above
36
+ # index 'app/{models,helpers}/*.rb'
37
+ # end
38
+ #
39
+ #
40
+ # = Gem
41
+ #
42
+ # Index Ruby gems.
43
+ #
44
+ # == Examples
45
+ #
46
+ # Mactag do
47
+ # # Index all gems specified in Gemfile.
48
+ # index :gems
49
+ #
50
+ # # Index the gem whenever, latest version.
51
+ # index 'whenever'
52
+ #
53
+ # # Index the thinking-sphinx and carrierwave gems, latest versions.
54
+ # index 'thinking-sphinx', 'carrierwave'
55
+ #
56
+ # # Index the gem simple_form, version 1.5.2.
57
+ # index 'simple_form', :version => '1.5.2'
58
+ # end
59
+ #
60
+ #
61
+ # = Rails
62
+ #
63
+ # Index Rails.
64
+ #
65
+ # == Packages
66
+ #
67
+ # These are the packages that can be indexed. Naming does not
68
+ # matter, so <tt>activerecord</tt> and <tt>active_record</tt> are
69
+ # the same.
70
+ #
71
+ # * actionmailer
72
+ # * actionpack
73
+ # * activemodel
74
+ # * activerecord
75
+ # * activeresource
76
+ # * railties
77
+ # * activesupport
78
+ #
79
+ #
80
+ # == Examples
81
+ #
82
+ # Mactag do
83
+ # # Index all packages, same version as application
84
+ # index :rails
85
+ #
86
+ # # Index all packages, version 3.1.3
87
+ # index :rails, :version => '3.1.3'
88
+ #
89
+ # # Index all packages except activerecord, same version as application
90
+ # index :rails, :except => :activerecord
91
+ #
92
+ # # Index only activerecord and actionview, same version as application
93
+ # index :rails, :only => [:activerecord, :action_view]
94
+ #
95
+ # # Index all packages except activerecord and actionview,
96
+ # # same version as application
97
+ # index :rails, :except => ['activerecord', :action_controller]
98
+ #
99
+ # # Index all packages except actionmailer, version 3.1.3
100
+ # index :rails, :except => :actionmailer, :version => '3.1.3'
101
+ # end
102
+ #
103
+ def index(*args)
104
+ if args.first == :app
105
+ app_private
106
+ elsif args.first == :gems
107
+ gem_private
108
+ elsif args.first == :rails
109
+ rails_private(*args)
110
+ else
111
+ options = args.last
112
+
113
+ if options[:version] && args.size > 2
114
+ raise ArgumentError.new('The :version option is not valid when specifying more than one gem')
115
+ end
116
+
117
+ if options.is_a?(Hash) || args.all? { |arg| Mactag::Indexer::Gem.exist?(arg) }
118
+ gem_private(*args)
119
+ else
120
+ app_private(*args)
121
+ end
22
122
  end
23
123
  end
24
124
 
25
125
  ##
26
126
  #
27
- # @see Mactag::Tag::Plugin
127
+ # <b>DEPRECATED:</b> Please use '#index' instead.
28
128
  #
29
- def plugin(*plugins)
30
- if plugins.empty?
31
- plugins = Mactag::Tag::Plugin.all
32
- end
129
+ def app(*args)
130
+ $stderr.puts '[DEPRECATION] Please use #index instead of #app.'
33
131
 
34
- plugins.each do |plugin|
35
- @builder << Mactag::Tag::Plugin.new(plugin)
132
+ if args.empty?
133
+ index(:app)
134
+ else
135
+ index(*args)
36
136
  end
37
137
  end
38
- alias :plugins :plugin
39
138
 
40
139
  ##
41
140
  #
42
- # @see Mactag::Tag::Gem
141
+ # <b>DEPRECATED:</b> Please use '#index' instead.
43
142
  #
44
- def gem(*gems)
45
- options = gems.extract_options!
46
-
47
- if options[:version] && gems.size > 1
48
- raise ArgumentError.new('The :version option is not valid when specifying more than one gem')
49
- end
143
+ def gem(*args)
144
+ $stderr.puts '[DEPRECATION] Please use #index instead of #gems.'
50
145
 
51
- if gems.empty?
52
- @builder << Mactag::Tag::Gem.all
146
+ if args.empty?
147
+ index(:gems)
53
148
  else
54
- gems.each do |gem|
55
- @builder << Mactag::Tag::Gem.new(gem, options[:version])
56
- end
149
+ index(*args)
57
150
  end
58
151
  end
59
152
  alias :gems :gem
60
153
 
61
154
  ##
62
155
  #
63
- # @see Mactag::Tag::Rails
156
+ # <b>DEPRECATED:</b> Please use '#index' instead.
157
+ #
158
+ def rails(*args)
159
+ $stderr.puts '[DEPRECATION] Please use #index instead of #rails.'
160
+
161
+ if args.empty?
162
+ index(:rails)
163
+ else
164
+ index(*args)
165
+ end
166
+ end
167
+
168
+
169
+ ##
170
+ #
171
+ # <b>DEPRECATED:</b> Please use gems instead.
172
+ #
173
+ # @see Mactag::Indexer::Plugin
64
174
  #
65
- def rails(options = {})
175
+ def plugin(*plugins)
176
+ $stderr.puts '[DEPRECATION] Please use gems instead of plugins.'
177
+
178
+ plugin_private(*plugins)
179
+ end
180
+ alias :plugins :plugin
181
+
182
+
183
+ private
184
+
185
+ def app_private(*tags)
186
+ if tags.empty?
187
+ @builder << Mactag::Indexer::App.all
188
+ else
189
+ tags.each do |tag|
190
+ @builder << Mactag::Indexer::App.new(tag)
191
+ end
192
+ end
193
+ end
194
+
195
+ def gem_private(*args)
196
+ if args.empty?
197
+ @builder << Mactag::Indexer::Gem.all
198
+ else
199
+ options = args.last
200
+
201
+ if version = options[:version]
202
+ @builder << Mactag::Indexer::Gem.new(args.first, version)
203
+ else
204
+ args.each do |arg|
205
+ @builder << Mactag::Indexer::Gem.new(arg)
206
+ end
207
+ end
208
+ end
209
+ end
210
+
211
+ def rails_private(*args)
212
+ args.shift
213
+
214
+ if args.size.zero?
215
+ options = {}
216
+ else
217
+ options = args.first
218
+ end
219
+
66
220
  if options[:only] && options[:except]
67
221
  raise ArgumentError.new('Can not specify options :only and :except at the same time')
68
222
  end
69
-
70
- @builder << Mactag::Tag::Rails.new(options)
223
+
224
+ @builder << Mactag::Indexer::Rails.new(options)
225
+ end
226
+
227
+ def plugin_private(*plugins)
228
+ if plugins.empty?
229
+ @builder << Mactag::Indexer::Plugin.all
230
+ else
231
+ plugins.each do |plugin|
232
+ @builder << Mactag::Indexer::Plugin.new(plugin)
233
+ end
234
+ end
71
235
  end
72
236
  end
73
237
  end
238
+
@@ -0,0 +1,9 @@
1
+ require 'mactag/indexer/app'
2
+ require 'mactag/indexer/plugin'
3
+ require 'mactag/indexer/gem'
4
+ require 'mactag/indexer/rails'
5
+
6
+ module Mactag
7
+ module Indexer
8
+ end
9
+ end
@@ -0,0 +1,22 @@
1
+ module Mactag
2
+ module Indexer
3
+ class App
4
+ attr_reader :tag
5
+
6
+ PATTERNS = ['app/**/*.rb', 'lib/**/*.rb']
7
+
8
+ def initialize(tag)
9
+ @tag = tag
10
+ end
11
+
12
+
13
+ class << self
14
+ def all
15
+ PATTERNS.map do |pattern|
16
+ new(pattern)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,72 @@
1
+ module Mactag
2
+ module Indexer
3
+ class Gem
4
+ attr_accessor :name
5
+ attr_writer :version
6
+
7
+ def initialize(name, version = nil)
8
+ @name = name
9
+ @version = version
10
+ end
11
+
12
+ def tag
13
+ if exist?
14
+ File.join(Mactag::Config.gem_home, combo, 'lib', '**', '*.rb')
15
+ else
16
+ raise GemNotFoundError.new(self)
17
+ end
18
+ end
19
+
20
+ def exist?
21
+ dirs.size > 0
22
+ end
23
+
24
+ def version
25
+ @version || most_recent
26
+ end
27
+
28
+ def most_recent
29
+ unless dirs.empty?
30
+ if dirs.size == 1
31
+ gem = dirs.first
32
+ else
33
+ gem = dirs.sort.last
34
+ end
35
+ regex = /#{escaped_name}-([^\/]+)/
36
+
37
+ if match = regex.match(gem)
38
+ match[1]
39
+ end
40
+ end
41
+ end
42
+
43
+ def dirs
44
+ @dirs ||= Dir.glob(File.join(Mactag::Config.gem_home, "#{name}-*"))
45
+ end
46
+
47
+ class << self
48
+ def all
49
+ gems = Mactag::Bundler.gems
50
+ gems.map do |name, version|
51
+ new(name, version)
52
+ end
53
+ end
54
+
55
+ def exist?(name)
56
+ new(name).exist?
57
+ end
58
+ end
59
+
60
+
61
+ private
62
+
63
+ def combo
64
+ "#{name}-#{version}"
65
+ end
66
+
67
+ def escaped_name
68
+ Regexp.escape(name)
69
+ end
70
+ end
71
+ end
72
+ end
@@ -1,18 +1,19 @@
1
1
  module Mactag
2
- module Tag
2
+ module Indexer
3
3
  ##
4
4
  #
5
5
  # Tag plugins in Rails project.
6
6
  #
7
7
  # ==== Examples
8
+ #
8
9
  # Mactag do
9
- # # Tag single plugin
10
+ # # Index single plugin.
10
11
  # plugin 'whenever'
11
12
  #
12
- # # Tag multiple plugins
13
+ # # Index multiple plugins.
13
14
  # plugins 'thinking-sphinx', 'formtastic'
14
15
  #
15
- # # Tag all plugins
16
+ # # Index all plugins.
16
17
  # plugins
17
18
  # do
18
19
  #
@@ -26,14 +27,14 @@ module Mactag
26
27
  end
27
28
 
28
29
  def tag
29
- if exists?
30
- return File.join(PLUGIN_PATH, name, 'lib', '**', '*.rb')
30
+ if exist?
31
+ File.join(PLUGIN_PATH, name, 'lib', '**', '*.rb')
31
32
  else
32
33
  raise PluginNotFoundError.new(self)
33
34
  end
34
35
  end
35
36
 
36
- def exists?
37
+ def exist?
37
38
  File.directory?(path)
38
39
  end
39
40
 
@@ -43,8 +44,8 @@ module Mactag
43
44
 
44
45
  def self.all
45
46
  pattern = File.join(PLUGIN_PATH, '*')
46
- Dir.glob(pattern).map do |f|
47
- File.basename(f)
47
+ Dir.glob(pattern).map do |file|
48
+ new(File.basename(file))
48
49
  end
49
50
  end
50
51
  end
@@ -0,0 +1,46 @@
1
+ module Mactag
2
+ module Indexer
3
+ class Rails
4
+
5
+ PACKAGES = %w(actionmailer actionpack activemodel activerecord activeresource activesupport railties)
6
+
7
+ attr_accessor :only, :except, :version
8
+
9
+ def initialize(options)
10
+ @only = packagize(options[:only])
11
+ @except = packagize(options[:except])
12
+ @version = options[:version]
13
+ end
14
+
15
+ def tag
16
+ packages.inject([]) do |array, package|
17
+ array << Gem.new(package, version).tag
18
+ array
19
+ end
20
+ end
21
+
22
+ def packages
23
+ if only || except
24
+ only || PACKAGES - except
25
+ else
26
+ PACKAGES
27
+ end
28
+ end
29
+
30
+ def version
31
+ @version || ::Rails.version
32
+ end
33
+
34
+
35
+ private
36
+
37
+ def packagize(pkgs)
38
+ return nil if pkgs.blank?
39
+
40
+ Array(pkgs).map do |pkg|
41
+ "#{pkg}".gsub(/[^a-z]/, '')
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end