label 0.1.6 → 0.2.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: c7dea93831bc0aa3c9e53a98ff01ae217134a2b6
4
- data.tar.gz: 82c142f19d4ee49c83b1a0128f684a463a02ea6f
3
+ metadata.gz: 69b062d913786723a28cb0fcf27ba5e2a614a4ea
4
+ data.tar.gz: 5c4e954723b928ac583a463bc956b05c28d7ea88
5
5
  SHA512:
6
- metadata.gz: dbf0abed36706032026ac70492566eefddafae32a4a08b9317a242932c109af5def2c61c6e54648f2baa25176baaed7140771cf1605fe015515000a7997a26b8
7
- data.tar.gz: 2218bd9f7bb681ee4a887839d7943ab1a9ac30df8cd7c3a79817ea74d0eb64a89009ccdcd7fb4eea75ab66437073d72d3e5aa6f63d97cc6516e82a8a33ca2603
6
+ metadata.gz: 05fb43e1d46f8bb542eea2059efc4f3a3cadbeaee5c5a989bfd2c170048758b5816bd661540359dd17c711c3f6d0a3118843d6e6e975d8934f9cc47318b905b8
7
+ data.tar.gz: 798b20fc30a6211c587c8b13a824952686259ce6c8f0881a6fbc1df678958c56c1722647f344bb11f4d82cf8de0458b163dded6e36b45e7b40ce4129d877f44c
@@ -18,8 +18,6 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "gems", "~> 0.8"
22
-
23
21
  spec.add_development_dependency "bundler", "~> 1.3"
24
22
  spec.add_development_dependency "rake"
25
23
  spec.add_development_dependency "rspec"
@@ -1,16 +1,18 @@
1
1
  require "label/version"
2
- require "label/gemspec_info"
3
2
  require "label/description_formatter"
3
+
4
+ require "bundler"
4
5
  require "optparse"
5
6
  require "ostruct"
6
- require "gems"
7
7
 
8
8
  module Label
9
9
 
10
10
  class << self
11
11
 
