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.
@@ -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