gfid 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format nested
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in gfid.gemspec
4
+ gemspec
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -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
@@ -0,0 +1,10 @@
1
+ require "httparty"
2
+ require "uri"
3
+ require "singleton"
4
+ require "gfid/version"
5
+
6
+
7
+ module Gfid
8
+ autoload :Manager, 'gfid/manager'
9
+ autoload :Gem, 'gfid/gem'
10
+ end
@@ -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
@@ -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
@@ -0,0 +1,3 @@
1
+ module Gfid
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,8 @@
1
+ # coding: utf-8
2
+
3
+ require "gfid"
4
+
5
+ manager = Gfid::Manager.instance
6
+ manager.gem_name("uglifier')
7
+ manager.download!
8
+
@@ -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
@@ -0,0 +1,7 @@
1
+ # coding: utf-8
2
+
3
+ $TESTING=true
4
+ require 'rspec'
5
+ require 'fileutils'
6
+ require File.expand_path(File.dirname(__FILE__)+"/../lib/gfid")
7
+
@@ -0,0 +1,8 @@
1
+ # coding: utf-8
2
+
3
+ require "gfid"
4
+
5
+ manager = Gfid::Manager.instance
6
+ manager.gem_name("rails", "3.1.3")
7
+ manager.download!
8
+
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