Skip to content

Commit 3bbac29

Browse files
committed
Initial commit sweeping change to gem and ruby gem objects
1 parent cccff3c commit 3bbac29

10 files changed

+218
-218
lines changed

lib/gempage.rb

+25-16
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
require "gempage/version"
2-
31
require 'erb'
42
require 'fileutils'
5-
require 'gempage/gemfile_processor'
6-
require 'gempage/ruby_gem_info'
3+
require "gemnasium/parser"
4+
5+
require "gempage/version"
6+
require 'gempage/gem'
7+
require 'gempage/ruby_gem'
78
require 'gempage/configuration'
9+
810
Gempage.send :extend, Gempage::Configuration
911

1012
module Gempage
@@ -15,20 +17,28 @@ def generate(options = nil)
1517
end
1618

1719
def result
18-
return @result if defined? @result
19-
@result = gem_listing ? merge_gem_and_info : false
20+
gem_listing.group_by(&:groups)
2021
end
2122

22-
def gem_listing
23-
return @gem_listing if defined? @gem_listing
24-
@gem_listing = Gempage::GemfileProcessor.new(gemfile_path).gem_list
23+
def process_gems(data)
24+
gems = []
25+
data.dependencies.each do |dependency|
26+
requirements = dependency.requirement.as_list
27+
first_req = requirements.nil? || requirements.first == ">= 0" ? nil : requirements.first
28+
if first_req
29+
first_req = first_req.gsub(/^\=\s/, '')
30+
first_req = "'#{first_req}'"
31+
end
32+
gems << Gempage::Gem.new(dependency.name, groups: dependency.groups.sort, requirements: first_req)
33+
end
34+
35+
gems
2536
end
2637

27-
def merge_gem_and_info
28-
gem_listing.each_with_index do |listed_gem, index|
29-
ruby_gem_json = Gempage::RubyGemInfo.new(listed_gem[:name]).gem_json
30-
gem_listing[index].merge!(ruby_gem_json)
31-
end
38+
39+
def gem_listing
40+
gemfile = File.exists?(gemfile_path) ? File.read(gemfile_path) : false
41+
process_gems(Gemnasium::Parser.gemfile(gemfile)) if gemfile
3242
end
3343

3444
def format(options)
@@ -64,8 +74,7 @@ def css_file_exists?(file_name)
6474

6575
def output_message
6676
if result
67-
category_count = result.group_by{ |result| result[:category] }.length
68-
"Gem list generated for #{category_count} gem groups and #{result.length} gems to #{gempage_path}."
77+
"Gem list generated for #{result.length} gem groups and #{gem_listing.length} gems to #{gempage_path}."
6978
else
7079
"There is no Gemfile to process, how odd..."
7180
end

lib/gempage/gem.rb

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
include Forwardable
2+
3+
module Gempage
4+
class Gem
5+
extend Forwardable
6+
7+
attr_accessor :name, :groups, :requirements, :error
8+
9+
def_delegators :@ruby_gem, :info, :homepage_uri, :documentation_uri, :source_code_uri, :error
10+
11+
def initialize(name, groups:, requirements:)
12+
@name = name
13+
@groups = groups
14+
@requirements = requirements
15+
@ruby_gem = Gempage::RubyGem.new(name)
16+
@error = nil
17+
end
18+
end
19+
end

lib/gempage/gemfile_processor.rb

-38
This file was deleted.

lib/gempage/ruby_gem.rb

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
require 'json'
2+
3+
module Gempage
4+
class RubyGem
5+
class FetchError < StandardError; end
6+
7+
GITHUB_LINK_PATTERN = /github\.com/
8+
9+
attr_accessor :name
10+
11+
def initialize(name)
12+
@name = name
13+
end
14+
15+
def info
16+
rubygem_content["info"]
17+
end
18+
19+
def homepage_uri
20+
rubygem_content["homepage_uri"]
21+
end
22+
23+
def documentation_uri
24+
documentation_uri = rubygem_content["documentation_uri"]
25+
documentation_uri = nil if documentation_uri == source_code_uri
26+
documentation_uri
27+
end
28+
29+
def source_code_uri
30+
source_code_uri = rubygem_content["source_code_uri"]
31+
source_code_uri = homepage_uri if !source_code_uri && homepage_uri.match(GITHUB_LINK_PATTERN)
32+
source_code_uri
33+
end
34+
35+
def error
36+
nil
37+
end
38+
39+
private
40+
41+
def rubygem_json_url
42+
"https://rubygems.org/api/v1/gems/#{name}.json"
43+
end
44+
45+
def rubygem_content
46+
@rubygem_content ||= begin
47+
response_body = fetch_http(rubygem_json_url)
48+
JSON.parse(response_body)
49+
end
50+
end
51+
52+
def fetch_http(url, request_max = 5)
53+
raise FetchError.new("Too many redirects #{url}") if request_max <= 0
54+
55+
response = Net::HTTP.get_response(URI(url))
56+
57+
case response.code.to_i
58+
when 200
59+
response.body
60+
when 301..303
61+
fetch_http(URI(response["location"]), request_max - 1)
62+
else
63+
raise FetchError.new("Bad response #{url}: #{response.message} #{response.code}", )
64+
end
65+
end
66+
end
67+
end

lib/gempage/ruby_gem_info.rb

-58
This file was deleted.

spec/lib/gem_spec.rb

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
require 'spec_helper'
2+
3+
describe Gempage::Gem do
4+
before(:each) do
5+
ruby_gem_json_double = double(
6+
name: "httparty",
7+
info: "Makes http fun! Also, makes consuming restful web services dead easy.",
8+
homepage_uri: "http://jnunemaker.github.com/httparty",
9+
documentation_uri: "",
10+
source_code_uri: "http://github.com/jnunemaker/httparty",
11+
error: ""
12+
)
13+
allow(Gempage::RubyGem).to receive(:new).with("httparty").and_return(ruby_gem_json_double)
14+
end
15+
16+
it "turns all arguments into public methods" do
17+
httparty_gem = Gempage::Gem.new("httparty", groups: [:default], requirements: ["~> 3.2.3"])
18+
19+
expect(httparty_gem.name).to eql("httparty")
20+
expect(httparty_gem.groups).to eql([:default])
21+
expect(httparty_gem.requirements).to eql(["~> 3.2.3"])
22+
end
23+
24+
it "delegates methods to RubyGem" do
25+
httparty_gem = Gempage::Gem.new("httparty", groups: [:default], requirements: ["~> 3.2.3"])
26+
27+
expect(httparty_gem.info).to eql("Makes http fun! Also, makes consuming restful web services dead easy.")
28+
expect(httparty_gem.homepage_uri).to eql("http://jnunemaker.github.com/httparty")
29+
expect(httparty_gem.documentation_uri).to eql("")
30+
expect(httparty_gem.source_code_uri).to eql("http://github.com/jnunemaker/httparty")
31+
expect(httparty_gem.error).to eql("")
32+
end
33+
end

spec/lib/gemfile_processor_spec.rb

-40
This file was deleted.

spec/lib/ruby_gem_info_spec.rb

-52
This file was deleted.

0 commit comments

Comments
 (0)