claide 0.9.1 → 1.0.0.beta.1

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: 3de5ee97a4489d93a9dc6765777abe615f7c70c3
4
- data.tar.gz: 631599e1a27b148d8e50cd70cf3d00f773fa16a7
3
+ metadata.gz: 8a888d4809588a8ca94222c78932a36cfac67940
4
+ data.tar.gz: babd101e0982e0a7f8a426b4cc39ba49a282c3b3
5
5
  SHA512:
6
- metadata.gz: a31965b426cc1b1f81003bb3084c70a98a4a8cb676122039d8a6717c746ef2122e6bd4ef7efc306d7fd05967a9996a5aeeaccc0743d19ef90b28f9e01a28bf02
7
- data.tar.gz: 7bef4e23b6e02a283f543e502f6921f385c3c372392c0c3c8fbeb958ac68bb3b20a4512efe975f2541ef01cfec61cb78cbdc83ff9b6c6a070033104de24e01a5
6
+ metadata.gz: a909e58b2f88c4fe849466a1808866dbfe85189e8ec05f3d8a6be04e4ab3a5929fdd90e1dc70b14ac19adee19b81766ca48adef3ccfc6f210f48c889c61ac4cd
7
+ data.tar.gz: ddb80f1c803f42e6940736b43236828082cd91658fa4199351534072627e84148f2b280253e93d9ca39ea68fce1503006336d923d29333ba4beee4234346f76e
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ InstalledFiles
7
+ _yardoc
8
+ coverage
9
+ doc/
10
+ lib/bundler/man
11
+ pkg
12
+ rdoc
13
+ spec/reports
14
+ test/tmp
15
+ test/version_tmp
16
+ tmp
17
+ .idea
data/.kick ADDED
@@ -0,0 +1,30 @@
1
+ recipe :ruby
2
+
3
+ Kicker::Recipes::Ruby.runner_bin = 'bundle exec bacon --quiet'
4
+
5
+ process do |files|
6
+ specs = files.take_and_map do |file|
7
+ if file =~ %r{lib/[^/]*/(.+?)\.rb$}
8
+ s = Dir.glob("spec/**/#{File.basename(file, '.rb')}_spec.rb")
9
+ s.uniq unless s.empty?
10
+ end
11
+ end
12
+ Kicker::Recipes::Ruby.run_tests(specs)
13
+ end
14
+
15
+ # Have written this so many times, probably should make a recipe out of it.
16
+ process do |files|
17
+ files.each do |file|
18
+ case file
19
+ when 'Gemfile'
20
+ files.delete(file)
21
+ execute 'bundle install'
22
+ end
23
+ end
24
+ end
25
+
26
+ recipe :ignore
27
+ ignore(/.*\/?tags/)
28
+ ignore(/.*\/?\.git/)
29
+ ignore(/^tmp/)
30
+
@@ -0,0 +1,2 @@
1
+ inherit_from:
2
+ - .rubocop_cocoapods.yml
@@ -0,0 +1,116 @@
1
+ AllCops:
2
+ Include:
3
+ - ./Rakefile
4
+ - ./Gemfile
5
+ - ./*.gemspec
6
+ Exclude:
7
+ - ./spec/fixtures/**/*
8
+
9
+ # At the moment not ready to be used
10
+ # https://github.com/bbatsov/rubocop/issues/947
11
+ Documentation:
12
+ Enabled: false
13
+
14
+ #- CocoaPods -----------------------------------------------------------------#
15
+
16
+ # We adopted raise instead of fail.
17
+ SignalException:
18
+ EnforcedStyle: only_raise
19
+
20
+ # They are idiomatic
21
+ AssignmentInCondition:
22
+ Enabled: false
23
+
24
+ # Allow backticks
25
+ AsciiComments:
26
+ Enabled: false
27
+
28
+ # Indentation clarifies logic branches in implementations
29
+ IfUnlessModifier:
30
+ Enabled: false
31
+
32
+ # No enforced convention here.
33
+ SingleLineBlockParams:
34
+ Enabled: false
35
+
36
+ # We only add the comment when needed.
37
+ Encoding:
38
+ Enabled: false
39
+
40
+ # Having these make it easier to *not* forget to add one when adding a new
41
+ # value and you can simply copy the previous line.
42
+ TrailingComma:
43
+ EnforcedStyleForMultiline: comma
44
+
45
+ Style/MultilineOperationIndentation:
46
+ EnforcedStyle: indented
47
+
48
+ # Clashes with CLAide Command#validate!
49
+ GuardClause:
50
+ Enabled: false
51
+
52
+ # Not always desirable: lib/claide/command/plugins_helper.rb:12:15
53
+ Next:
54
+ Enabled: false
55
+
56
+ # Arbitrary max lengths for classes simply do not work and enabling this will
57
+ # lead to a never ending stream of annoyance and changes.
58
+ Metrics/ClassLength:
59
+ Enabled: false
60
+
61
+ # Arbitrary max lengths for methods simply do not work and enabling this will
62
+ # lead to a never ending stream of annoyance and changes.
63
+ Metrics/MethodLength:
64
+ Enabled: false
65
+
66
+ # No enforced convention here.
67
+ Metrics/BlockNesting:
68
+ Enabled: false
69
+
70
+ # It will be obvious which code is complex, Rubocop should only lint simple
71
+ # rules for us.
72
+ Metrics/AbcSize:
73
+ Enabled: false
74
+
75
+ # It will be obvious which code is complex, Rubocop should only lint simple
76
+ # rules for us.
77
+ Metrics/CyclomaticComplexity:
78
+ Enabled: false
79
+
80
+ #- CocoaPods support for Ruby 1.8.7 ------------------------------------------#
81
+
82
+ HashSyntax:
83
+ EnforcedStyle: hash_rockets
84
+
85
+ Lambda:
86
+ Enabled: false
87
+
88
+ DotPosition:
89
+ EnforcedStyle: trailing
90
+
91
+ EachWithObject:
92
+ Enabled: false
93
+
94
+ Style/SpecialGlobalVars:
95
+ Enabled: false
96
+
97
+ #- CocoaPods specs -----------------------------------------------------------#
98
+
99
+ # Allow for `should.match /regexp/`.
100
+ AmbiguousRegexpLiteral:
101
+ Exclude:
102
+ - spec/**/*
103
+
104
+ # Allow `object.should == object` syntax.
105
+ Void:
106
+ Exclude:
107
+ - spec/**/*
108
+
109
+ ClassAndModuleChildren:
110
+ Exclude:
111
+ - spec/**/*
112
+
113
+ UselessComparison:
114
+ Exclude:
115
+ - spec/**/*
116
+
@@ -0,0 +1,15 @@
1
+ language: ruby
2
+ addons:
3
+ code_climate:
4
+ repo_token: 46c8b29dd6711f35704e7c5a541486cbbf2cff8b2df8ce755bfc09917d3c1cbb
5
+ branches:
6
+ only:
7
+ - master
8
+ - /.+-stable$/
9
+ rvm:
10
+ - 1.8.7
11
+ - 1.9.3
12
+ - 2.1.1
13
+ bundler_args: --without development
14
+ script: bundle exec rake spec
15
+
@@ -0,0 +1 @@
1
+ --markup markdown --protected --charset=utf-8 lib
@@ -0,0 +1,174 @@
1
+ # CLAide Changelog
2
+
3
+ ## 1.0.0.beta.1 (2015-12-30)
4
+
5
+ ##### Bug Fixes
6
+
7
+ * The plugin manager will now properly activate plugin gems, ensuring all of
8
+ their files are requirable.
9
+ [Samuel Giddins](https://github.com/segiddins)
10
+
11
+
12
+ ## 0.9.1 (2015-07-05)
13
+
14
+ ##### Bug Fixes
15
+
16
+ * Fix a regression when contradictory flags were given in `ARGV` -- the last
17
+ flag given will once again be the value returned, and all entries for that key
18
+ are removed.
19
+ [Samuel Giddins](https://github.com/segiddins)
20
+
21
+
22
+ ## 0.9.0 (2015-07-02)
23
+
24
+ ##### Enhancements
25
+
26
+ * Properly parse everything in `ARGV` after `--` as an argument.
27
+ [Samuel Giddins](https://github.com/segiddins)
28
+ [#48](https://github.com/CocoaPods/CLAide/issues/48)
29
+
30
+ * Allow parsing an option that occurs multiple times.
31
+ [Samuel Giddins](https://github.com/segiddins)
32
+
33
+
34
+ ## 0.8.2 (2015-06-27)
35
+
36
+ ##### Enhancements
37
+
38
+ * Add `ARGV#remainder!`, which returns all the remaining arguments, deleting
39
+ them from the receiver.
40
+ [Samuel Giddins](https://github.com/segiddins)
41
+
42
+
43
+ ## 0.8.1 (2015-02-25)
44
+
45
+ ###### Bug Fixes
46
+
47
+ * Silence errors while loading plugins.
48
+ [Clément Beffa](https://github.com/cl3m)
49
+ [#44](https://github.com/CocoaPods/CLAide/issues/44)
50
+
51
+
52
+ ## 0.8.0 (2014-12-25)
53
+
54
+ ###### Breaking
55
+
56
+ * Removes the `ShellCompletionHelper` along with completion script for ZSH. This is out of the scope of CLAide.
57
+ [Eloy Durán](https://github.com/alloy)
58
+ [#43](https://github.com/CocoaPods/CLAide/issues/43)
59
+
60
+ * Various refactoring replacing “Helper” API’s which specialised classes such as ArgumentSuggester, TextWrapper and PluginManager.
61
+ [Eloy Durán](https://github.com/alloy)
62
+
63
+ ###### Enhancements
64
+
65
+ * Added convenience method to invoke commands more easily.
66
+ [Olivier Halligon](https://github.com/AliSoftware)
67
+ [#33](https://github.com/CocoaPods/CLAide/issues/40)
68
+
69
+ * Changes to the PluginManager to handle multiple plugin prefixes, which by default adds the `clad` plugin prefix.
70
+ [Eloy Durán](https://github.com/alloy)
71
+
72
+ ## 0.7.0 (2014-09-11)
73
+
74
+ ###### Breaking
75
+
76
+ * Plugins are now expected to include the `cocoapods-plugin.rb` file in
77
+ `./lib`.
78
+ [Fabio Pelosin](https://github.com/fabiopelosin)
79
+ [#28](https://github.com/CocoaPods/CLAide/pull/28)
80
+
81
+ ###### Enhancements
82
+
83
+ * Improved messages for exceptions generated by plugins.
84
+ [Fabio Pelosin](https://github.com/fabiopelosin)
85
+ [#28](https://github.com/CocoaPods/CLAide/pull/28)
86
+
87
+ * Use the Argument class to describe arguments.
88
+ [Olivier Halligon](https://github.com/AliSoftware)
89
+ [#33](https://github.com/CocoaPods/CLAide/issues/33)
90
+
91
+ * Support for argument alternatives and repeatable arguments (ellipsis).
92
+ [Olivier Halligon](https://github.com/AliSoftware)
93
+ [#33](https://github.com/CocoaPods/CLAide/issues/33)
94
+
95
+ * No stack trace if --help and --vebose are combined.
96
+ [Marius Rackwitz](https://github.com/mrackwitz)
97
+ [#36](https://github.com/CocoaPods/CLAide/issues/36)
98
+
99
+
100
+ ## 0.6.1 (2014-05-20)
101
+
102
+ ###### Bug Fixes
103
+
104
+ * Respect the ANSI flag for the help banner.
105
+ [Fabio Pelosin](https://github.com/fabiopelosin)
106
+ [#34](https://github.com/CocoaPods/CLAide/issues/34)
107
+
108
+ * Underline the colon of the titles of the help banner.
109
+ [Fabio Pelosin](https://github.com/fabiopelosin)
110
+
111
+ ## 0.6.0 (2014-05-19)
112
+
113
+ ###### Enhancements
114
+
115
+ * Use an array to describe arguments.
116
+ [Fabio Pelosin][fabiopelosin]
117
+ [#26](https://github.com/CocoaPods/CLAide/issues/26)
118
+
119
+ * Improved layout and contents of help banner
120
+ [Fabio Pelosin](https://github.com/fabiopelosin)
121
+ [#25](https://github.com/CocoaPods/CLAide/pull/25)
122
+
123
+ * Colorize option, arguments, and example commands in the help banner.
124
+ [Fabio Pelosin](https://github.com/fabiopelosin)
125
+ [#12](https://github.com/CocoaPods/CLAide/issues/12)
126
+
127
+ * Add support for ANSI escape sequences.
128
+ [Fabio Pelosin](https://github.com/fabiopelosin)
129
+ [#17](https://github.com/CocoaPods/CLAide/issues/17)
130
+ [#20](https://github.com/CocoaPods/CLAide/pull/20)
131
+ [#24](https://github.com/CocoaPods/CLAide/pull/24)
132
+
133
+ * Add support for completion script
134
+ [Fabio Pelosin](https://github.com/fabiopelosin)
135
+ [#19](https://github.com/CocoaPods/CLAide/pull/19)
136
+
137
+ * Add support for version logic via the introduction of the `version` class
138
+ attribute to the `CLAide::Commmand` class. If a value for the attribute is
139
+ specified the `--version` flag is added. The `--version --verbose` flags
140
+ include the version of the plugins in the output.
141
+ [Fabio Pelosin](https://github.com/fabiopelosin)
142
+ [#13](https://github.com/CocoaPods/CLAide/issues/13)
143
+ [#14](https://github.com/CocoaPods/CLAide/issues/14)
144
+
145
+ ## 0.5.0 (2014-03-26)
146
+
147
+ ###### Enhancements
148
+
149
+ * Add a `ignore_in_command_lookup` option to commands, which makes it possible
150
+ to have anonymous command classes that are or only meant to provide common
151
+ functionality, but are otherwise completely ignored during parsing, command
152
+ lookup, and help banner printing.
153
+ [Eloy Durán](https://github.com/alloy)
154
+
155
+ * Deprecate the `color` option in favor of `ansi`. This is more abstract and
156
+ can be used for commands that only prettify output by using, for instance,
157
+ the bold ANSI code. This applies to the `CLAide` APIs as well.
158
+ [Eloy Durán](https://github.com/alloy)
159
+
160
+ * Add more hooks that allow the user to customize how to prettify output.
161
+ [Eloy Durán](https://github.com/alloy)
162
+
163
+ * Word wrap option descriptions to terminal width.
164
+ [Eloy Durán](https://github.com/alloy)
165
+ [#6](https://github.com/CocoaPods/CLAide/issues/6)
166
+
167
+
168
+ ## 0.4.0 (2013-11-14)
169
+
170
+ ###### Enhancements
171
+
172
+ * Added support for plugins.
173
+ [Les Hill](https://github.com/leshill)
174
+ [#1](https://github.com/CocoaPods/CLAide/pull/1)
data/Gemfile ADDED
@@ -0,0 +1,23 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'rake'
6
+
7
+ group :development do
8
+ gem 'kicker'
9
+ gem 'colored' # for examples
10
+ end
11
+
12
+ group :spec do
13
+ gem 'bacon'
14
+ gem 'json'
15
+ gem 'mocha-on-bacon'
16
+ gem 'prettybacon'
17
+
18
+ if RUBY_VERSION >= '1.9.3'
19
+ gem 'rubocop'
20
+ gem 'codeclimate-test-reporter', :require => nil
21
+ gem 'simplecov'
22
+ end
23
+ end
@@ -0,0 +1,75 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ claide (1.0.0.beta.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ ast (2.0.0)
10
+ astrolabe (1.3.0)
11
+ parser (>= 2.2.0.pre.3, < 3.0)
12
+ bacon (1.2.0)
13
+ codeclimate-test-reporter (0.4.1)
14
+ simplecov (>= 0.7.1, < 1.0.0)
15
+ colored (1.2)
16
+ docile (1.1.5)
17
+ ffi (1.9.6)
18
+ json (1.8.3)
19
+ kicker (3.0.0)
20
+ listen (~> 1.3.0)
21
+ notify (~> 0.5.2)
22
+ listen (1.3.1)
23
+ rb-fsevent (>= 0.9.3)
24
+ rb-inotify (>= 0.9)
25
+ rb-kqueue (>= 0.2)
26
+ metaclass (0.0.4)
27
+ mocha (1.1.0)
28
+ metaclass (~> 0.0.1)
29
+ mocha-on-bacon (0.2.2)
30
+ mocha (>= 0.13.0)
31
+ multi_json (1.10.1)
32
+ notify (0.5.2)
33
+ parser (2.2.0.3)
34
+ ast (>= 1.1, < 3.0)
35
+ powerpack (0.1.0)
36
+ prettybacon (0.0.2)
37
+ bacon (~> 1.2)
38
+ rainbow (2.0.0)
39
+ rake (10.3.2)
40
+ rb-fsevent (0.9.4)
41
+ rb-inotify (0.9.5)
42
+ ffi (>= 0.5.0)
43
+ rb-kqueue (0.2.3)
44
+ ffi (>= 0.5.0)
45
+ rubocop (0.29.1)
46
+ astrolabe (~> 1.3)
47
+ parser (>= 2.2.0.1, < 3.0)
48
+ powerpack (~> 0.1)
49
+ rainbow (>= 1.99.1, < 3.0)
50
+ ruby-progressbar (~> 1.4)
51
+ ruby-progressbar (1.7.1)
52
+ simplecov (0.9.1)
53
+ docile (~> 1.1.0)
54
+ multi_json (~> 1.0)
55
+ simplecov-html (~> 0.8.0)
56
+ simplecov-html (0.8.0)
57
+
58
+ PLATFORMS
59
+ ruby
60
+
61
+ DEPENDENCIES
62
+ bacon
63
+ claide!
64
+ codeclimate-test-reporter
65
+ colored
66
+ json
67
+ kicker
68
+ mocha-on-bacon
69
+ prettybacon
70
+ rake
71
+ rubocop
72
+ simplecov
73
+
74
+ BUNDLED WITH
75
+ 1.11.2
@@ -0,0 +1,57 @@
1
+ # encoding: utf-8
2
+
3
+ #-- Bootstrap --------------------------------------------------------------#
4
+
5
+ desc 'Initializes your working copy to run the specs'
6
+ task :bootstrap do
7
+ if system('which bundle')
8
+ title 'Installing gems'
9
+ sh 'bundle install'
10
+ else
11
+ $stderr.puts "\033[0;31m" \
12
+ "[!] Please install the bundler gem manually:\n" \
13
+ ' $ [sudo] gem install bundler' \
14
+ "\e[0m"
15
+ exit 1
16
+ end
17
+ end
18
+
19
+ begin
20
+ require 'bundler/gem_tasks'
21
+ task :default => :spec
22
+
23
+ #-- Specs ------------------------------------------------------------------#
24
+
25
+ desc 'Run specs'
26
+ task :spec do
27
+ title 'Running Unit Tests'
28
+ files = FileList['spec/**/*_spec.rb'].shuffle.join(' ')
29
+ sh "bundle exec bacon #{files}"
30
+
31
+ Rake::Task['rubocop'].invoke if RUBY_VERSION >= '1.9.3'
32
+ end
33
+
34
+ #-- Rubocop ----------------------------------------------------------------#
35
+
36
+ desc 'Check code against RuboCop rules'
37
+ task :rubocop do
38
+ sh 'bundle exec rubocop'
39
+ end
40
+
41
+ rescue LoadError
42
+ $stderr.puts "\033[0;31m" \
43
+ '[!] Some Rake tasks haven been disabled because the environment' \
44
+ ' couldn’t be loaded. Be sure to run `rake bootstrap` first.' \
45
+ "\e[0m"
46
+ end
47
+
48
+ #-- Helpers ------------------------------------------------------------------#
49
+
50
+ def title(title)
51
+ cyan_title = "\033[0;36m#{title}\033[0m"
52
+ puts
53
+ puts '-' * 80
54
+ puts cyan_title
55
+ puts '-' * 80
56
+ puts
57
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.unshift File.expand_path('../lib', __FILE__)
3
+ require 'claide'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "claide"
7
+ s.version = CLAide::VERSION
8
+ s.license = "MIT"
9
+ s.email = ["eloy.de.enige@gmail.com", "fabiopelosin@gmail.com"]
10
+ s.homepage = "https://github.com/CocoaPods/CLAide"
11
+ s.authors = ["Eloy Duran", "Fabio Pelosin"]
12
+
13
+ s.summary = "A small command-line interface framework."
14
+
15
+ s.files = `git ls-files -z`.split("\0").reject { |f| f =~ /\A(spec|examples)/i }
16
+
17
+ ## Make sure you can build the gem on older versions of RubyGems too:
18
+ s.rubygems_version = "1.6.2"
19
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
20
+ s.specification_version = 3 if s.respond_to? :specification_version
21
+ end
@@ -8,7 +8,7 @@ module CLAide
8
8
  #
9
9
  # CLAide’s version, following [semver](http://semver.org).
10
10
  #
11
- VERSION = '0.9.1'
11
+ VERSION = '1.0.0.beta.1'.freeze
12
12
 
13
13
  require 'claide/ansi'
14
14
  require 'claide/argument'
@@ -13,55 +13,38 @@ module CLAide
13
13
  # - Be stored in a folder named after the plugin.
14
14
  #
15
15
  class PluginManager
16
- # @return [Array<Pathname>] The list of the root directories of the
17
- # loaded plugins.
16
+ # @return [Hash<String,Gem::Specification>] The loaded plugins,
17
+ # grouped by plugin prefix.
18
18
  #
19
- def self.plugin_paths
20
- @plugin_paths ||= {}
19
+ def self.loaded_plugins
20
+ @loaded_plugins ||= {}
21
21
  end
22
22
 
23
- # @return [Array<String>] Loads plugins via RubyGems looking for files
24
- # named after the `PLUGIN_PREFIX_plugin` and returns the paths of
25
- # the gems loaded successfully. Plugins are required safely.
23
+ # @return [Array<Gem::Specification>] Loads plugins via RubyGems looking
24
+ # for files named after the `PLUGIN_PREFIX_plugin` and returns the
25
+ # specifications of the gems loaded successfully.
26
+ # Plugins are required safely.
26
27
  #
27
28
  def self.load_plugins(plugin_prefix)
28
- return if plugin_paths[plugin_prefix]
29
-
30
- loaded_paths = []
31
- plugin_load_paths(plugin_prefix).each do |path|
32
- if safe_require(path.to_s)
33
- loaded_paths << Pathname(path + './../../').cleanpath
34
- end
35
- end
36
-
37
- plugin_paths[plugin_prefix] = loaded_paths
29
+ loaded_plugins[plugin_prefix] ||=
30
+ plugin_gems_for_prefix(plugin_prefix).map do |spec, paths|
31
+ spec if safe_activate_and_require(spec, paths)
32
+ end.compact
38
33
  end
39
34
 
40
35
  # @return [Array<Specification>] The RubyGems specifications for the
41
36
  # loaded plugins.
42
37
  #
43
38
  def self.specifications
44
- plugin_paths.values.flatten.map do |path|
45
- specification(path)
46
- end.compact
39
+ loaded_plugins.values.flatten.uniq
47
40
  end
48
41
 
49
- # @return [Specification] The RubyGems specification for the plugin at the
50
- # given path.
51
- #
52
- # @param [#to_s] path
53
- # The root path of the plugin.
42
+ # @return [Array<Specification>] The RubyGems specifications for the
43
+ # installed plugins that match the given `plugin_prefix`.
54
44
  #
55
- def self.specification(path)
56
- matches = Dir.glob("#{path}/*.gemspec")
57
- spec = silence_streams(STDERR) do
58
- Gem::Specification.load(matches.first)
59
- end if matches.count == 1
60
- unless spec
61
- warn '[!] Unable to load a specification for the plugin ' \
62
- "`#{path}`".ansi.yellow
63
- end
64
- spec
45
+ def self.installed_specifications_for_prefix(plugin_prefix)
46
+ loaded_plugins[plugin_prefix] ||
47
+ plugin_gems_for_prefix(plugin_prefix).map(&:first)
65
48
  end
66
49
 
67
50
  # @return [Array<String>] The list of the plugins whose root path appears
@@ -71,72 +54,56 @@ module CLAide
71
54
  # The exception to analyze.
72
55
  #
73
56
  def self.plugins_involved_in_exception(exception)
74
- paths = plugin_paths.values.flatten.select do |plugin_path|
75
- exception.backtrace.any? { |line| line.include?(plugin_path.to_s) }
76
- end
77
- paths.map { |path| path.to_s.split('/').last }
57
+ specifications.select do |gemspec|
58
+ exception.backtrace.any? do |line|
59
+ gemspec.full_require_paths.any? do |plugin_path|
60
+ line.include?(plugin_path)
61
+ end
62
+ end
63
+ end.map(&:name)
78
64
  end
79
65
 
80
- # Returns the paths of the files to require to load the available
81
- # plugins.
82
- #
83
- # @return [Array] The found plugins load paths.
66
+ # @group Helper Methods
67
+
68
+ # @return [Array<[Gem::Specification, Array<String>]>]
69
+ # Returns an array of tuples containing the specifications and
70
+ # plugin files to require for a given plugin prefix.
84
71
  #
85
- def self.plugin_load_paths(plugin_prefix)
86
- if plugin_prefix && !plugin_prefix.empty?
87
- pattern = "#{plugin_prefix}_plugin"
88
- if Gem.respond_to? :find_latest_files
89
- Gem.find_latest_files(pattern)
90
- else
91
- Gem.find_files(pattern)
92
- end
93
- else
94
- []
95
- end
72
+ def self.plugin_gems_for_prefix(prefix)
73
+ glob = "#{prefix}_plugin#{Gem.suffix_pattern}"
74
+ Gem::Specification.latest_specs(true).map do |spec|
75
+ matches = spec.matches_for_glob(glob)
76
+ [spec, matches] unless matches.empty?
77
+ end.compact
96
78
  end
97
79
 
98
- # Loads the given path. If any exception occurs it is catched and an
80
+ # Activates the given spec and requires the given paths.
81
+ # If any exception occurs it is caught and an
99
82
  # informative message is printed.
100
83
  #
101
- # @param [String] path
102
- # The path to load
84
+ # @param [Gem::Specification] spec
85
+ # The spec to be activated.
86
+ #
87
+ # @param [String] paths
88
+ # The paths to require.
89
+ #
90
+ # @return [Bool] Whether activation and requiring succeeded.
103
91
  #
104
92
  # rubocop:disable RescueException
105
- def self.safe_require(path)
106
- require path
93
+ def self.safe_activate_and_require(spec, paths)
94
+ spec.activate
95
+ paths.each { |path| require(path) }
107
96
  true
108
97
  rescue Exception => exception
109
98
  message = "\n---------------------------------------------"
110
- message << "\nError loading the plugin with path `#{path}`.\n"
99
+ message << "\nError loading the plugin `#{spec.full_name}`.\n"
111
100
  message << "\n#{exception.class} - #{exception.message}"
112
101
  message << "\n#{exception.backtrace.join("\n")}"
113
102
  message << "\n---------------------------------------------\n"
114
- puts message.ansi.yellow
103
+ warn message.ansi.yellow
115
104
  false
116
105
  end
117
106
  # rubocop:enable RescueException
118
-
119
- # Executes the given block while silencing the given streams.
120
- #
121
- # @return [Object] The value of the given block.
122
- #
123
- # @param [Array] streams
124
- # The streams to silence.
125
- #
126
- # @note credit to DHH http://stackoverflow.com/a/8959520
127
- #
128
- def self.silence_streams(*streams)
129
- on_hold = streams.map(&:dup)
130
- streams.each do |stream|
131
- stream.reopen('/dev/null')
132
- stream.sync = true
133
- end
134
- yield
135
- ensure
136
- streams.each_with_index do |stream, i|
137
- stream.reopen(on_hold[i])
138
- end
139
- end
140
107
  end
141
108
  end
142
109
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: claide
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 1.0.0.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eloy Duran
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-07-05 00:00:00.000000000 Z
12
+ date: 2015-12-30 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description:
15
15
  email:
@@ -19,8 +19,19 @@ executables: []
19
19
  extensions: []
20
20
  extra_rdoc_files: []
21
21
  files:
22
+ - .gitignore
23
+ - .kick
24
+ - .rubocop.yml
25
+ - .rubocop_cocoapods.yml
26
+ - .travis.yml
27
+ - .yardopts
28
+ - CHANGELOG.md
29
+ - Gemfile
30
+ - Gemfile.lock
22
31
  - LICENSE
23
32
  - README.markdown
33
+ - Rakefile
34
+ - claide.gemspec
24
35
  - lib/claide.rb
25
36
  - lib/claide/ansi.rb
26
37
  - lib/claide/ansi/cursor.rb
@@ -44,17 +55,17 @@ require_paths:
44
55
  - lib
45
56
  required_ruby_version: !ruby/object:Gem::Requirement
46
57
  requirements:
47
- - - ">="
58
+ - - '>='
48
59
  - !ruby/object:Gem::Version
49
60
  version: '0'
50
61
  required_rubygems_version: !ruby/object:Gem::Requirement
51
62
  requirements:
52
- - - ">="
63
+ - - '>='
53
64
  - !ruby/object:Gem::Version
54
65
  version: '0'
55
66
  requirements: []
56
67
  rubyforge_project:
57
- rubygems_version: 2.4.8
68
+ rubygems_version: 2.5.1
58
69
  signing_key:
59
70
  specification_version: 3
60
71
  summary: A small command-line interface framework.