12
+ GEM_REGEXP = /^(?<whitespace> *)gem ['"](?<name>.+?)['"](:?, ['"](?<version>.+?)['"])?/
13
+
12
14
  def label gemfile = "Gemfile"
13
- describing = lambda { |gem| STDOUT.write "#{gem}: " }
15
+ describing = lambda { |name| STDOUT.write "#{name}: " }
14
16
  described = lambda { |description| STDOUT.puts description }
15
17
 
16
18
  output = process gemfile, describing, described
@@ -33,21 +35,21 @@ module Label
33
35
  processed_lines = []
34
36
 
35
37
  lines.each_with_index do |line, i|
36
- matches = line.match /^( *)gem ['"](.+?)['"]/
38
+ match = line.match GEM_REGEXP
37
39
 
38
- if matches
40
+ if match
39
41
  previous_line = lines[i - 1]
40
42
 
41
- whitespace = matches[1]
42
- gem = matches[2]
43
- source = extract_source_and_options line
43
+ whitespace = match[:whitespace]
44
+ name = match[:name]
45
+ version = match[:version]
44
46
 
45
47
  unless previous_line =~ /^ *#/
46
- describing.call gem if describing
48
+ describing.call(name) if describing
47
49
 
48
- description = describe gem, source
50
+ description = describe(name, version)
49
51
 
50
- described.call description if described
52
+ described.call(description) if described
51
53
 
52
54
  processed_lines << format(description, "#{whitespace}#")
53
55
  end
@@ -78,43 +80,31 @@ module Label
78
80
 
79
81
  # Describe the given gem.
80
82
  #
81
- # gem - A String describing the name of a gem.
82
- # source - A hash with the gem source options, posible values:
83
- # - rubygems
84
- # - github
85
- # - path
86
- # - git
83
+ # name - A String with the name of a gem.
84
+ # version - A String describing the version of a gem.
87
85
  #
88
86
  # Returns a String.
89
- def describe gem, source = { rubygems: true }
90
- if source[:rubygems]
91
- Gems.info(gem).fetch "info"
92
- else
93
- info = GemspecInfo.new gem, source
94
- info.summary
87
+ def describe name, version = nil
88
+ requirement = Gem::Requirement.new(version)
89
+
90
+ or_raise = -> do
91
+ raise Gem::LoadError.new("Could not find '#{name}' (#{requirement})")
95
92
  end
93
+
94
+ specs.find or_raise do |spec|
95
+ spec.name == name &&
96
+ requirement.satisfied_by?(spec.version)
97
+ end.summary
96
98
  end
97
99
 
98
100
  private
99
101
 
100
- def format description, prepend_string
101
- DescriptionFormatter.format description, prepend_string
102
+ def specs
103
+ @specs ||= Bundler.load.specs
102
104
  end
103
105
 
104
- # Exctract the source options form a Gemfile gem declaration
105
- # as :github, :path and/or :branch and return a Hash with those options
106
- # :rubygems is the default
107
- def extract_source_and_options line
108
- source = {}
109
- options = line.split ","
110
- options[1, options.length - 1].each do |option|
111
- if option.match(/:/)
112
- args = option.split(":").map {|arg| arg.strip.gsub(/('|\")/, '') }
113
- source[args.first.to_sym] = args.last
114
- end
115
- end
116
- source[:rubygems] = true if source.empty?
117
- source
106
+ def format description, prepend_string
107
+ DescriptionFormatter.format description, prepend_string
118
108
  end
119
109
 
120
110
  end
@@ -1,3 +1,3 @@
1
1
  module Label
2
- VERSION = "0.1.6"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+
2
3
  require 'label/description_formatter'
3
4
 
4
5
  def format input_string, prepend_string = "#"
@@ -1,23 +1,24 @@
1
1
  # encoding: utf-8
2
+
2
3
  require "spec_helper"
3
4
 
4
5
  describe Label do
5
6
  describe "#process" do
6
- it "should label unlabelled gems" do
7
+ it "labels unlabelled gems" do
7
8
  allow(File).to receive(:open).with("Gemfile").and_return(StringIO.new fixture("stock_gemfile"))
8
9
 
9
- allow(subject).to receive(:describe).with("rspec", rubygems: true).and_return("BDD for Ruby")
10
+ allow(subject).to receive(:describe).with("rspec", nil).and_return("BDD for Ruby")
10
11
 
11
- allow(subject).to receive(:describe).with("carrierwave", rubygems: true).and_return(
12
+ allow(subject).to receive(:describe).with("carrierwave", nil).and_return(
12
13
  "Upload files in your Ruby applications, map them to a range of ORMs, " +
13
14
  "store them on different backends."
14
15
  )
15
16
 
16
- allow(subject).to receive(:describe).with("label", path: "./").and_return(
17
+ allow(subject).to receive(:describe).with("label", nil).and_return(
17
18
  "Label labels the gems in your Gemfile"
18
19
  )
19
20
 
20
- allow(subject).to receive(:describe).with("pg", rubygems: true).and_return(
21
+ allow(subject).to receive(:describe).with("pg", nil).and_return(
21
22
  "Pg is the Ruby interface to the {PostgreSQL RDBMS}[http://www.postgresql.org/].\n\n"+
22
23
  "It works with {PostgreSQL 8.4 and later}[http://www.postgresql.org/support/versioning/]."+
23
24
  "\n\nA small example usage:\n\n #!/usr/bin/env ruby\n\n require 'pg'\n\n"+
@@ -28,7 +29,7 @@ describe Label do
28
29
  "row.values_at('procpid', 'usename', 'current_query')\n end\n end"
29
30
  )
30
31
 
31
- allow(subject).to receive(:describe).with("nokogiri", rubygems: true).and_return(
32
+ allow(subject).to receive(:describe).with("nokogiri", nil).and_return(
32
33
  "Nokogiri (é\u008B¸) is an HTML, XML, SAX, and Reader "+
33
34
  "parser. Among Nokogiri's\nmany features is the "+
34
35
  "ability to search documents via XPath or CSS3 "+
@@ -37,7 +38,7 @@ describe Label do
37
38
  "using\nenough of it."
38
39
  )
39
40
 
40
- allow(subject).to receive(:describe).with("unicorn", rubygems: true).and_return(
41
+ allow(subject).to receive(:describe).with("unicorn", nil).and_return(
41
42
  "\\Unicorn is an HTTP server for Rack applications "+
42
43
  "designed to only serve\nfast clients on low-latency, high-bandwidth "+
43
44
  "connections and take\nadvantage of features in Unix/Unix-like kernels."+
@@ -46,10 +47,10 @@ describe Label do
46
47
  "\\Unicorn and slow clients."
47
48
  )
48
49
 
49
- allow(subject).to receive(:describe).with("pry", github: "pry/pry", branch: "development")
50
+ allow(subject).to receive(:describe).with("pry", nil)
50
51
  .and_return("An IRB alternative and runtime developer console")
51
52
 
52
- allow(subject).to receive(:describe).with("rspec-rails", rubygems: true).and_return(
53
+ allow(subject).to receive(:describe).with("rspec-rails", '~> 3.0.0.beta2').and_return(
53
54
  "Rspec for Rails"
54
55
  )
55
56
 
@@ -58,15 +59,30 @@ describe Label do
58
59
  end
59
60
 
60
61
  describe "#describe" do
61
- it "should describe a given gem" do
62
- expect(Gems).to receive(:info).with("label").and_return("info" => "Label gems in your Gemfile")
62
+ it "describes a given gem" do
63
+ expect(subject.describe("rake")).to eq "Rake is a Make-like program implemented in Ruby"
64
+ end
65
+
66
+ it "describes requested version of a given gem" do
67
+ expect(subject.describe("bundler", "~> 1.3")).to eq "The best way to manage your application's dependencies"
68
+ end
69
+
70
+ it "raises when a given gem could not be found" do
71
+ expect do
72
+ subject.describe("missing")
73
+ end.to raise_error Gem::LoadError, "Could not find 'missing' (>= 0)"
74
+ end
63
75
 
64
- expect(subject.describe("label")).to eq "Label gems in your Gemfile"
76
+ it "raises when requested version of a given gem could not be found" do
77
+ expect do
78
+ subject.describe("bundler", "~> 1000.0")
79
+ end.to raise_error Gem::LoadError, "Could not find 'bundler' (~> 1000.0)"
65
80
  end
66
81
 
67
- it "should describe a given gem from a github source" do
68
- mock_github_response!
69
- expect(subject.describe("label", github: "jgorset/label")).to eq "Label labels the gems in your Gemfile"
82
+ it "raises when given version requirement is malformed" do
83
+ expect do
84
+ subject.describe("bundler", "fweep")
85
+ end.to raise_error Gem::Requirement::BadRequirementError
70
86
  end
71
87
  end
72
88
  end
@@ -6,10 +6,3 @@ Coveralls.wear!
6
6
  def fixture file
7
7
  File.read "spec/fixtures/#{file}"
8
8
  end
9
-
10
- def mock_github_response!
11
- gemspec_contents = File.readlines("./label.gemspec").join("\n")
12
- response_double = double :response_double, body: gemspec_contents
13
- expect(Net::HTTP).to receive(:get_response).with(anything())
14
- .and_return(response_double)
15
- end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: label
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johannes Gorset
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-08 00:00:00.000000000 Z
11
+ date: 2014-08-26 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: gems
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '0.8'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '0.8'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: bundler
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -85,14 +71,10 @@ files:
85
71
  - label.gemspec
86
72
  - lib/label.rb
87
73
  - lib/label/description_formatter.rb
88
- - lib/label/gemspec_info.rb
89
- - lib/label/summary_extractor.rb
90
74
  - lib/label/version.rb
91
75
  - spec/fixtures/processed_gemfile
92
76
  - spec/fixtures/stock_gemfile
93
77
  - spec/label/description_formatter_spec.rb
94
- - spec/label/gemspec_info_spec.rb
95
- - spec/label/summary_extractor_spec.rb
96
78
  - spec/label_spec.rb
97
79
  - spec/spec_helper.rb
98
80
  homepage: https://github.com/jgorset/label
@@ -115,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
115
97
  version: '0'
116
98
  requirements: []
117
99
  rubyforge_project:
118
- rubygems_version: 2.2.0
100
+ rubygems_version: 2.2.2
119
101
  signing_key:
120
102
  specification_version: 4
121
103
  summary: Label labels the gems in your Gemfile
@@ -123,7 +105,5 @@ test_files:
123
105
  - spec/fixtures/processed_gemfile
124
106
  - spec/fixtures/stock_gemfile
125
107
  - spec/label/description_formatter_spec.rb
126
- - spec/label/gemspec_info_spec.rb
127
- - spec/label/summary_extractor_spec.rb
128
108
  - spec/label_spec.rb
129
109
  - spec/spec_helper.rb
@@ -1,76 +0,0 @@
1
- require 'label/summary_extractor'
2
- require 'net/http'
3
-
4
- module Label
5
- # A class to represent a gemspec file in order
6
- # to extract info from it
7
- class GemspecInfo
8
- attr_reader :gem_name, :source
9
-
10
- GITHUB_RAW_URL = "https://raw.githubusercontent.com"
11
-
12
- def initialize gem_name, source
13
- @gem_name = gem_name
14
- @source = source
15
- end
16
-
17
- # Extracts the gemspec summary string
18
- def summary
19
- SummaryExtractor.new(content).extract_summary
20
- end
21
-
22
- # Raw contents of the gemspec file
23
- def content
24
- @content ||= fetch_gemspec_content!
25
- end
26
-
27
- private
28
-
29
- # Fetch the content from a gemspec file that could be remote or
30
- # that could be a file in the developer computer
31
- #
32
- # Returns a string with the gemspec file content
33
- def fetch_gemspec_content!
34
- case source_name
35
- when :git
36
- fetch_gemspec_content_from_git!
37
- when :github
38
- fetch_gemspec_content_from_github!
39
- when :path
40
- fetch_gemspec_content_from_path!
41
- else
42
- ""
43
- end
44
- end
45
-
46
- # returns a symbol of the defined source
47
- # it could be :git, :github, :path, etc
48
- def source_name
49
- [:git, :github, :path].each do |source_name|
50
- return source_name if source[source_name]
51
- end
52
- end
53
-
54
- # for simplicity git protocol calls that match with a github repo
55
- # will be converted to a github url
56
- def fetch_gemspec_content_from_git!
57
- if md = source[:git].match(/git:\/\/github\.com:(?<repo>.*)/)
58
- source[:github] = md[:repo]
59
- source.delete :git
60
- fetch_gemspec_content_from_github!
61
- end
62
- end
63
-
64
- def fetch_gemspec_content_from_github!
65
- repo = source[:github]
66
- branch = source[:branch] || "master"
67
- file_url = "#{GITHUB_RAW_URL}/#{repo}/#{branch}/#{gem_name}.gemspec"
68
- Net::HTTP.get_response(URI(file_url)).body
69
- end
70
-
71
- def fetch_gemspec_content_from_path!
72
- File.readlines("#{source[:path]}/#{gem_name}.gemspec").join "\n"
73
- end
74
-
75
- end
76
- end
@@ -1,23 +0,0 @@
1
- module Label
2
- # A class to extract the summary from the contents of a gemspec file
3
- class SummaryExtractor
4
- attr_reader :content
5
-
6
- STRING_REGEXPS = [
7
- /\"(?<content>[^"]*)\"/,
8
- /'(?<content>[^']*)'/,
9
- /%q\{(?<content>[^}]*)\}/i
10
- ]
11
-
12
- def initialize content
13
- @content = content
14
- end
15
-
16
- def extract_summary
17
- STRING_REGEXPS.find do |regexp|
18
- md = content.match(/\w+\.summary\s+=\s+#{regexp}/)
19
- return md[:content] if md
20
- end
21
- end
22
- end
23
- end
@@ -1,25 +0,0 @@
1
- require "spec_helper"
2
- require "label/gemspec_info"
3
-
4
- describe Label::GemspecInfo do
5
-
6
- describe "#summary" do
7
- it "should extract the summary from a gem from a github repo" do
8
- mock_github_response!
9
- info = Label::GemspecInfo.new "label", github: "jgorset/label"
10
- expect(info.summary).to eq "Label labels the gems in your Gemfile"
11
- end
12
-
13
- it "should extract the summary from a gem from a git repo" do
14
- mock_github_response!
15
- info = Label::GemspecInfo.new "label", git: "git://github.com:jgorset/label"
16
- expect(info.summary).to eq "Label labels the gems in your Gemfile"
17
- end
18
-
19
- it "should extract the summary from a gem from a path" do
20
- info = Label::GemspecInfo.new "label", path: "./"
21
- expect(info.summary).to eq "Label labels the gems in your Gemfile"
22
- end
23
- end
24
-
25
- end
@@ -1,49 +0,0 @@
1
- require "label/summary_extractor"
2
-
3
- shared_examples "extracts summary" do |expected_summary|
4
- it "should extract summary" do
5
- extractor = Label::SummaryExtractor.new(content)
6
- expect(extractor.extract_summary).to eq expected_summary
7
- end
8
- end
9
-
10
- describe Label::SummaryExtractor do
11
-
12
- describe "#extract_summary" do
13
- context "for double quoted strings containing single quoted strings" do
14
- let(:content) { "s.email = [\"fespinozacast@gmail.com\"]\n s.homepage = \"fespinoza.github.io\"\n s.summary = \"A series of generators an other rails 'defaults' for my projects\"\n s.description = \"TODO.\"\n s.license = \"MIT\"\n\n" }
15
-
16
- include_examples "extracts summary", "A series of generators an other rails 'defaults' for my projects"
17
- end
18
-
19
- context "for single quoted strings containing double quoted strings" do
20
- let(:content) { "s.email = [\"fespinozacast@gmail.com\"]\n s.homepage = \"fespinoza.github.io\"\n s.summary = 'A series of generators an other rails \"defaults\" for my projects'\n s.description = \"TODO.\"\n s.license = \"MIT\"\n\n" }
21
-
22
- include_examples "extracts summary", "A series of generators an other rails \"defaults\" for my projects"
23
- end
24
-
25
- context "for strings defined with %q{}" do
26
- let(:content) { "s.email = [\"fespinozacast@gmail.com\"]\n s.homepage = \"fespinoza.github.io\"\n s.summary = %q{A series of generators an other rails \"defaults\" for my 'projects'}\n s.description = \"TODO.\"\n s.license = \"MIT\"\n\n" }
27
-
28
- include_examples "extracts summary", "A series of generators an other rails \"defaults\" for my 'projects'"
29
- end
30
-
31
- context "for strings defined with %Q{}" do
32
- let(:content) { "s.email = [\"fespinozacast@gmail.com\"]\n s.homepage = \"fespinoza.github.io\"\n s.summary = %Q{A series of generators an other rails \"defaults\" for my 'projects'}\n s.description = \"TODO.\"\n s.license = \"MIT\"\n\n" }
33
-
34
- include_examples "extracts summary", "A series of generators an other rails \"defaults\" for my 'projects'"
35
- end
36
-
37
- context "for different gem configuration variable names" do
38
- let(:content) { "g.email = [\"fespinozacast@gmail.com\"]\n g.homepage = \"fespinoza.github.io\"\n g.summary = %q{A series of generators an other rails \"defaults\" for my 'projects'}\n g.description = \"TODO.\"\n g.license = \"MIT\"\n\n" }
39
-
40
- include_examples "extracts summary", "A series of generators an other rails \"defaults\" for my 'projects'"
41
- end
42
-
43
- context "for summaries that don't exist at all" do
44
- let(:content) { "s.email = [\"fespinozacast@gmail.com\"]\n s.homepage = \"fespinoza.github.io\"\n s.description = \"TODO.\"\n s.license = \"MIT\"\n\n" }
45
-
46
- include_examples "extracts summary", nil
47
- end
48
- end
49
- end