devise-jira-authenticable 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bafd1e409aa04147e2d5dcddfd52334038604fc0
4
+ data.tar.gz: 76b1a215d43773824ff54c8d897107939926f040
5
+ SHA512:
6
+ metadata.gz: 217e5ea46b6ae4ab49f4f517ec315f069f24b2abcf0d8dbce6a8ad4af92ea5092e573136b27138f64e8af9d8c3b084e083f5b7da55d00963439a7c08fa16704b
7
+ data.tar.gz: a05940bc9793e4ad31da67454bfc1b1ee121ab8fbda9df9bddfb6d6b983cde70bf8572a170da9fe741227d949826d57bacafffa5257c215c6374e05f7bbd008d
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ /.idea/
2
+ /.bundle/
3
+ /.yardoc/
4
+ /Gemfile.lock
5
+ /_yardoc/
6
+ /coverage/
7
+ /doc/
8
+ /pkg/
9
+ /spec/reports/
10
+ /tmp/
11
+
12
+ # rspec failure tracking
13
+ .rspec_status
14
+ /spec/rails_app/log/
15
+ /.env
16
+
17
+ /spec/rails_app/spec/
18
+ /spec/rails_app/test/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.4.0
5
+ before_install: gem install bundler -v 1.14.4
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in devise-jira-authenticable.gemspec
4
+ gemspec
5
+
6
+
7
+
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 peter.bell215
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # Devise::Jira::Authenticable
2
+
3
+ This provides a mechanism to allow devise to authenticate using a JIRA instance. It integrates with the jira-ruby.gem. Even if you intend only to use a `jira-authenticable` strategy within Devise, I suggest starting by getting Devise going with the `database-authenticable` strategy.
4
+
5
+
6
+ The following instructions assume that you want to use the `jira-authenticable strategy` alongside another strategy such as `database-authenticatable`.
7
+
8
+ ## Devise Preparation
9
+
10
+ As JIRA uses usernames rather than email addresses for login credentials I would also make the changes to your app to use a username within Devise before adding adding this Gem. That way you can test that you have successfully implemented the user authentication before worrying about the JIRA interface.
11
+
12
+ The process is well documented [here](https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-with-something-other-than-their-email-address). Personally, I found the simplest was to replace:
13
+
14
+ config.authentication_keys = [:email]
15
+
16
+ with
17
+
18
+ config.authentication_keys = [:username]
19
+
20
+ You will also need to add a simple migration to add the username to your users table (assuming that is where you store user login details):
21
+
22
+ ```ruby
23
+ class AmendUser < ActiveRecord::Migration[5.1]
24
+ def change
25
+ add_column :users, :username, :string, index: true
26
+ end
27
+ end
28
+ ```
29
+
30
+ You clearly need to then populate the username field. The following example code creates usernames based on the current users email address:
31
+
32
+ ```ruby
33
+ # Static function to add usernames based on existing email addresses.
34
+ def self.add_usernames
35
+ User.transaction do
36
+ User.all.each do |user|
37
+ user.update!(username: /(\A[[:alpha:]]{2,}\.[a-z\-]{2,})@companyname\.com\z/.match(user.email)[1])
38
+ end
39
+ end
40
+ end
41
+ ```
42
+
43
+ Personally, I like to run something like the above script directly from the Rails console:
44
+
45
+ # rails console
46
+ Loading development environment (Rails 5.1.2)
47
+ 2.4.1 :001 > User.add_usernames
48
+
49
+ You also need to create the views as per the Devise instructions, and amend the views to use username rather than email.
50
+
51
+ ## Installation
52
+
53
+ So your app now uses Devise for authentication, and you have switched to using usernames rather than emails. Simply, add this line to your application's Gemfile:
54
+
55
+ ```ruby
56
+ gem 'devise-jira-authenticable'
57
+ ```
58
+
59
+ And then execute:
60
+
61
+ $ bundle install
62
+
63
+ Or install it yourself as:
64
+
65
+ $ gem install devise-jira-authenticatable
66
+
67
+ ## Setting up the database
68
+
69
+ You then need to add `devise-jira-authenticable` as a strategy to your rails app. Therefore, run:
70
+
71
+ $ rails generate devise_jira_authenticable:install jira_site:https://jira-url/
72
+
73
+ This adds various configuration items to the `config/initializers/devise.rb` file.
74
+
75
+ ## Changes to the Rails App
76
+
77
+ Amend the `jira_authenticable` configuration items in the Devise configuration file (`config/initializers/devise.rb`). The key one, if you didn't already do so when running the generator is to make sure your URL is correctly defined. The other one is the context path. Many JIRA sites have a path to their JIRA system of the form: `company_url/dev_jira`. The second part (`/dev_jira`) is set using the context path property in the config file.
78
+
79
+ Once correctly configured, simply add the `:jira_authenticable` strategy to the Devise user model and
80
+ you are good to go. Assuming you want users to be authenticated against against JIRA first, then the devise line looks like:
81
+
82
+ ```ruby
83
+ class User < ApplicationRecord
84
+
85
+ devise :jira_authenticable, :database_authenticatable, :recoverable, :rememberable,
86
+ :trackable, :validatable, :registerable
87
+ ```
88
+
89
+
90
+ ## Development
91
+
92
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
93
+
94
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
95
+
96
+ ## Contributing
97
+
98
+ Bug reports and pull requests are welcome on GitHub at [https://github.com/trapeze-bell-peter/devise-jira-authenticable]. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
99
+
100
+
101
+ ## License
102
+
103
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
104
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,42 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'devise/jira_authenticable/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'devise-jira-authenticable'
8
+ spec.version = Devise::JiraAuthenticable::VERSION
9
+ spec.authors = ['trapeze.bell.peter']
10
+ spec.email = ['peter.bell@trapezegroup.com']
11
+
12
+ spec.summary = 'Provide Devise authentication using a JIRA instance.'
13
+ spec.description = 'Interacts with the ruby-jira gem to provide authentication of a login against a JIRA system.'
14
+ spec.homepage = 'https://github.com/trapeze-bell-peter/devise-jira-authenticable'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_dependency('devise', '~> 4.2')
23
+ spec.add_dependency('jira-ruby', '~> 1.4.0')
24
+
25
+ spec.add_development_dependency 'bundler', '~> 1.14'
26
+ spec.add_development_dependency 'rake', '~> 12.0'
27
+
28
+ spec.add_development_dependency 'rails', '~> 5.1.1'
29
+ spec.add_development_dependency 'sqlite3', '~> 1.3'
30
+ spec.add_development_dependency 'puma', '~> 3.7'
31
+ spec.add_development_dependency 'sass-rails', '~> 5.0'
32
+ spec.add_development_dependency 'jquery-rails', '~> 4.3'
33
+
34
+ spec.add_development_dependency 'rspec', '~> 3.6'
35
+ spec.add_development_dependency 'rspec-rails', '~> 3.6'
36
+ spec.add_development_dependency 'capybara', '~> 2.13'
37
+ spec.add_development_dependency 'selenium-webdriver'
38
+ spec.add_development_dependency "chromedriver-helper", "1.0.0"
39
+ spec.add_development_dependency 'factory_girl_rails', '~> 4.8'
40
+ spec.add_development_dependency 'webmock', '~> 1.18', '>= 1.18.0'
41
+ spec.add_development_dependency 'ammeter', '~> 1.1.4'
42
+ end
@@ -0,0 +1 @@
1
+ require 'devise/jira_authenticable'
@@ -0,0 +1,28 @@
1
+
2
+
3
+ require 'devise'
4
+
5
+ require 'devise/jira_authenticable/version'
6
+ require 'devise/models/jira_authenticable'
7
+ require 'devise/strategies/jira_authenticable'
8
+
9
+ module Devise
10
+ # authentication_keys = [ :username ]
11
+
12
+ # The URL of the JIRA server.
13
+ mattr_accessor :jira_site
14
+
15
+ # The context path for the JIRA server ()
16
+ mattr_accessor :jira_context_path
17
+ @@jira_context_path = ''
18
+
19
+ # The timeout in seconds for JIRA requests
20
+ mattr_accessor :jira_read_timeout
21
+ @@jira_read_timeout = 120
22
+
23
+ # Option to handle radius timeout as authentication failure
24
+ mattr_accessor :handle_jira_timeout_as_failure
25
+ @@handle_jira_timeout_as_failure = false
26
+ end
27
+
28
+ Devise.add_module(:jira_authenticable, route: :session, strategy: true, controller: :sessions, model: true)
@@ -0,0 +1,5 @@
1
+ module Devise
2
+ module JiraAuthenticable
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
@@ -0,0 +1,90 @@
1
+ require 'jira-ruby'
2
+ require 'devise/strategies/jira_authenticable'
3
+
4
+ module Devise
5
+ module Models
6
+ # The JiraAuthenticable module is responsible for validating a user's credentials
7
+ # against the configured JIRA server. When authentication is successful, the
8
+ # attributes returned by the JIRA server are made available via the
9
+ # +jira_attributes+ accessor in the user model.
10
+ #
11
+ # The JiraAuthenticable module works by checking if the requested username already exists.
12
+ # If it does, radius authentication proceeds through that
13
+ # user record. Otherwise, a new user record is built and authentication proceeds.
14
+ # If authentication is successful, the +after_jira_authentication+ callback is
15
+ # invoked, the default implementation of which simply saves the user record with
16
+ # validations disabled.
17
+ #
18
+ # The radius username is extracted from the parameters hash by using the first
19
+ # configured value in the +Devise.authentication_keys+ array. If the authentication
20
+ # key is in the list of case insensitive keys, the username will be converted to
21
+ # lowercase prior to authentication.
22
+ #
23
+ # == Options
24
+ #
25
+ # JiraAuthenticable adds the following options to devise_for:
26
+ # * +jira_site+: The URL for the JIRA server.
27
+ # * +jira_context_path+: the context path for JIRA.
28
+ # * +jira_read_timeout+: The time we wait for a response from JIRA.
29
+ #
30
+ # == Callbacks
31
+ #
32
+ # The +after_jira_authentication+ callback is invoked on the user record when
33
+ # JIRA authentication succeeds for that user but prior to Devise checking if the
34
+ # user is active for authentication. Its default implementation simply saves the
35
+ # user record with validations disabled. This method should be overriden if further
36
+ # actions should be taken to make the user valid or active for authentication. If
37
+ # you override it, be sure to either call super to save the record or to save the
38
+ # record yourself.
39
+ module JiraAuthenticable
40
+ extend ActiveSupport::Concern
41
+
42
+ included do
43
+ attr_accessor :jira_client
44
+ attr_accessor :password
45
+ end
46
+
47
+ # Use the currently configured JIRA server to attempt to authenticate the
48
+ # supplied username and password. If authentication succeeds, make the JIRA
49
+ # attributes returned by the server available via the radius_attributes accessor.
50
+ # Returns true if authentication was successful and false otherwise.
51
+ #
52
+ # Parameters::
53
+ # * +username+: The username to send to the radius server
54
+ # * +password+: The password to send to the radius server
55
+ def valid_jira_password?(username, password)
56
+ self.jira_client = JIRA::Client.new(
57
+ username: username,
58
+ password: password,
59
+ site: self.class.jira_site,
60
+ context_path: self.class.jira_context_path,
61
+ auth_type: :cookie,
62
+ use_cookies: true,
63
+ read_timeout: self.class.jira_read_timeout
64
+ )
65
+ self.jira_client.authenticated?
66
+ rescue Timeout::Error
67
+ raise Timeout::Error unless self.class.handle_jira_timeout_as_failure
68
+ nil
69
+ end
70
+
71
+ module ClassMethods
72
+ Devise::Models.config(self, :jira_site, :jira_context_path, :jira_read_timeout, :handle_jira_timeout_as_failure)
73
+
74
+ # Invoked by the JiraAuthenticatable strategy to perform the authentication
75
+ # against the JIRA server. The username is extracted from the authentication hash.
76
+ # We then search for an existing resource using the username. If no resource
77
+ # is found, a new resource is built (not created). If authentication is
78
+ # successful the callback is responsible for saving the resource. Returns the
79
+ # resource if authentication succeeds and nil if it does not.
80
+ def find_for_jira_authentication(authentication_hash)
81
+ username, password = authentication_hash[:username], authentication_hash[:password]
82
+
83
+ resource = find_for_authentication( username: username )
84
+
85
+ resource&.valid_jira_password?(username, password) ? resource : nil
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,27 @@
1
+ require 'devise/strategies/authenticatable'
2
+
3
+ module Devise
4
+ module Strategies
5
+ # Strategy for authenticating users with a JIRA server. If authentication with
6
+ # the JIRA server fails, allow warden to move on to the next strategy. When
7
+ # authentication succeeds and Devise indicates that the resource has been
8
+ # successfully validated, invoke the +after_jira_authentication+ callback on the
9
+ # resource and let warden know we were successful and not to continue with executing
10
+ # further strategies.
11
+ class JiraAuthenticable < Authenticatable
12
+ # Invoked by warden to execute the strategy.
13
+ def authenticate!
14
+ auth_params = authentication_hash.merge(:password => password)
15
+ resource = valid_password? &&
16
+ mapping.to.find_for_jira_authentication(auth_params)
17
+ return fail(:invalid) unless resource
18
+
19
+ if validate(resource)
20
+ success!(resource)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ Warden::Strategies.add(:jira_authenticable, Devise::Strategies::JiraAuthenticable)
@@ -0,0 +1,59 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/active_record'
3
+ require 'rails/generators/migration'
4
+
5
+ module DeviseJiraAuthenticable
6
+ class InstallGenerator < Rails::Generators::Base
7
+ include Rails::Generators::Migration
8
+
9
+ source_root File.expand_path("../templates", __FILE__)
10
+
11
+ desc <<-DESC.gsub(/ {6}/, '')
12
+ Description:
13
+ Adds jira_authenticable strategy to the devise initializer
14
+ <JIRA SITE> - The URL address of the JIRA server
15
+ DESC
16
+
17
+ argument(:jira_site, banner: '<URL>', desc: 'The URL of the JIRA server')
18
+ class_option(:timeout, default: '120', desc: 'How long to wait for a response from the JIRA server')
19
+
20
+ def install
21
+ inject_into_file("config/initializers/devise.rb", default_devise_settings,
22
+ before: /^\s*.*==> Scopes configuration/)
23
+ end
24
+
25
+ def self.next_migration_number(path)
26
+ ActiveRecord::Generators::Base.next_migration_number(path)
27
+ end
28
+
29
+ private
30
+
31
+ def default_devise_settings
32
+ <<-CONFIG.gsub(/ {6}/, '')
33
+ # ==> Configuration for jira_authenticable
34
+ # The jira_authenticable strategy can be used in place of the
35
+ # database_authenticatable strategy or alongside it. The default order of the
36
+ # strategies is the reverse of how they were loaded. You can control this
37
+ # order by explicitly telling warden the order in which to apply the strategies.
38
+ # See the Warden Configuration section for further details.
39
+ #
40
+ # Configure the URL of the JIRA server to use.
41
+ config.jira_site = '#{jira_site}'
42
+ # Configure the context path for the JIRA server. Default is blank.
43
+ # config.jira_context_path = '/jira_context_path'
44
+ # Configure the standard timeout period for JIRA server requests for authentication. Default is 60
45
+ # config.jira_read_timeout = 99
46
+ # Configure whether a timeout is handled as an error or simply as a failed validation. Default is false
47
+ # config.handle_jira_timeout_as_failure = true
48
+ CONFIG
49
+ end
50
+
51
+ def devise_in_model
52
+ 'devise :jira_authenticable, authentication_keys: [ :username ]'
53
+ end
54
+
55
+ def migration_version
56
+ Rails.version.start_with?('5') ? "[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]" : ''
57
+ end
58
+ end
59
+ end
metadata ADDED
@@ -0,0 +1,303 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: devise-jira-authenticable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - trapeze.bell.peter
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-08-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: devise
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: jira-ruby
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.4.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.4.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.14'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.14'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '12.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '12.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 5.1.1
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 5.1.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: sqlite3
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.3'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: puma
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.7'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.7'
111
+ - !ruby/object:Gem::Dependency
112
+ name: sass-rails
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '5.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '5.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: jquery-rails
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '4.3'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '4.3'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3.6'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3.6'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rspec-rails
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '3.6'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '3.6'
167
+ - !ruby/object:Gem::Dependency
168
+ name: capybara
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '2.13'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '2.13'
181
+ - !ruby/object:Gem::Dependency
182
+ name: selenium-webdriver
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: chromedriver-helper
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - '='
200
+ - !ruby/object:Gem::Version
201
+ version: 1.0.0
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - '='
207
+ - !ruby/object:Gem::Version
208
+ version: 1.0.0
209
+ - !ruby/object:Gem::Dependency
210
+ name: factory_girl_rails
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '4.8'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '4.8'
223
+ - !ruby/object:Gem::Dependency
224
+ name: webmock
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '1.18'
230
+ - - ">="
231
+ - !ruby/object:Gem::Version
232
+ version: 1.18.0
233
+ type: :development
234
+ prerelease: false
235
+ version_requirements: !ruby/object:Gem::Requirement
236
+ requirements:
237
+ - - "~>"
238
+ - !ruby/object:Gem::Version
239
+ version: '1.18'
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: 1.18.0
243
+ - !ruby/object:Gem::Dependency
244
+ name: ammeter
245
+ requirement: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - "~>"
248
+ - !ruby/object:Gem::Version
249
+ version: 1.1.4
250
+ type: :development
251
+ prerelease: false
252
+ version_requirements: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - "~>"
255
+ - !ruby/object:Gem::Version
256
+ version: 1.1.4
257
+ description: Interacts with the ruby-jira gem to provide authentication of a login
258
+ against a JIRA system.
259
+ email:
260
+ - peter.bell@trapezegroup.com
261
+ executables: []
262
+ extensions: []
263
+ extra_rdoc_files: []
264
+ files:
265
+ - ".gitignore"
266
+ - ".rspec"
267
+ - ".travis.yml"
268
+ - Gemfile
269
+ - LICENSE.txt
270
+ - README.md
271
+ - Rakefile
272
+ - devise-jira-authenticable.gemspec
273
+ - lib/devise-jira-authenticable.rb
274
+ - lib/devise/jira_authenticable.rb
275
+ - lib/devise/jira_authenticable/version.rb
276
+ - lib/devise/models/jira_authenticable.rb
277
+ - lib/devise/strategies/jira_authenticable.rb
278
+ - lib/generators/devise_jira_authenticable/install_generator.rb
279
+ homepage: https://github.com/trapeze-bell-peter/devise-jira-authenticable
280
+ licenses:
281
+ - MIT
282
+ metadata: {}
283
+ post_install_message:
284
+ rdoc_options: []
285
+ require_paths:
286
+ - lib
287
+ required_ruby_version: !ruby/object:Gem::Requirement
288
+ requirements:
289
+ - - ">="
290
+ - !ruby/object:Gem::Version
291
+ version: '0'
292
+ required_rubygems_version: !ruby/object:Gem::Requirement
293
+ requirements:
294
+ - - ">="
295
+ - !ruby/object:Gem::Version
296
+ version: '0'
297
+ requirements: []
298
+ rubyforge_project:
299
+ rubygems_version: 2.6.12
300
+ signing_key:
301
+ specification_version: 4
302
+ summary: Provide Devise authentication using a JIRA instance.
303
+ test_files: []