gfid 0.0.2
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.
- data/.gitignore +4 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/gfid.gemspec +24 -0
- data/lib/gfid.rb +10 -0
- data/lib/gfid/gem.rb +86 -0
- data/lib/gfid/manager.rb +45 -0
- data/lib/gfid/version.rb +3 -0
- data/sample.rb +8 -0
- data/spec/gem_spec.rb +117 -0
- data/spec/manager_spec.rb +74 -0
- data/spec/spec_helper.rb +7 -0
- data/tmp/sample.rb +8 -0
- metadata +80 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/gfid.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "gfid/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "gfid"
|
7
|
+
s.version = Gfid::VERSION
|
8
|
+
s.authors = ["pochi.black"]
|
9
|
+
s.email = ["pochi.black@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{gem fetch --include-dependencies}
|
12
|
+
s.description = %q{This gems make you can 'gem fetch --include-dependencies'}
|
13
|
+
|
14
|
+
s.rubyforge_project = "gfid"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
# s.add_development_dependency "rspec"
|
23
|
+
# s.add_runtime_dependency "rest-client"
|
24
|
+
end
|
data/lib/gfid.rb
ADDED
data/lib/gfid/gem.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Gfid
|
4
|
+
class Gem
|
5
|
+
attr_reader :name, :version, :dependencies
|
6
|
+
|
7
|
+
def initialize(name, options={ })
|
8
|
+
@name = name
|
9
|
+
@version = options[:version]
|
10
|
+
end
|
11
|
+
|
12
|
+
def ask_dependencies
|
13
|
+
res = Rubygems.dependencies(name)
|
14
|
+
result = optimize_gem(res)
|
15
|
+
|
16
|
+
result.map do |name, version|
|
17
|
+
if name
|
18
|
+
version = version.split(" ").last
|
19
|
+
self.class.new(name, :version => version)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
rescue => e
|
23
|
+
puts "[ERROR]"
|
24
|
+
puts "Can't take gem file"
|
25
|
+
puts "gem_name: " + name
|
26
|
+
puts "gem_current_version: " + version
|
27
|
+
puts "gem_version: " + versions.inspect
|
28
|
+
puts "[Response from Rubygems]"
|
29
|
+
puts res.inspect
|
30
|
+
raise StandardError
|
31
|
+
end
|
32
|
+
|
33
|
+
def optimize_gem(response)
|
34
|
+
if version
|
35
|
+
return response.first[:dependencies] if version == "0"
|
36
|
+
response.select do |gem_info|
|
37
|
+
versions.include?(gem_info[:number])
|
38
|
+
end.first[:dependencies]
|
39
|
+
else
|
40
|
+
# get the newest
|
41
|
+
@version = response.first[:number]
|
42
|
+
response.first[:dependencies]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def versions
|
47
|
+
split_version = version.split(".")
|
48
|
+
if split_version.size == 3
|
49
|
+
support = split_version[0..1].join(".")
|
50
|
+
return [version,support]
|
51
|
+
end
|
52
|
+
if split_version.size == 2
|
53
|
+
filling = (split_version.uniq.size == 1 && split_version.uniq.first == '0') ? '.1' : '.0'
|
54
|
+
return [version, version+filling]
|
55
|
+
end
|
56
|
+
if split_version.size == 1
|
57
|
+
filling = (split_version.uniq.size == 1 && split_version.uniq.first == '0') ? '.1' : '.0'
|
58
|
+
return [version, version+'.0', version+'.0'+filling]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def download!
|
63
|
+
Rubygems.download(filename)
|
64
|
+
end
|
65
|
+
|
66
|
+
def filename
|
67
|
+
name + "-" + version + ".gem"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class Rubygems
|
72
|
+
include HTTParty
|
73
|
+
base_uri 'rubygems.org'
|
74
|
+
|
75
|
+
class << self
|
76
|
+
def dependencies(gem)
|
77
|
+
res = get("/api/v1/dependencies", :query => { :gems => gem } )
|
78
|
+
Marshal.load(res.body)
|
79
|
+
end
|
80
|
+
|
81
|
+
def download(path)
|
82
|
+
get("/downloads/#{path}")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/gfid/manager.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Gfid
|
4
|
+
class Manager
|
5
|
+
include Singleton
|
6
|
+
attr_reader :gems, :dependency_gems
|
7
|
+
def initialize
|
8
|
+
@gems = []
|
9
|
+
@dependency_gems = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def gem_name(name, version=nil)
|
13
|
+
@gems << Gem.new(name, :version => version)
|
14
|
+
@dependency_gems << gems.first.ask_dependencies
|
15
|
+
@dependency_gems.flatten!
|
16
|
+
end
|
17
|
+
|
18
|
+
def collect_gems
|
19
|
+
while !dependency_gems.empty?
|
20
|
+
next_dependency_gems = []
|
21
|
+
dependency_gems.flatten.each do |gem|
|
22
|
+
@gems << gem
|
23
|
+
gem.ask_dependencies.each do |dependency_gem|
|
24
|
+
next_dependency_gems << dependency_gem if !next_dependency_gems.map { |g| g.name }.include?(dependency_gem.name)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
@dependency_gems = next_dependency_gems
|
28
|
+
end
|
29
|
+
gems
|
30
|
+
end
|
31
|
+
|
32
|
+
def download!
|
33
|
+
collect_gems.each do |gem|
|
34
|
+
open(gem.filename, "wb") do |file|
|
35
|
+
file.write gem.download!.body
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def clear!
|
41
|
+
@gems = []
|
42
|
+
@dependency_gems = []
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/gfid/version.rb
ADDED
data/sample.rb
ADDED
data/spec/gem_spec.rb
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Gfid::Gem do
|
6
|
+
let :gem do
|
7
|
+
Gfid::Gem.new('uglifier')
|
8
|
+
end
|
9
|
+
|
10
|
+
let :gem_with_version do
|
11
|
+
Gfid::Gem.new('youroom_api', :version => '0.1.14')
|
12
|
+
end
|
13
|
+
|
14
|
+
describe ".initialize" do
|
15
|
+
context "can create instance" do
|
16
|
+
it "should be instance of Gfid::Gem" do
|
17
|
+
gem.should be_a_instance_of(Gfid::Gem)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "can create insance" do
|
22
|
+
context "given only gem name" do
|
23
|
+
subject { gem }
|
24
|
+
its(:name) { should == 'uglifier' }
|
25
|
+
end
|
26
|
+
|
27
|
+
context "given gem name and version" do
|
28
|
+
subject { gem_with_version }
|
29
|
+
its(:name) { should == 'youroom_api' }
|
30
|
+
its(:version) { should == '0.1.14' }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#ask_dependencies" do
|
36
|
+
context "description" do
|
37
|
+
subject { gem.ask_dependencies }
|
38
|
+
it { should be_an_instance_of(Array) }
|
39
|
+
its(:size) { should == 2 }
|
40
|
+
end
|
41
|
+
|
42
|
+
context "first element" do
|
43
|
+
subject { gem.ask_dependencies.first }
|
44
|
+
it { should be_a_instance_of(Gfid::Gem) }
|
45
|
+
its(:name) { should == "multi_json" }
|
46
|
+
its(:version) { should == "1.0.2" }
|
47
|
+
end
|
48
|
+
|
49
|
+
context "last element" do
|
50
|
+
subject { gem.ask_dependencies.last }
|
51
|
+
it { should be_a_instance_of(Gfid::Gem) }
|
52
|
+
its(:name) { should == "execjs" }
|
53
|
+
its(:version) { should == "0.3.0" }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "#download!" do
|
58
|
+
it "should receive Rubygems.download! with gem_file_name" do
|
59
|
+
Gfid::Rubygems.should_receive(:download).with("youroom_api-0.1.14.gem")
|
60
|
+
gem_with_version.download!
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#versions" do
|
65
|
+
context "when version has major, miner, build" do
|
66
|
+
before do
|
67
|
+
@gem = Gfid::Gem.new('youroom_api', :version => '0.1.4')
|
68
|
+
end
|
69
|
+
subject { @gem.versions }
|
70
|
+
it { should be_an_instance_of(Array) }
|
71
|
+
its(:first) { should == '0.1.4' }
|
72
|
+
its(:last) { should == '0.1' }
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "when version has major, miner" do
|
76
|
+
context "and major equall 0 and miner equal 1" do
|
77
|
+
before do
|
78
|
+
@gem = Gfid::Gem.new('youroom_api', :version => '0.1')
|
79
|
+
end
|
80
|
+
subject { @gem.versions }
|
81
|
+
it { should be_an_instance_of(Array) }
|
82
|
+
its(:size) { should == 2 }
|
83
|
+
its(:first) { should == '0.1' }
|
84
|
+
its(:last) { should == '0.1.0' }
|
85
|
+
end
|
86
|
+
|
87
|
+
context "and major equall 0 and miner equal 0" do
|
88
|
+
before do
|
89
|
+
@gem = Gfid::Gem.new('youroom_api', :version => '0.0')
|
90
|
+
end
|
91
|
+
subject { @gem.versions }
|
92
|
+
it { should be_an_instance_of(Array) }
|
93
|
+
its(:size) { should == 2 }
|
94
|
+
its(:first) { should == '0.0' }
|
95
|
+
its(:last) { should == '0.0.1' }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "when version has major only" do
|
100
|
+
context "and major version equall 0" do
|
101
|
+
before do
|
102
|
+
@gem = Gfid::Gem.new('youroom_api', :version => '0')
|
103
|
+
end
|
104
|
+
subject { @gem.versions }
|
105
|
+
it { should == ['0', '0.0', '0.0.1'] }
|
106
|
+
end
|
107
|
+
|
108
|
+
context "and major version not equall 0" do
|
109
|
+
before do
|
110
|
+
@gem = Gfid::Gem.new('youroom_api', :version => '1')
|
111
|
+
end
|
112
|
+
subject { @gem.versions }
|
113
|
+
it { should == ['1', '1.0', '1.0.0'] }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# WARNING: uglifier has 4 dependency gems version at 1.2.3
|
3
|
+
|
4
|
+
require 'spec_helper'
|
5
|
+
|
6
|
+
def mock_gem
|
7
|
+
@gem ||= mock(Gfid::Gem)
|
8
|
+
end
|
9
|
+
|
10
|
+
def mock_web_response
|
11
|
+
@response ||= mock(HTTParty::Response)
|
12
|
+
end
|
13
|
+
|
14
|
+
describe Gfid::Manager do
|
15
|
+
let :manager do
|
16
|
+
Gfid::Manager.instance
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#gem_name(name)" do
|
20
|
+
before { manager.gem_name("uglifier") }
|
21
|
+
|
22
|
+
context "instance" do
|
23
|
+
subject { manager }
|
24
|
+
its(:gems) { should be_instance_of(Array) }
|
25
|
+
end
|
26
|
+
|
27
|
+
context "gems" do
|
28
|
+
subject { manager.gems }
|
29
|
+
its(:size) { should == 1 }
|
30
|
+
its(:first) { should be_a_instance_of(Gfid::Gem) }
|
31
|
+
end
|
32
|
+
|
33
|
+
context "dependency_gems" do
|
34
|
+
subject { manager.dependency_gems }
|
35
|
+
its(:size) { should == 2 }
|
36
|
+
end
|
37
|
+
|
38
|
+
after do
|
39
|
+
manager.clear!
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "#collect_gems" do
|
44
|
+
before do
|
45
|
+
manager.gem_name("uglifier")
|
46
|
+
manager.collect_gems
|
47
|
+
end
|
48
|
+
|
49
|
+
subject { manager.gems }
|
50
|
+
its(:size) { should == 3 }
|
51
|
+
|
52
|
+
after do
|
53
|
+
manager.clear!
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "download!" do
|
58
|
+
before do
|
59
|
+
manager.gem_name("uglifier")
|
60
|
+
manager.should_receive(:collect_gems).and_return([mock_gem])
|
61
|
+
mock_gem.stub!(:filename).and_return("hoge")
|
62
|
+
mock_web_response.should_receive(:body).and_return("hoge")
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should receive each Gfid::Gem.download!" do
|
66
|
+
mock_gem.should_receive(:download!).and_return(mock_web_response)
|
67
|
+
manager.download!
|
68
|
+
end
|
69
|
+
|
70
|
+
after do
|
71
|
+
FileUtils.rm("hoge")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/tmp/sample.rb
ADDED
metadata
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gfid
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- pochi.black
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2012-02-02 00:00:00 +09:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: This gems make you can 'gem fetch --include-dependencies'
|
22
|
+
email:
|
23
|
+
- pochi.black@gmail.com
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files: []
|
29
|
+
|
30
|
+
files:
|
31
|
+
- .gitignore
|
32
|
+
- .rspec
|
33
|
+
- Gemfile
|
34
|
+
- Rakefile
|
35
|
+
- gfid.gemspec
|
36
|
+
- lib/gfid.rb
|
37
|
+
- lib/gfid/gem.rb
|
38
|
+
- lib/gfid/manager.rb
|
39
|
+
- lib/gfid/version.rb
|
40
|
+
- sample.rb
|
41
|
+
- spec/gem_spec.rb
|
42
|
+
- spec/manager_spec.rb
|
43
|
+
- spec/spec_helper.rb
|
44
|
+
- tmp/sample.rb
|
45
|
+
has_rdoc: true
|
46
|
+
homepage: ""
|
47
|
+
licenses: []
|
48
|
+
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options: []
|
51
|
+
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 0
|
69
|
+
version: "0"
|
70
|
+
requirements: []
|
71
|
+
|
72
|
+
rubyforge_project: gfid
|
73
|
+
rubygems_version: 1.3.7
|
74
|
+
signing_key:
|
75
|
+
specification_version: 3
|
76
|
+
summary: gem fetch --include-dependencies
|
77
|
+
test_files:
|
78
|
+
- spec/gem_spec.rb
|
79
|
+
- spec/manager_spec.rb
|
80
|
+
- spec/spec_helper.rb
|