jira4r-jh 0.4.0

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/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source "http://rubygems.org"
2
+
3
+ group :development do
4
+ gem "bundler", "~> 1.0.0"
5
+ gem "jeweler", "~> 1.5.2"
6
+ gem "rspec", "< 2.0.0"
7
+ end
8
+
9
+ gem "soap4r"
@@ -0,0 +1,22 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ git (1.2.5)
5
+ httpclient (2.1.6)
6
+ jeweler (1.5.2)
7
+ bundler (~> 1.0.0)
8
+ git (>= 1.2.5)
9
+ rake
10
+ rake (0.8.7)
11
+ rspec (1.3.0)
12
+ soap4r (1.5.8)
13
+ httpclient (>= 2.1.1)
14
+
15
+ PLATFORMS
16
+ x86-mingw32
17
+
18
+ DEPENDENCIES
19
+ bundler (~> 1.0.0)
20
+ jeweler (~> 1.5.2)
21
+ rspec (< 2.0.0)
22
+ soap4r
data/LICENSE ADDED
@@ -0,0 +1,14 @@
1
+
2
+ Copyright 2006-2009 Codehaus Foundation
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
data/NOTICE ADDED
@@ -0,0 +1,3 @@
1
+ Codehaus JIRA4R
2
+
3
+ Copyright 2006-2009 The Codehaus Foundation
@@ -0,0 +1,3 @@
1
+ h1. jira4r
2
+
3
+ The current gem version of jira4r (0.3.0) is ancient. There is a more up to date version here http://xircles.rubyhaus.org/projects/jira4r so I have just cloned it so I can create my own gem of the source (jira4r-jh). Once a more up to date version of jira4r get's released I will remove this one.
@@ -0,0 +1,3 @@
1
+ h1. jira4r
2
+
3
+ The current gem version of jira4r (0.3.0) is ancient. There is a more up to date version here http://xircles.rubyhaus.org/projects/jira4r so I have just cloned it so I can create my own gem of the source (jira4r-jh). Once a more up to date version of jira4r get's released I will remove this one.
@@ -0,0 +1,187 @@
1
+ require 'net/http'
2
+ require 'fileutils'
3
+ require 'rake/clean'
4
+ require 'logger'
5
+
6
+ begin
7
+ require 'rubygems'
8
+ require 'bundler'
9
+ require 'rake/gempackagetask'
10
+ rescue Exception
11
+ nil
12
+ end
13
+
14
+ begin
15
+ Bundler.setup(:default, :development)
16
+ rescue Bundler::BundlerError => e
17
+ $stderr.puts e.message
18
+ $stderr.puts "Run `bundle install` to install missing gems"
19
+ exit e.status_code
20
+ end
21
+ require 'rake'
22
+ require 'jeweler'
23
+
24
+ Jeweler::Tasks.new do |gem|
25
+ gem.name = "jira4r-jh"
26
+ gem.homepage = "http://xircles.rubyhaus.org/projects/jira4r"
27
+ gem.license = "Apache"
28
+ gem.summary = %Q{Clone of latest source from http://xircles.rubyhaus.org/projects/jira4r }
29
+ gem.description = %Q{the current version of jira4r is quite old. there is a newer version but there isn't a new gem for it so I am just releasing it}
30
+ gem.email = "jamiehollingworth@gmail.com"
31
+ gem.authors = ["James Stuart", "James Hollingworth"]
32
+
33
+ gem.add_runtime_dependency 'soap4r'
34
+ gem.add_development_dependency 'rspec', '> 1.2.3'
35
+ gem.add_development_dependency 'jeweler'
36
+ gem.add_development_dependency 'bundler'
37
+ end
38
+ Jeweler::RubygemsDotOrgTasks.new
39
+
40
+
41
+ gem 'soap4r'
42
+
43
+ require 'wsdl/soap/wsdl2ruby'
44
+
45
+ logger = Logger.new(STDERR)
46
+ logger.level = Logger::INFO
47
+
48
+
49
+ desc "gets the wsdl and generates the classes"
50
+ task :default => [:generate]
51
+
52
+
53
+ desc "gets the wsdl files for JIRA services"
54
+ task :getwsdl do
55
+ versions().each { |version|
56
+ save(getWsdlFileName(version), get_file("jira.codehaus.org", "/rpc/soap/jirasoapservice-v#{version}?wsdl"))
57
+ }
58
+ end
59
+
60
+ task :clean do
61
+ def unl(file)
62
+ File.unlink(file) if File.exist?(file)
63
+ end
64
+ unl("wsdl/jirasoapservice-v2.wsdl")
65
+ unl("lib/jira4r/v2/jiraService.rb")
66
+ unl("lib/jira4r/v2/jiraServiceDriver.rb")
67
+ unl("lib/jira4r/v2/jiraServiceMappingRegistry.rb")
68
+ end
69
+
70
+ desc "generate the wsdl"
71
+ task :generate do
72
+ versions().each { |version|
73
+ wsdl = getWsdlFileName(version)
74
+ basedir = "lib/jira4r/v#{version}"
75
+ mkdir_p basedir
76
+
77
+ if not File.exist?(wsdl)
78
+ raise "WSDL does not exist: #{wsdl}"
79
+ end
80
+ wsdl_url = "file://#{File.expand_path(wsdl)}"
81
+
82
+ # Create the server
83
+ worker = WSDL::SOAP::WSDL2Ruby.new
84
+ worker.logger = logger
85
+ worker.location = wsdl_url
86
+ worker.basedir = basedir
87
+ worker.opt['force'] = true
88
+ worker.opt['classdef'] = "jiraService"
89
+ worker.opt['module_path'] ="Jira4R::V#{version}"
90
+
91
+ worker.opt['mapping_registry'] = true
92
+ #worker.run
93
+
94
+ #Create the driver
95
+ #worker = WSDL::SOAP::WSDL2Ruby.new
96
+ #worker.logger = logger
97
+ #worker.location = wsdl_url
98
+ #worker.basedir = basedir
99
+ #worker.opt['force'] = true
100
+ #worker.opt['module_path'] = "Jira4R::V#{version}"
101
+
102
+ worker.opt['driver'] = "JiraSoapService"
103
+ worker.run
104
+ }
105
+ end
106
+
107
+ def versions
108
+ [ 2 ]
109
+ end
110
+
111
+ def get_file(host, path)
112
+ puts "getting http://#{host}#{path}"
113
+ http = Net::HTTP.new(host)
114
+ http.start { |w| w.get2(path).body }
115
+ end
116
+
117
+ def getWsdlFileName(vName)
118
+ "wsdl/jirasoapservice-v#{vName}.wsdl"
119
+ end
120
+
121
+
122
+ # Saves this document to the specified @var path.
123
+ # doesn't create the file if contains markup for 404 page
124
+ def save( path, content )
125
+ File::open(path, 'w') { | f |
126
+ f.write( content )
127
+ }
128
+ end
129
+
130
+ def fix_soap_files(version)
131
+ fix_require("lib/jira4r/v#{version}/jiraServiceMappingRegistry.rb")
132
+ fix_require("lib/jira4r/v#{version}/JiraSoapServiceDriver.rb")
133
+ end
134
+
135
+ def fix_require(filename)
136
+ content = ""
137
+ File.open(filename) { |io|
138
+ content = io.read()
139
+
140
+ content = fix_content(content, 'jiraService')
141
+ content = fix_content(content, 'jiraServiceMappingRegistry')
142
+ }
143
+
144
+ File.open(filename, "w") { |io|
145
+ io.write(content)
146
+ }
147
+ end
148
+
149
+ def fix_content(content, name)
150
+ return content.gsub("require '#{name}.rb'", "require File.dirname(__FILE__) + '/#{name}.rb'")
151
+ end
152
+
153
+ SPEC_DIR = File.join(File.dirname(__FILE__), 'spec')
154
+ FIXTURE_DIR = File.join(SPEC_DIR, 'fixtures')
155
+ SPECS = "#{SPEC_DIR}/*_spec.rb"
156
+
157
+ begin
158
+ require 'spec/rake/spectask'
159
+
160
+ begin
161
+ require 'rcov/rcovtask'
162
+
163
+ Spec::Rake::SpecTask.new do |t|
164
+ t.libs << SPEC_DIR
165
+ t.pattern = SPECS
166
+ t.rcov = true
167
+ t.rcov_dir = "#{SPEC_DIR}/coverage"
168
+ t.verbose = true
169
+ end
170
+
171
+ desc "Generate and open coverage reports"
172
+ task :rcov do
173
+ system "open #{SPEC_DIR}/coverage/index.html"
174
+ end
175
+ task :rcov => :spec
176
+ rescue LoadError
177
+ ### Enabling these warnings makes every run of rake whiny unless you have these gems.
178
+ # warn ">>> You don't seem to have the rcov gem installed; not adding coverage tasks"
179
+ Spec::Rake::SpecTask.new do |t|
180
+ t.libs << SPEC_DIR
181
+ t.pattern = SPECS
182
+ t.verbose = true
183
+ end
184
+ end
185
+ rescue LoadError
186
+ # warn ">>> You don't seem to have the rspec gem installed; not adding rspec tasks"
187
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.4.0
@@ -0,0 +1,88 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{jira4r-jh}
8
+ s.version = "0.4.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["James Stuart", "James Hollingworth"]
12
+ s.date = %q{2011-01-01}
13
+ s.description = %q{the current version of jira4r is quite old. there is a newer version but there isn't a new gem for it so I am just releasing it}
14
+ s.email = %q{jamiehollingworth@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.textile",
18
+ "README.txt"
19
+ ]
20
+ s.files = [
21
+ "Gemfile",
22
+ "Gemfile.lock",
23
+ "LICENSE",
24
+ "NOTICE",
25
+ "README.textile",
26
+ "README.txt",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "jira4r-jh.gemspec",
30
+ "lib/jira4r/.DS_Store",
31
+ "lib/jira4r/jira4r.rb",
32
+ "lib/jira4r/jira_tool.rb",
33
+ "lib/jira4r/v2/.DS_Store",
34
+ "lib/jira4r/v2/JiraSoapServiceDriver.rb",
35
+ "lib/jira4r/v2/jiraService.rb",
36
+ "lib/jira4r/v2/jiraServiceMappingRegistry.rb",
37
+ "lib/jiraService.rb",
38
+ "lib/jiraServiceMappingRegistry.rb",
39
+ "spec/.gitignore",
40
+ "spec/jira4r_spec.rb",
41
+ "spec/spec_helper.rb",
42
+ "wsdl/jirasoapservice-v2.wsdl"
43
+ ]
44
+ s.homepage = %q{http://xircles.rubyhaus.org/projects/jira4r}
45
+ s.licenses = ["Apache"]
46
+ s.require_paths = ["lib"]
47
+ s.rubygems_version = %q{1.3.7}
48
+ s.summary = %q{Clone of latest source from http://xircles.rubyhaus.org/projects/jira4r}
49
+ s.test_files = [
50
+ "spec/jira4r_spec.rb",
51
+ "spec/spec_helper.rb"
52
+ ]
53
+
54
+ if s.respond_to? :specification_version then
55
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
56
+ s.specification_version = 3
57
+
58
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
59
+ s.add_runtime_dependency(%q<soap4r>, [">= 0"])
60
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
61
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
62
+ s.add_development_dependency(%q<rspec>, ["< 2.0.0"])
63
+ s.add_runtime_dependency(%q<soap4r>, [">= 0"])
64
+ s.add_development_dependency(%q<rspec>, ["> 1.2.3"])
65
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
66
+ s.add_development_dependency(%q<bundler>, [">= 0"])
67
+ else
68
+ s.add_dependency(%q<soap4r>, [">= 0"])
69
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
70
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
71
+ s.add_dependency(%q<rspec>, ["< 2.0.0"])
72
+ s.add_dependency(%q<soap4r>, [">= 0"])
73
+ s.add_dependency(%q<rspec>, ["> 1.2.3"])
74
+ s.add_dependency(%q<jeweler>, [">= 0"])
75
+ s.add_dependency(%q<bundler>, [">= 0"])
76
+ end
77
+ else
78
+ s.add_dependency(%q<soap4r>, [">= 0"])
79
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
80
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
81
+ s.add_dependency(%q<rspec>, ["< 2.0.0"])
82
+ s.add_dependency(%q<soap4r>, [">= 0"])
83
+ s.add_dependency(%q<rspec>, ["> 1.2.3"])
84
+ s.add_dependency(%q<jeweler>, [">= 0"])
85
+ s.add_dependency(%q<bundler>, [">= 0"])
86
+ end
87
+ end
88
+
Binary file
@@ -0,0 +1,19 @@
1
+ ################################################################################
2
+ # Copyright 2007 Codehaus Foundation #
3
+ # #
4
+ # Licensed under the Apache License, Version 2.0 (the "License"); #
5
+ # you may not use this file except in compliance with the License. #
6
+ # You may obtain a copy of the License at #
7
+ # #
8
+ # http://www.apache.org/licenses/LICENSE-2.0 #
9
+ # #
10
+ # Unless required by applicable law or agreed to in writing, software #
11
+ # distributed under the License is distributed on an "AS IS" BASIS, #
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
13
+ # See the License for the specific language governing permissions and #
14
+ # limitations under the License. #
15
+ ################################################################################
16
+
17
+ #Oh how I hate thee...
18
+ $: << File.dirname(__FILE__) + '/..'
19
+ require 'jira4r/jira_tool.rb'
@@ -0,0 +1,239 @@
1
+ ################################################################################
2
+ # Copyright 2006-2009 Codehaus Foundation
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ ################################################################################
16
+ require 'logger'
17
+
18
+ #It is the responsibility of the caller to ensure SOAP4R is installed and working correctly
19
+ #require 'rubygems'
20
+ #gem 'soap4r'
21
+
22
+ module Jira4R
23
+
24
+ class JiraTool
25
+ attr_accessor :enhanced
26
+
27
+ # Create a new JiraTool
28
+ #
29
+ # where:
30
+ # version ... the version of the SOAP API you wish to use - currently supported versions [ 2 ]
31
+ # base_url ... the base URL of the JIRA instance - eg. http://confluence.atlassian.com
32
+ def initialize(version, base_url)
33
+ @version = version
34
+ @base_url = base_url
35
+ @logger = Logger.new(STDERR)
36
+ @endpoint_url = "#{@base_url}/rpc/soap/jirasoapservice-v#{version}"
37
+ end
38
+
39
+ #Assign a new logger to the tool. By default a STDERR logger is used.
40
+ def logger=(logger)
41
+ @logger = logger
42
+ end
43
+
44
+ def http_auth(http_username, http_password, http_realm)
45
+ @http_username = http_username
46
+ @http_password = http_password
47
+ @http_realm = http_realm
48
+ end
49
+
50
+ #Retrieve the driver, creating as required.
51
+ def driver()
52
+ if not @driver
53
+ @logger.info( "Connecting driver to #{@endpoint_url}" )
54
+
55
+ require "jira4r/v#{@version}/jiraService.rb"
56
+ require "jira4r/v#{@version}/JiraSoapServiceDriver.rb"
57
+ require "jira4r/v#{@version}/jiraServiceMappingRegistry.rb"
58
+
59
+ service_classname = "Jira4R::V#{@version}::JiraSoapService"
60
+ puts "Service: #{service_classname}"
61
+ service = eval(service_classname)
62
+ @driver = service.send(:new, @endpoint_url)
63
+
64
+ if not ( @http_realm.nil? or @http_username.nil? or @http_password.nil? )
65
+ @driver.options["protocol.http.basic_auth"] << [ @http_realm, @http_username, @http_password ]
66
+ end
67
+ end
68
+ @driver
69
+ end
70
+
71
+ #Assign a wiredump file prefix to the driver.
72
+ def wiredump_file_base=(base)
73
+ driver().wiredump_file_base = base
74
+ end
75
+
76
+
77
+ #Login to the JIRA instance, storing the token for later calls.
78
+ #
79
+ #This is typically the first call that is made on the JiraTool.
80
+ def login(username, password)
81
+ @token = driver().login(username, password)
82
+ end
83
+
84
+ #Clients should avoid using the authentication token directly.
85
+ def token()
86
+ @token
87
+ end
88
+
89
+ #Call a method on the driver, adding in the authentication token previously determined using login()
90
+ def call_driver(method_name, *args)
91
+ @logger.debug("Finding method #{method_name}")
92
+ method = driver().method(method_name)
93
+
94
+ if args.length > 0
95
+ method.call(@token, *args)
96
+ else
97
+ method.call(@token)
98
+ end
99
+ end
100
+
101
+ #Retrieve a project without the associated PermissionScheme.
102
+ #This will be significantly faster for larger Jira installations.
103
+ #See: JRA-10660
104
+ def getProjectNoScheme(key)
105
+ puts "getProjectNoScheme is deprecated. Please call getProjectNoSchemes."
106
+ getProjectNoSchemes(key)
107
+ end
108
+
109
+ def getProjectNoSchemes(key)
110
+ self.getProjectsNoSchemes().find { |project| project.key == key }
111
+ end
112
+
113
+ def getProject(key)
114
+ #Jira > 3.10 has been patched to support this method directly as getProjectByKey
115
+ puts "Using deprecated JIRA4R API call getProject(key); replace with getProjectByKey(key)"
116
+ return getProjectByKey(key)
117
+ end
118
+
119
+ def getProjectByKey( projectKey )
120
+ begin
121
+ return call_driver( "getProjectByKey", projectKey )
122
+ rescue SOAP::FaultError => soap_error
123
+ #XXX surely there is a better way to detect this kind of condition in the JIRA server
124
+ if (soap_error.faultcode.to_s == "soapenv:Server.userException") and
125
+ (soap_error.faultstring.to_s =~ /No project could be found with key '#{projectKey}'/)
126
+ return nil
127
+ else
128
+ raise soap_error
129
+ end
130
+ end
131
+ end
132
+
133
+ def getGroup( groupName )
134
+ begin
135
+ return call_driver( "getGroup", groupName )
136
+ rescue SOAP::FaultError => soap_error
137
+ #XXX surely there is a better way to detect this kind of condition in the JIRA server
138
+ if soap_error.faultcode.to_s == "soapenv:Server.userException" and soap_error.faultstring.to_s == "com.atlassian.jira.rpc.exception.RemoteValidationException: no group found for that groupName: #{groupName}"
139
+ return nil
140
+ else
141
+ raise soap_error
142
+ end
143
+ end
144
+ end
145
+
146
+ def getProjectRoleByName( projectRoleName )
147
+ getProjectRoles.each{ |projectRole|
148
+ return projectRole if projectRole.name == projectRoleName
149
+ }
150
+ end
151
+
152
+ def getPermissionScheme( permissionSchemeName )
153
+ self.getPermissionSchemes().each { |permission_scheme|
154
+ return permission_scheme if permission_scheme.name == permissionSchemeName
155
+ }
156
+ return nil
157
+ end
158
+
159
+ def getNotificationScheme( notificationSchemeName )
160
+ self.getNotificationSchemes().each { |notification_scheme|
161
+ return notification_scheme if notification_scheme.name == notificationSchemeName
162
+ }
163
+ return nil
164
+ end
165
+
166
+ def getPermission( permissionName )
167
+ if not @permissions
168
+ @permissions = self.getAllPermissions()
169
+ end
170
+
171
+ @permissions.each { |permission|
172
+ return permission if permission.name.downcase == permissionName.downcase
173
+ }
174
+
175
+ @logger.warn("No permission #{permissionName} found")
176
+ return nil
177
+ end
178
+
179
+ def findPermission(allowedPermissions, permissionName)
180
+ allowedPermissions.each { |allowedPermission|
181
+ #puts "Checking #{allowedPermission.name} against #{permissionName} "
182
+ return allowedPermission if allowedPermission.name == permissionName
183
+ }
184
+ return nil
185
+ end
186
+
187
+ def findEntityInPermissionMapping(permissionMapping, entityName)
188
+ permissionMapping.remoteEntities.each { |entity|
189
+ return entity if entity.name == entityName
190
+ }
191
+ return nil
192
+ end
193
+
194
+ #Removes entity
195
+ def setPermissions( permissionScheme, allowedPermissions, entity)
196
+ allowedPermissions = [ allowedPermissions ].flatten.compact
197
+ #Remove permissions that are no longer allowed
198
+ permissionScheme.permissionMappings.each { |mapping|
199
+ next unless findEntityInPermissionMapping(mapping, entity.name)
200
+
201
+ allowedPermission = findPermission(allowedPermissions, mapping.permission.name)
202
+ if allowedPermission
203
+ puts "Already has #{allowedPermission.name} in #{permissionScheme.name} for #{entity.name}"
204
+ allowedPermissions.delete(allowedPermission)
205
+ next
206
+ end
207
+
208
+ puts "Deleting #{mapping.permission.name} from #{permissionScheme.name} for #{entity.name}"
209
+ deletePermissionFrom( permissionScheme, mapping.permission, entity)
210
+ }
211
+
212
+ puts allowedPermissions.inspect
213
+ allowedPermissions.each { |allowedPermission|
214
+ puts "Granting #{allowedPermission.name} to #{permissionScheme.name} for #{entity.name}"
215
+ addPermissionTo(permissionScheme, allowedPermission, entity)
216
+ }
217
+ end
218
+
219
+ private
220
+ def fix_args(args)
221
+ args.collect { |arg|
222
+ if arg == nil
223
+ SOAP::SOAPNil.new
224
+ else
225
+ arg
226
+ end
227
+ }
228
+ end
229
+
230
+ def method_missing(method_name, *args)
231
+ args = fix_args(args)
232
+ call_driver(method_name, *args)
233
+ end
234
+
235
+
236
+
237
+ end
238
+
239
+ end