omniauth-generator 0.1.0

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
+ SHA256:
3
+ metadata.gz: fedc3d26b48573ab55051ab223a168898f9275106024defd0b848ce0c0e87a62
4
+ data.tar.gz: 21b52f3c5a812a77e3ca02ededa20288d4b4e6ff37f78413fb9d7e27c6d98ade
5
+ SHA512:
6
+ metadata.gz: 70b1937a1444eaac817e631c9e25bd4c879eed85e2e93fc923cfa06b52396309541a3ac1c9bff96aca659a14e5eba20731f60fed40a629c71f57ea3aded17e16
7
+ data.tar.gz: 412c340cc7d8a4c8d3c6ed048c73e7459c22a24f40c0bc7636cfb51fcce5d24ff69982da7ef81f19288c5f433859f6708682ef1b111d231d2cebc3ee8c4422b7
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.0] - 2024-10-17
4
+
5
+ - Initial release
data/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # omniauth-generator
2
+
3
+ Rails Generator to install Omniauth for Devise via `rails g devise:omniauth:install`
4
+
5
+ ## Motivation
6
+
7
+ I needed way more time to get Devise to work with common Omniauth providers than I expected, primarily because there were no pretty buttons anywhere to use which match the 2024 design guidelines of the most important social logins. Next, there were a lot of important little caveats not considered in various tutorials or [other generators](https://github.com/abhaynikam/boring_generators/tree/main/lib/generators/boring/oauth).
8
+
9
+ This project contains helpers for the following social login buttons:
10
+
11
+ - [Google](https://developers.google.com/identity/branding-guidelines) - [omniauth-google-oauth2](https://github.com/zquestz/omniauth-google-oauth2)
12
+ - [Microsoft](https://learn.microsoft.com/en-us/entra/identity-platform/howto-add-branding-in-apps)
13
+ - [Apple](https://developer.apple.com/design/human-interface-guidelines/sign-in-with-apple)
14
+ - Facebook
15
+ - LinkedIn
16
+ - [GitHub](https://github.com/logos) (they don't have a guideline for how to style their login button)
17
+
18
+ The buttons have basic styling and should look pretty when `<buttons>` are already styled. This is how they look out of the box with [PicoCSS](https://picocss.com/):
19
+
20
+ <img src="https://github.com/user-attachments/assets/9df431de-74cb-44c6-bc08-31437dffbaef" width="456" />
21
+
22
+ The following aspects of the branding guidelines were considered:
23
+
24
+ - Google wants Roboto font (you have to serve it yourself)
25
+ - Microsoft wants Segeo UI (you have to serve it yourself)
26
+ - Facebook prefers that you write "Continue with Facebook" or "Log in with Facebook". All others don't care or seem fine with "Sign Up" and "Sign In"
27
+
28
+ ## Installation
29
+
30
+ This Gem expects that you already have:
31
+
32
+ - a working Devise setup (`rails devise:install`) without Omniauth
33
+ - a Devise resource called User
34
+ - routes set up via `devise_for :users`
35
+ - at least one oauth provider configured (API client id/secret) and callback URLs whitelisted.
36
+
37
+ ```
38
+ # Install Gem into development (or globally, it is not need in production)
39
+ bundle add omniauth-generator --group development
40
+
41
+ # Install at least one omniauth gem/strategy, e.g. of the following
42
+ bundle add omniauth-google-oauth2
43
+ bundle add omniauth-facebook
44
+ bundle add omniauth-linkedin
45
+ bundle add omniauth-github
46
+ bundle add omniauth-azure-activedirectory-v2
47
+ bundle add omniauth-apple
48
+
49
+ # Run Generator (will bundle install for you)
50
+ rails devise:omniauth:install
51
+
52
+ # For any Gem which you want to use, you must set matching credentials in `rails credentials:edit` (or see below for ENV), e.g.:
53
+ google:
54
+ client_id: YOUR_GOOGLE_CLIENT_ID
55
+ client_secret: YOUR_GOOGLE_CLIENT_SECRET
56
+ # Add entries for facebook, linkedin, github, microsoft, apple (all lowercase)
57
+
58
+ # After the generator is done, review all changes
59
+ rails db:migrate
60
+
61
+ rails server
62
+ ```
63
+
64
+ ## Features
65
+
66
+ - The name and paths of all strategies are sane (e.g. using 'microsoft' rather than 'azure_auth' or 'google' rather than 'google_oauth2'). Sane names are used for flash as well.
67
+ - Proper error messages are returned and set in the flash.
68
+ - All social logos were optimized/minified using https://jakearchibald.github.io/svgomg/
69
+ - All styling and CSS is inlined in the `Helper` so this Gem should work with any js and css bundler.
70
+ - Put all the social buttons into a separate renderer and separate them from `app/views/devise/shared/_links.html.erb`
71
+
72
+ ## Limitations
73
+
74
+ - The generator is able to support multiple `omniauth-xxx` gems at the same time, but users can not log into the same account from multiple providers when those providers provide the same email back. Compare this answer on SO: https://stackoverflow.com/a/22126562/278842
75
+ - The generator is using secrets from the Rails credentials file. If you prefer to use ENV you need to adjust the code in `config/initializers/devise.rb` accordingly.
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ task default: %i[]
@@ -0,0 +1,69 @@
1
+ require 'rails/generators'
2
+
3
+ module Devise
4
+ module Omniauth
5
+ class InstallGenerator < Rails::Generators::Base
6
+
7
+ desc "Adds OmniAuth to an application using Devise"
8
+ source_root File.expand_path("templates", __dir__)
9
+
10
+ def dependencies
11
+
12
+ omniauth_strategies = {
13
+ google: :GoogleOauth2,
14
+ facebook: :Facebook,
15
+ linkedin: :LinkedIn,
16
+ github: :GitHub,
17
+ microsoft: :AzureActivedirectoryV2,
18
+ apple: :Apple
19
+ }
20
+ if !omniauth_strategies.any? { |_, strategy_class| Gem.loaded_specs.has_key?("omniauth-#{strategy_class.to_s.underscore.gsub('_', '-')}") }
21
+ say_error("Omniauth-generator: Need at least one OmniAuth strategy gem to be installed. Obvious candidates not found.")
22
+ ask("Would you like to continue? (y/n)") do |answer|
23
+ Kernel.exit(1) unless answer.downcase == 'y'
24
+ end
25
+ end
26
+
27
+ gem "omniauth-rails_csrf_protection"
28
+ end
29
+
30
+ def database_update
31
+ generate :migration, "AddOmniauthToUsers provider:string uid:string"
32
+ end
33
+
34
+ def update_application
35
+ inject_into_class 'app/models/user.rb', 'User', File.read(find_in_source_paths('_user.rb')).indent(2)
36
+
37
+ # Configure Omniauth strategies in `config/initializers/devise.rb`
38
+ inject_into_file 'config/initializers/devise.rb', File.read(find_in_source_paths('_devise.rb')).indent(2), before: /^end/
39
+
40
+ # Update Devise routes in `config/routes.rb`
41
+ gsub_file 'config/routes.rb', 'devise_for :users', <<~RUBY.strip.indent(2)
42
+ devise_for :users,
43
+ controllers: {
44
+ omniauth_callbacks: "users/omniauth_callbacks"
45
+ }
46
+ RUBY
47
+
48
+ # Create `Users::OmniauthCallbacksController` to handle callbacks
49
+ copy_file 'omniauth_callbacks_controller.rb', 'app/controllers/users/omniauth_callbacks_controller.rb'
50
+ end
51
+
52
+ def update_views
53
+ gsub_file 'app/views/devise/shared/_links.html.erb', /<%- if devise_mapping\.omniauthable\?.*?\n<% end %>/m, ''
54
+
55
+ Dir.glob("app/views/devise/{registrations,sessions}/new.html.erb").each { |f|
56
+ inject_into_file f, '<%= render "devise/shared/social_buttons" %>' + "\n\n", before: '<%= render "devise/shared/links" %>'
57
+ }
58
+
59
+ copy_file '_social_buttons.html.erb', 'app/views/devise/shared/_social_buttons.html.erb'
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+
66
+
67
+
68
+
69
+
@@ -0,0 +1,37 @@
1
+ # Add all the Omniauth strategies which are present in the credentials file
2
+ omniauth_strategies = {
3
+ google: :GoogleOauth2,
4
+ facebook: :Facebook,
5
+ linkedin: :LinkedIn,
6
+ github: :GitHub,
7
+ microsoft: :AzureActivedirectoryV2,
8
+ apple: :Apple
9
+ }
10
+
11
+ omniauth_strategies.each do |strategy, strategy_class|
12
+ if Rails.application.credentials[strategy].present?
13
+ begin
14
+ clazz_name = "OmniAuth::Strategies::#{strategy_class}"
15
+ clazz = Kernel.const_get(clazz_name)
16
+ rescue NameError
17
+ require 'active_support/inflector'
18
+ puts "Gem for OmniAuth strategy '#{strategy}' not found. Please add to your Gemfile. Likely named 'omniauth-#{strategy_class.to_s.underscore.gsub('_', '-')}' or ...-oauth2."
19
+ Kernel.exit(1)
20
+ end
21
+
22
+ config.omniauth strategy,
23
+ client_id: Rails.application.credentials[strategy][:client_id],
24
+ client_secret: Rails.application.credentials[strategy][:client_secret],
25
+ strategy_class: clazz,
26
+ name: strategy # Even though this is the same as the provider key above, otherwise routes don't match
27
+ else
28
+ begin
29
+ clazz_name = "OmniAuth::Strategies::#{strategy_class}"
30
+ clazz = Kernel.const_get(clazz_name)
31
+ puts "Can't start without #{strategy} API credentials. Please run 'rails credentials:edit --environment xxx'."
32
+ # Kernel.exit(1)
33
+ rescue NameError
34
+ # Do nothing - Credentials not found but Gem also not there
35
+ end if Rails.env.development?
36
+ end
37
+ end
@@ -0,0 +1,156 @@
1
+ <%- resource_class.omniauth_providers.each do |provider| -%>
2
+ <%- case provider -%>
3
+ <%- when :google -%>
4
+ <%= button_to omniauth_authorize_path(resource_name, provider), data: { turbo: false }, method: :post, style: "
5
+ display: flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ background-color: white;
9
+ border: 1px solid #747775;
10
+ border-radius: 4px;
11
+ font-family: 'Roboto', Arial, sans-serif;
12
+ color: #1f1f1f;
13
+ font-weight: 500;
14
+ box-shadow: 0 1px 2px rgba(60, 64, 67, 0.30), 0 1px 3px rgba(60, 64, 67, 0.15);
15
+ outline: none;" do %>
16
+ <svg xmlns="http://www.w3.org/2000/svg" style="width:20px;height:20px;margin-right:12px" viewBox="0 0 48 48">
17
+ <path fill="#EA4335" d="M24 10c4 0 7 1 9 3l7-7c-4-4-10-6-16-6C15 0 7 5 3 13l8 6c1-5 7-9 13-9z"/>
18
+ <path fill="#4285F4" d="M47 25v-5H24v9h13c-1 3-2 6-5 7l8 6c4-4 7-10 7-17z"/>
19
+ <path fill="#FBBC05" d="m11 29-1-5 1-5-8-6a24 24 0 0 0 0 22l8-6z"/>
20
+ <path fill="#34A853" d="M24 48c6 0 12-2 16-6l-8-6c-2 2-5 2-8 2-6 0-12-4-13-9l-8 6c4 8 12 13 21 13z"/>
21
+ <path fill="none" d="M0 0h48v48H0z"/>
22
+ </svg>
23
+ <span>
24
+ Sign <%= controller_name == 'registrations' ? 'up' : 'in' %> with <%= OmniAuth::Utils.camelize(provider) %>
25
+ </span>
26
+ <% end %>
27
+
28
+ <%- when :microsoft -%>
29
+ <%= button_to omniauth_authorize_path(resource_name, provider), data: { turbo: false }, method: :post, style: "
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ background-color: #FFFFFF;
34
+ border: 1px solid #8C8C8C;
35
+ border-radius: 4px;
36
+ font-family: 'Segoe UI', Arial, sans-serif;
37
+ color: #5E5E5E;
38
+ font-weight: 600;
39
+ box-shadow: 0 1px 2px rgba(60, 64, 67, 0.30), 0 1px 3px rgba(60, 64, 67, 0.15);
40
+ outline: none;
41
+ " do %>
42
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 21 21" style="width: 20px; height: 20px; margin-right: 12px;">
43
+ <rect x="1" y="1" width="9" height="9" fill="#f25022"/>
44
+ <rect x="1" y="11" width="9" height="9" fill="#00a4ef"/>
45
+ <rect x="11" y="1" width="9" height="9" fill="#7fba00"/>
46
+ <rect x="11" y="11" width="9" height="9" fill="#ffb900"/>
47
+ </svg>
48
+ <span style="margin-bottom: 0.1em;">
49
+ Sign <%= controller_name == 'registrations' ? 'up' : 'in' %> with <%= OmniAuth::Utils.camelize(provider) %>
50
+ </span>
51
+ <% end %>
52
+
53
+ <%- when :facebook -%>
54
+ <%= button_to omniauth_authorize_path(resource_name, provider), data: { turbo: false }, method: :post, style: "
55
+ display: flex;
56
+ align-items: center;
57
+ justify-content: center;
58
+ background-color: #1877F2;
59
+ border: none;
60
+ border-radius: 4px;
61
+ color: #FFFFFF;
62
+ font-weight: 600;
63
+ box-shadow: 0 1px 2px rgba(60, 64, 67, 0.30), 0 1px 3px rgba(60, 64, 67, 0.15);
64
+ outline: none;
65
+ " do %>
66
+ <svg xmlns="http://www.w3.org/2000/svg" style="width:30px;height:30px;margin-right:12px" viewBox="0 0 666.7 666.7">
67
+ <defs>
68
+ <clipPath id="a" clipPathUnits="userSpaceOnUse">
69
+ <path d="M0 700h700V0H0Z"/>
70
+ </clipPath>
71
+ </defs>
72
+ <g clip-path="url(#a)" transform="matrix(1.3333333 0 0 -1.3333333 -133 800)">
73
+ <path d="M0 0a250 250 0 1 1-310-243v167h-52V0h52v33c0 85 38 124 122 124 15 0 43-3 54-6V82l-29 1c-41 0-57-16-57-56V0h82l-14-76h-68v-172A250 250 0 0 1 0 0" style="fill:#fff;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="translate(600 350)"/>
74
+ <path d="m0 0 14 76h-82v27c0 41 16 56 57 56l29-1v70c-11 3-38 6-54 6-84 0-122-40-122-125V76h-52V0h52v-166a251 251 0 0 1 90-6V0Z" style="fill:#1877f2;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="translate(448 274)"/>
75
+ </g>
76
+ </svg>
77
+ <span>
78
+ <%= controller_name == 'registrations' ? 'Continue' : 'Log in' %> with <%= OmniAuth::Utils.camelize(provider) %>
79
+ </span>
80
+ <% end %>
81
+
82
+ <%- when :github -%>
83
+ <%= button_to omniauth_authorize_path(resource_name, provider), data: { turbo: false }, method: :post, style: "
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ background-color: #000000;
88
+ border: none;
89
+ border-radius: 4px;
90
+ color: #FFFFFF;
91
+ font-weight: 600;
92
+ box-shadow: 0 1px 2px rgba(60, 64, 67, 0.30), 0 1px 3px rgba(60, 64, 67, 0.15);
93
+ outline: none;
94
+ " do %>
95
+ <svg xmlns="http://www.w3.org/2000/svg" style="width:30px;height:30px;margin-right:12px" viewBox="0 0 96 98">
96
+ <path fill="#fff" fill-rule="evenodd" d="M48.9 0a49.2 49.2 0 0 0-15.4 96c2.3.4 3.2-1.2 3.2-2.5v-9c-13.6 2.9-16.5-6-16.5-6-2.2-5.7-5.4-7.1-5.4-7.1-4.4-3 .3-3 .3-3 5 .3 7.5 5 7.5 5 4.4 7.5 11.5 5.4 14.3 4 .4-3 1.7-5.3 3-6.5-10.8-1.1-22.2-5.4-22.2-24.3 0-5.4 2-9.8 5-13.2-.5-1.2-2.2-6.3.5-13 0 0 4.1-1.3 13.4 5A47 47 0 0 1 49 23.8c4 0 8.3.6 12.2 1.6 9.3-6.3 13.4-5 13.4-5 2.7 6.7 1 11.8.5 13 3.1 3.4 5 7.8 5 13.2 0 19-11.4 23-22.3 24.3 1.7 1.5 3.3 4.5 3.3 9.1v13.5c0 1.3.8 2.9 3.2 2.4a49.2 49.2 0 0 0 33.4-46.7A49 49 0 0 0 49 0z" clip-rule="evenodd"/>
97
+ </svg>
98
+ <span>
99
+ Sign <%= controller_name == 'registrations' ? 'up' : 'in' %> with GitHub
100
+ </span>
101
+ <% end %>
102
+
103
+ <%- when :linkedin -%>
104
+ <%= button_to omniauth_authorize_path(resource_name, provider), data: { turbo: false }, method: :post, style: "
105
+ display: flex;
106
+ align-items: center;
107
+ justify-content: center;
108
+ background-color: #0077B5;
109
+ border: none;
110
+ border-radius: 4px;
111
+ color: #FFFFFF;
112
+ font-weight: 600;
113
+ box-shadow: 0 1px 2px rgba(60, 64, 67, 0.30), 0 1px 3px rgba(60, 64, 67, 0.15);
114
+ outline: none;
115
+ " do %>
116
+ <svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px;margin-right:12px" viewBox="0 0 72 72">
117
+ <g fill="none" fill-rule="evenodd">
118
+ <path fill="#FFF" d="M8 72h56c4 0 8-4 8-8V8c0-4-4-8-8-8H8C4 0 0 4 0 8v56c0 4 4 8 8 8Z"/>
119
+ <path fill="#007EBB" d="M62 62H51V44c0-5-2-8-6-8s-6 3-6 8v18H29V27h10v5s3-6 10-6c8 0 13 5 13 14v22ZM16 23c-3 0-6-3-6-7 0-3 3-6 6-6 4 0 7 3 7 6 0 4-3 7-7 7Zm-5 39h11V27H11v35Z"/>
120
+ </g>
121
+ </svg>
122
+ <span>
123
+ Sign <%= controller_name == 'registrations' ? 'up' : 'in' %> with <%= OmniAuth::Utils.camelize(provider) %>
124
+ </span>
125
+ <% end %>
126
+
127
+ <%- when :apple -%>
128
+
129
+ <%= button_to omniauth_authorize_path(resource_name, provider), data: { turbo: false }, method: :post, style: "
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: center;
133
+ background-color: #000000;
134
+ border: none;
135
+ border-radius: 4px;
136
+ color: #FFFFFF;
137
+ font-weight: 600;
138
+ box-shadow: 0 1px 2px rgba(60, 64, 67, 0.30), 0 1px 3px rgba(60, 64, 67, 0.15);
139
+ outline: none;" do %>
140
+ <svg xmlns="http://www.w3.org/2000/svg" style="width:30px;height:30px;margin-right:5px" viewBox="13 13 30 30">
141
+ <g fill="none" fill-rule="evenodd">
142
+ <path fill="#000" d="M6 6h44v44H6z"/>
143
+ <path fill="#FFF" fill-rule="nonzero" d="M28.2 20.4c.9 0 1.9-.6 2.5-1.4a4 4 0 0 0 1-2.6V16c-1 0-2 .6-2.8 1.4-.5.7-1 1.6-1 2.6v.4h.3Zm-3 14.6c1.2 0 1.7-.8 3.2-.8 1.4 0 1.7.8 3 .8 1.2 0 2-1.2 2.8-2.4 1-1.3 1.3-2.6 1.3-2.7 0 0-2.5-1-2.5-3.8 0-2.4 2-3.5 2-3.6a4.3 4.3 0 0 0-3.6-2c-1.4 0-2.6 1-3.3 1-.7 0-1.8-.9-3-.9-2.3 0-4.6 2-4.6 5.7 0 2.3.9 4.7 2 6.3.8 1.3 1.6 2.4 2.8 2.4Z"/>
144
+ </g>
145
+ </svg>
146
+ <span>
147
+ Sign <%= controller_name == 'registrations' ? 'up' : 'in' %> with <%= OmniAuth::Utils.camelize(provider) %>
148
+ </span>
149
+ <% end %>
150
+
151
+ <%- else -%>
152
+
153
+ <%= button_to "Sign #{controller_name == 'registrations' ? "up" : "in" } with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider), data: { turbo: false } %>
154
+
155
+ <%- end -%>
156
+ <%- end -%>
@@ -0,0 +1,26 @@
1
+
2
+ if Devise.omniauth_providers&.size > 0
3
+ devise :omniauthable, omniauth_providers: Devise.omniauth_providers
4
+
5
+ def self.from_omniauth(auth)
6
+ where(provider: auth.provider, uid: auth.uid)
7
+ .or(where(uid: nil, provider: nil, email: auth.info.email.downcase.strip))
8
+ .first_or_create do |user|
9
+ user.email = auth.info.email
10
+ user.password ||= Devise.friendly_token[0, 20]
11
+
12
+ # if auth.info.last_name.present? && auth.info.first_name.present?
13
+ # user.nickname = "#{auth.info.first_name} #{auth.info.last_name[0]}."
14
+ # elsif auth.info.name.present?
15
+ # user.nickname = auth.info.name
16
+ # end
17
+
18
+ # user.name = auth.info.name # assuming the user model has a name
19
+ # user.image = auth.info.image # assuming the user model has an image
20
+
21
+ # If you are using confirmable and the provider(s) you use validate emails,
22
+ # uncomment the line below to skip the confirmation emails.
23
+ # user.skip_confirmation!
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,40 @@
1
+ class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
2
+
3
+ Devise.omniauth_providers.each do |provider|
4
+ define_method(provider) do
5
+ handle_auth(provider.to_s.capitalize)
6
+ end
7
+ end
8
+
9
+ def handle_auth(kind)
10
+ @user = User.from_omniauth(request.env['omniauth.auth'])
11
+
12
+ if @user.persisted?
13
+ flash[:notice] = I18n.t 'devise.omniauth_callbacks.success', kind: kind
14
+ sign_in_and_redirect @user, event: :authentication
15
+ else
16
+ # Can join("\n") errors if your frontend can't handle multiple errors
17
+ flash[:alert] = @user.errors.full_messages if is_navigational_format?
18
+ redirect_to new_user_registration_url
19
+ end
20
+ end
21
+
22
+ # Fix for error in OmniauthCallbacksController
23
+ # OAuth2::Error does not have `error_reason` and `error` methods
24
+ def failure_message
25
+ exception = request.respond_to?(:get_header) ? request.get_header("omniauth.error") : request.env["omniauth.error"]
26
+ error = exception.error_reason if exception.respond_to?(:error_reason)
27
+ error ||= exception.description if exception.respond_to?(:description)
28
+ return error.to_s if error # Description and Error_reason are normal text
29
+
30
+ error ||= exception.error if exception.respond_to?(:error)
31
+ error ||= exception.code if exception.respond_to?(:code)
32
+ error ||= (request.respond_to?(:get_header) ? request.get_header("omniauth.error.type") : request.env["omniauth.error.type"]).to_s
33
+ error.to_s.humanize if error
34
+ end
35
+
36
+ def failure
37
+ # Might want to log this/instrument/notify
38
+ redirect_to root_path
39
+ end
40
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Omniauth
4
+ module Generator
5
+ VERSION = "0.1.0"
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "generator/version"
4
+ require_relative "generator/install_generator.rb"
@@ -0,0 +1,6 @@
1
+ module Omniauth
2
+ module Generator
3
+ VERSION: String
4
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
5
+ end
6
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: omniauth-generator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Christopher Oezbek
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-10-17 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Rails generator to create an Omniauth installation for Devise including
14
+ social login buttons.
15
+ email:
16
+ - c.oezbek@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - CHANGELOG.md
22
+ - README.md
23
+ - Rakefile
24
+ - lib/omniauth/generator.rb
25
+ - lib/omniauth/generator/install_generator.rb
26
+ - lib/omniauth/generator/templates/_devise.rb
27
+ - lib/omniauth/generator/templates/_social_buttons.html.erb
28
+ - lib/omniauth/generator/templates/_user.rb
29
+ - lib/omniauth/generator/templates/omniauth_callbacks_controller.rb
30
+ - lib/omniauth/generator/version.rb
31
+ - sig/omniauth/generator.rbs
32
+ homepage: https://github.com/coezbek/omniauth-generator
33
+ licenses: []
34
+ metadata:
35
+ allowed_push_host: https://rubygems.org
36
+ homepage_uri: https://github.com/coezbek/omniauth-generator
37
+ source_code_uri: https://github.com/coezbek/omniauth-generator
38
+ changelog_uri: https://github.com/coezbek/omniauth-generator/README.md#Changelog
39
+ post_install_message:
40
+ rdoc_options: []
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 3.0.0
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubygems_version: 3.4.19
55
+ signing_key:
56
+ specification_version: 4
57
+ summary: Rails generator to create an Omniauth installation for Devise
58
+ test_files: []