rvn 0.1

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.
Files changed (3) hide show
  1. data/bin/rvn +4 -0
  2. data/raven.rb +188 -0
  3. metadata +111 -0
data/bin/rvn ADDED
@@ -0,0 +1,4 @@
1
+ #! /usr/bin/env ruby
2
+ require File.expand_path('../../raven.rb', __FILE__)
3
+
4
+ Raven::Rvn.new.run(ARGV)
@@ -0,0 +1,188 @@
1
+ #! /usr/bin/env ruby
2
+ require 'rainbow'
3
+ require 'nokogiri'
4
+ require 'httparty'
5
+ require 'terminal-table'
6
+
7
+ module Raven
8
+
9
+ module PomResource
10
+
11
+ def pom_as_doc
12
+ pom = Nokogiri::XML File.open 'pom.xml'
13
+ pom.remove_namespaces!
14
+ end
15
+
16
+ end
17
+
18
+ module Dependencies
19
+ include PomResource
20
+
21
+ def list_dep
22
+ pom_as_doc.css('dependencies > dependency').map { |node|
23
+ "#{node.xpath('groupId').text}:#{node.xpath('artifactId').text}:#{node.xpath('version').text}"
24
+ }.join("\n")
25
+ end
26
+
27
+ def search_dep(group_id, artifact_id = nil, version = nil)
28
+ MavenDependencyResolver.new(group_id, artifact_id, version).resolve
29
+ end
30
+
31
+ end
32
+
33
+ class Rvn
34
+ include Dependencies
35
+
36
+ def initialize
37
+ @console = Raven::Console.new
38
+ self
39
+ end
40
+
41
+ def run(arguments)
42
+ if arguments.first == "dep"
43
+ @console.out(list_dep)
44
+ return
45
+ elsif arguments.first == "search"
46
+ if arguments[1]
47
+ found_info = search_dep(*arguments[1].split(":"))
48
+ @console.out(found_info)
49
+ else
50
+ @console.out("No dependency coordinates provided. Run the help")
51
+ end
52
+ else
53
+ delegate_to_maven(arguments)
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def delegate_to_maven(arguments)
60
+ command = "mvn #{arguments.join(' ')}"
61
+ IO.popen(command) { |maven|
62
+ maven.each do |line|
63
+ @console.out line
64
+ end
65
+ }
66
+ end
67
+
68
+ end
69
+
70
+
71
+ class MavenDependencyResolver
72
+ include HTTParty
73
+ base_uri 'mvnrepository.com/artifact'
74
+
75
+ def initialize(group_id, artifact_id = nil, version = nil)
76
+ @group = group_id
77
+ @artifact = artifact_id
78
+ @version = version
79
+ end
80
+
81
+ def resolve
82
+ return dependency if fetch_dependency?
83
+ return artifacts if fetch_artifacts?
84
+ return versions if fetch_versions?
85
+ end
86
+
87
+ private
88
+
89
+ def dependency
90
+ if dependency_valid?
91
+ dependency_as_xml
92
+ else
93
+ cannot_find(@group, @artifact, @version)
94
+ end
95
+ end
96
+
97
+ def versions
98
+ if group_and_artifact_valid?
99
+ response_body = self.class.get("/#{@group}/#{@artifact}").body
100
+ versions = parse_response(response_body, "//table/tr/td/a[@class='versionbutton release']")
101
+ as_table("Available versions for #{@group}:#{@artifact}", versions)
102
+ else
103
+ cannot_find(@group, @artifact)
104
+ end
105
+ end
106
+
107
+ def artifacts
108
+ if group_valid?
109
+ response_body = self.class.get("/#{@group}").body
110
+ artifacts = parse_response(response_body, "//div[@id='maincontent']/table/tr/td/a[not(@class)]")
111
+ as_table("Available artifacts for #{@group}", artifacts)
112
+ else
113
+ cannot_find(@group)
114
+ end
115
+ end
116
+
117
+ def parse_response(body, xpath_expression)
118
+ items_found = []
119
+ html_doc = Nokogiri::HTML(body)
120
+ html_doc.xpath(xpath_expression).each do |node|
121
+ items_found << [node.text]
122
+ end
123
+ items_found
124
+ end
125
+
126
+ def dependency_as_xml
127
+ builder = Nokogiri::XML::Builder.new do |xml|
128
+ xml.dependency {
129
+ xml.groupId @group
130
+ xml.artifactId @artifact
131
+ xml.version @version
132
+ }
133
+ end
134
+ builder.to_xml
135
+ end
136
+
137
+ def as_table(title, rows)
138
+ Terminal::Table.new :headings => [title], :rows => rows
139
+ end
140
+
141
+ def cannot_find(*coordinates)
142
+ "Cannot find '#{coordinates.join(":")}' in maven repo"
143
+ end
144
+
145
+ def group_valid?
146
+ 200 == self.class.get("/#{@group}").code
147
+ end
148
+
149
+ def group_and_artifact_valid?
150
+ 200 == self.class.get("/#{@group}/#{@artifact}").code
151
+ end
152
+
153
+ def dependency_valid?
154
+ 200 == self.class.get("/#{@group}/#{@artifact}/#{@version}").code
155
+ end
156
+
157
+ def fetch_artifacts?
158
+ @group && @artifact.nil? && @version.nil?
159
+ end
160
+
161
+ def fetch_versions?
162
+ @group && @artifact && @version.nil?
163
+ end
164
+
165
+ def fetch_dependency?
166
+ @group && @artifact && @version
167
+ end
168
+
169
+ end
170
+
171
+ class Console
172
+
173
+ def out(content)
174
+ if content.class == Terminal::Table
175
+ puts content
176
+ else
177
+ content.each_line { |line|
178
+ line = line.foreground(:red) if line =~ /^\[ERROR\]/
179
+ line = line.foreground(:green) if line =~ /SUCCESS/
180
+ line = line.foreground(:yellow) if line =~ /^\[WARNING\]/
181
+ print line
182
+ }
183
+ end
184
+ end
185
+
186
+ end
187
+
188
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rvn
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Simon Caplette
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rainbow
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: nokogiri
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: httparty
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: terminal-table
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description:
79
+ email:
80
+ executables:
81
+ - rvn
82
+ extensions: []
83
+ extra_rdoc_files: []
84
+ files:
85
+ - bin/rvn
86
+ - raven.rb
87
+ homepage: https://github.com/simcap/raven
88
+ licenses: []
89
+ post_install_message:
90
+ rdoc_options: []
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
+ none: false
101
+ requirements:
102
+ - - ! '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubyforge_project:
107
+ rubygems_version: 1.8.24
108
+ signing_key:
109
+ specification_version: 3
110
+ summary: Ruby over the maven command line
111
+ test_files: []