boring_generators 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +12 -0
- data/CHANGELOG.md +10 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +78 -5
- data/README.md +11 -0
- data/boring_generators.gemspec +1 -1
- data/exe/boring +5 -0
- data/lib/boring_generators.rb +1 -0
- data/lib/boring_generators/cli.rb +26 -0
- data/lib/boring_generators/version.rb +1 -1
- data/lib/generators/boring/ci/github_action/install/install_generator.rb +16 -2
- data/lib/generators/boring/ci/github_action/install/templates/ci.yml.tt +1 -11
- data/lib/generators/boring/devise/install/install_generator.rb +12 -4
- data/lib/generators/boring/oauth/facebook/install/install_generator.rb +91 -0
- data/lib/generators/boring/oauth/facebook/install/templates/README +24 -0
- data/lib/generators/boring/oauth/facebook/install/templates/omniauth.rb +3 -0
- data/lib/generators/boring/oauth/facebook/install/templates/omniauth_callbacks_controller.rb +21 -0
- data/lib/generators/boring/pundit/install/install_generator.rb +3 -3
- data/lib/generators/boring/tailwind/install/install_generator.rb +1 -1
- metadata +11 -664
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 66c4c0c7499756d66e0d992e4ec79ad105f310b40384a49d99b1a3f96ebfaeab
|
4
|
+
data.tar.gz: '074778686e124d14e6010e6a886b209484abf2774e0836e48631c900738f3ae8'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44e5a7cfde50201a16ce39cd6c1e28618efe002229e81f15613278bdfdb5f448a4d02532d974b7fe232742cd5d6b5c55ac9aa851b84cad8bc90c1cb7c9efdb77
|
7
|
+
data.tar.gz: 7ec572ba9730632511e08d4aa6a943a8c97db89ae93c0b5d2db4813b9ece7ac53b586b1690d2f636d1bd7fcff6c46572501ec69752af1008b43c949e1789e456
|
data/.github/FUNDING.yml
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# These are supported funding model platforms
|
2
|
+
|
3
|
+
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
4
|
+
patreon: # Replace with a single Patreon username
|
5
|
+
open_collective: boring_generators
|
6
|
+
ko_fi: # Replace with a single Ko-fi username
|
7
|
+
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
8
|
+
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
9
|
+
liberapay: # Replace with a single Liberapay username
|
10
|
+
issuehunt: # Replace with a single IssueHunt username
|
11
|
+
otechie: # Replace with a single Otechie username
|
12
|
+
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
3
|
## master (unreleased)
|
4
|
+
|
5
|
+
## 0.6.0 (January 10th, 2021)
|
6
|
+
* Updates default ruby version of GitHub Actions install generator. ([@jamesglover][])
|
7
|
+
* Simplify generated GitHub Actions install ([@jamesglover][])
|
8
|
+
* Adds boring generator CLI ([@luathn][])
|
9
|
+
* Adds Devise Facebook Omniauth generator. ([@abhaynikam][])
|
10
|
+
|
11
|
+
## 0.5.0 (December 20th, 2020)
|
4
12
|
* Adds favicon build generator. ([@abhaynikam][])
|
5
13
|
* Adds Pundit install generator. ([@CiTroNaK][])
|
6
14
|
* Adds GraphQL generator. ([@abhaynikam][])
|
@@ -34,3 +42,5 @@
|
|
34
42
|
|
35
43
|
[@abhaynikam]: https://github.com/abhaynikam
|
36
44
|
[@CiTroNaK]: https://github.com/CiTroNaK
|
45
|
+
[@jamesglover]: https://github.com/JamesGlover
|
46
|
+
[@luathn]: https://github.com/luathn
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,12 +1,29 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
boring_generators (0.
|
4
|
+
boring_generators (0.5.0)
|
5
5
|
railties
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
+
actioncable (6.0.3.4)
|
11
|
+
actionpack (= 6.0.3.4)
|
12
|
+
nio4r (~> 2.0)
|
13
|
+
websocket-driver (>= 0.6.1)
|
14
|
+
actionmailbox (6.0.3.4)
|
15
|
+
actionpack (= 6.0.3.4)
|
16
|
+
activejob (= 6.0.3.4)
|
17
|
+
activerecord (= 6.0.3.4)
|
18
|
+
activestorage (= 6.0.3.4)
|
19
|
+
activesupport (= 6.0.3.4)
|
20
|
+
mail (>= 2.7.1)
|
21
|
+
actionmailer (6.0.3.4)
|
22
|
+
actionpack (= 6.0.3.4)
|
23
|
+
actionview (= 6.0.3.4)
|
24
|
+
activejob (= 6.0.3.4)
|
25
|
+
mail (~> 2.5, >= 2.5.4)
|
26
|
+
rails-dom-testing (~> 2.0)
|
10
27
|
actionpack (6.0.3.4)
|
11
28
|
actionview (= 6.0.3.4)
|
12
29
|
activesupport (= 6.0.3.4)
|
@@ -14,12 +31,31 @@ GEM
|
|
14
31
|
rack-test (>= 0.6.3)
|
15
32
|
rails-dom-testing (~> 2.0)
|
16
33
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
34
|
+
actiontext (6.0.3.4)
|
35
|
+
actionpack (= 6.0.3.4)
|
36
|
+
activerecord (= 6.0.3.4)
|
37
|
+
activestorage (= 6.0.3.4)
|
38
|
+
activesupport (= 6.0.3.4)
|
39
|
+
nokogiri (>= 1.8.5)
|
17
40
|
actionview (6.0.3.4)
|
18
41
|
activesupport (= 6.0.3.4)
|
19
42
|
builder (~> 3.1)
|
20
43
|
erubi (~> 1.4)
|
21
44
|
rails-dom-testing (~> 2.0)
|
22
45
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
46
|
+
activejob (6.0.3.4)
|
47
|
+
activesupport (= 6.0.3.4)
|
48
|
+
globalid (>= 0.3.6)
|
49
|
+
activemodel (6.0.3.4)
|
50
|
+
activesupport (= 6.0.3.4)
|
51
|
+
activerecord (6.0.3.4)
|
52
|
+
activemodel (= 6.0.3.4)
|
53
|
+
activesupport (= 6.0.3.4)
|
54
|
+
activestorage (6.0.3.4)
|
55
|
+
actionpack (= 6.0.3.4)
|
56
|
+
activejob (= 6.0.3.4)
|
57
|
+
activerecord (= 6.0.3.4)
|
58
|
+
marcel (~> 0.3.1)
|
23
59
|
activesupport (6.0.3.4)
|
24
60
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
25
61
|
i18n (>= 0.7, < 2)
|
@@ -30,20 +66,44 @@ GEM
|
|
30
66
|
byebug (11.1.3)
|
31
67
|
concurrent-ruby (1.1.7)
|
32
68
|
crass (1.0.6)
|
33
|
-
erubi (1.
|
69
|
+
erubi (1.10.0)
|
70
|
+
globalid (0.4.2)
|
71
|
+
activesupport (>= 4.2.0)
|
34
72
|
i18n (1.8.5)
|
35
73
|
concurrent-ruby (~> 1.0)
|
36
|
-
loofah (2.
|
74
|
+
loofah (2.8.0)
|
37
75
|
crass (~> 1.0.2)
|
38
76
|
nokogiri (>= 1.5.9)
|
77
|
+
mail (2.7.1)
|
78
|
+
mini_mime (>= 0.1.1)
|
79
|
+
marcel (0.3.3)
|
80
|
+
mimemagic (~> 0.3.2)
|
39
81
|
method_source (1.0.0)
|
82
|
+
mimemagic (0.3.5)
|
83
|
+
mini_mime (1.0.2)
|
40
84
|
mini_portile2 (2.4.0)
|
41
85
|
minitest (5.14.2)
|
86
|
+
nio4r (2.5.4)
|
42
87
|
nokogiri (1.10.10)
|
43
88
|
mini_portile2 (~> 2.4.0)
|
44
89
|
rack (2.2.3)
|
45
90
|
rack-test (1.1.0)
|
46
91
|
rack (>= 1.0, < 3)
|
92
|
+
rails (6.0.3.4)
|
93
|
+
actioncable (= 6.0.3.4)
|
94
|
+
actionmailbox (= 6.0.3.4)
|
95
|
+
actionmailer (= 6.0.3.4)
|
96
|
+
actionpack (= 6.0.3.4)
|
97
|
+
actiontext (= 6.0.3.4)
|
98
|
+
actionview (= 6.0.3.4)
|
99
|
+
activejob (= 6.0.3.4)
|
100
|
+
activemodel (= 6.0.3.4)
|
101
|
+
activerecord (= 6.0.3.4)
|
102
|
+
activestorage (= 6.0.3.4)
|
103
|
+
activesupport (= 6.0.3.4)
|
104
|
+
bundler (>= 1.3.0)
|
105
|
+
railties (= 6.0.3.4)
|
106
|
+
sprockets-rails (>= 2.0.0)
|
47
107
|
rails-dom-testing (2.0.3)
|
48
108
|
activesupport (>= 4.2.0)
|
49
109
|
nokogiri (>= 1.6)
|
@@ -56,11 +116,22 @@ GEM
|
|
56
116
|
rake (>= 0.8.7)
|
57
117
|
thor (>= 0.20.3, < 2.0)
|
58
118
|
rake (12.3.3)
|
119
|
+
sprockets (4.0.2)
|
120
|
+
concurrent-ruby (~> 1.0)
|
121
|
+
rack (> 1, < 3)
|
122
|
+
sprockets-rails (3.2.2)
|
123
|
+
actionpack (>= 4.0)
|
124
|
+
activesupport (>= 4.0)
|
125
|
+
sprockets (>= 3.0.0)
|
126
|
+
sqlite3 (1.4.2)
|
59
127
|
thor (1.0.1)
|
60
128
|
thread_safe (0.3.6)
|
61
|
-
tzinfo (1.2.
|
129
|
+
tzinfo (1.2.9)
|
62
130
|
thread_safe (~> 0.1)
|
63
|
-
|
131
|
+
websocket-driver (0.7.3)
|
132
|
+
websocket-extensions (>= 0.1.0)
|
133
|
+
websocket-extensions (0.1.5)
|
134
|
+
zeitwerk (2.4.2)
|
64
135
|
|
65
136
|
PLATFORMS
|
66
137
|
ruby
|
@@ -69,7 +140,9 @@ DEPENDENCIES
|
|
69
140
|
boring_generators!
|
70
141
|
byebug
|
71
142
|
minitest (~> 5.0)
|
143
|
+
rails (~> 6.0.3.4)
|
72
144
|
rake (~> 12.0)
|
145
|
+
sqlite3 (~> 1.4)
|
73
146
|
|
74
147
|
BUNDLED WITH
|
75
148
|
2.1.4
|
data/README.md
CHANGED
@@ -32,6 +32,11 @@ Or install it yourself as:
|
|
32
32
|
|
33
33
|
$ gem install boring_generators
|
34
34
|
|
35
|
+
And then you can use it this way:
|
36
|
+
|
37
|
+
$ boring generate boring:simple_form:install --css_framework=<css_framework>
|
38
|
+
$ boring g boring:pry:install
|
39
|
+
|
35
40
|
## Usage
|
36
41
|
|
37
42
|
The boring generator introduces following generators:
|
@@ -55,11 +60,17 @@ The boring generator introduces following generators:
|
|
55
60
|
- Install GraphQL: `rails generate boring:graphql:install`
|
56
61
|
- Install SimpleForm: `rails generate boring:simple_form:install --css_framework=<css_framework>`
|
57
62
|
- Install Devise: `rails generate boring:devise:install`
|
63
|
+
- Install Devise Facebook Omniauth: `rails generate boring:oauth:facebook:install`
|
58
64
|
|
59
65
|
## Development
|
60
66
|
|
61
67
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
62
68
|
|
69
|
+
You can also run specific test cases using following commands:
|
70
|
+
```
|
71
|
+
bundle exec ruby -w -Itest test/generators/tailwind_install_generator_test.rb
|
72
|
+
```
|
73
|
+
|
63
74
|
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).
|
64
75
|
|
65
76
|
## Contributing
|
data/boring_generators.gemspec
CHANGED
data/exe/boring
ADDED
data/lib/boring_generators.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "rails/generators"
|
3
|
+
require_relative "../boring_generators"
|
4
|
+
|
5
|
+
module BoringGenerators
|
6
|
+
class CLI < Thor
|
7
|
+
map "g" => :generate
|
8
|
+
map %w(--version -v) => :__print_version
|
9
|
+
|
10
|
+
desc "generate GENERATOR [options]", "Add gem to the application"
|
11
|
+
def generate(generator, *options)
|
12
|
+
Rails::Generators.invoke(generator, options)
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "--version, -v", "Print gem version"
|
16
|
+
def __print_version
|
17
|
+
puts "Boring generators #{BoringGenerators::VERSION}"
|
18
|
+
end
|
19
|
+
|
20
|
+
class << self
|
21
|
+
def exit_on_failure?
|
22
|
+
true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -7,12 +7,14 @@ module Boring
|
|
7
7
|
desc "Adds Github Action to the application"
|
8
8
|
source_root File.expand_path("templates", __dir__)
|
9
9
|
|
10
|
-
|
10
|
+
RUBY_VERSION_FILE = ".ruby-version"
|
11
|
+
|
12
|
+
DEFAULT_RUBY_VERSION = ".ruby-version"
|
11
13
|
DEFAULT_NODE_VERSION = "10.13.0"
|
12
14
|
DEFAULT_REPOSITORY_NAME = "boring_generators"
|
13
15
|
|
14
16
|
class_option :ruby_version, type: :string, aliases: "-v",
|
15
|
-
desc: "Tell us the ruby version which you use for the application. Default to Ruby #{DEFAULT_RUBY_VERSION}"
|
17
|
+
desc: "Tell us the ruby version which you use for the application. Default to Ruby #{DEFAULT_RUBY_VERSION}, which will cause the action to use the version specified in the #{RUBY_VERSION_FILE} file."
|
16
18
|
class_option :node_version, type: :string, aliases: "-v",
|
17
19
|
desc: "Tell us the node version which you use for the application. Default to Node #{DEFAULT_NODE_VERSION}"
|
18
20
|
class_option :repository_name, type: :string, aliases: "-rn",
|
@@ -24,6 +26,18 @@ module Boring
|
|
24
26
|
@repository_name = options[:repository_name] ? options[:repository_name] : DEFAULT_REPOSITORY_NAME
|
25
27
|
|
26
28
|
template("ci.yml", ".github/workflows/ci.yml")
|
29
|
+
|
30
|
+
if @ruby_version == DEFAULT_RUBY_VERSION && !ruby_version_file_exists?
|
31
|
+
say <<~WARNING, :red
|
32
|
+
WARNING: The action was configured to use the ruby version specified in the .ruby-version
|
33
|
+
file, but no such file was present. Either create an appropriate .ruby-version file, or
|
34
|
+
update .github/workflows/ci.yml to use an explicit ruby version.
|
35
|
+
WARNING
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def ruby_version_file_exists?
|
40
|
+
Pathname.new(destination_root).join(RUBY_VERSION_FILE).exist?
|
27
41
|
end
|
28
42
|
end
|
29
43
|
end
|
@@ -20,17 +20,7 @@ jobs:
|
|
20
20
|
uses: ruby/setup-ruby@v1
|
21
21
|
with:
|
22
22
|
ruby-version: <%= @ruby_version %>
|
23
|
-
|
24
|
-
uses: actions/cache@v1
|
25
|
-
with:
|
26
|
-
path: vendor/bundle
|
27
|
-
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
|
28
|
-
restore-keys: |
|
29
|
-
${{ runner.os }}-gems-
|
30
|
-
- name: Install gems
|
31
|
-
run: |
|
32
|
-
bundle config path vendor/bundle
|
33
|
-
bundle install --jobs 4 --retry 3
|
23
|
+
bundler-cache: true
|
34
24
|
- name: Setup Node
|
35
25
|
uses: actions/setup-node@v1
|
36
26
|
with:
|
@@ -22,12 +22,16 @@ module Boring
|
|
22
22
|
gem 'devise', '~> 4.7'
|
23
23
|
RUBY
|
24
24
|
append_to_file "Gemfile", devise_gem
|
25
|
-
|
25
|
+
Bundler.with_unbundled_env do
|
26
|
+
run "bundle install"
|
27
|
+
end
|
26
28
|
end
|
27
29
|
|
28
30
|
def generating_devise_defaults
|
29
31
|
say "Generating devise defaults", :green
|
30
|
-
|
32
|
+
Bundler.with_unbundled_env do
|
33
|
+
run "DISABLE_SPRING=1 bundle exec rails generate devise:install"
|
34
|
+
end
|
31
35
|
end
|
32
36
|
|
33
37
|
def add_devise_action_mailer_development_config
|
@@ -44,7 +48,9 @@ module Boring
|
|
44
48
|
say "Adding devise user model", :green
|
45
49
|
model_name = options[:model_name] || DEFAULT_DEVISE_MODEL_NAME
|
46
50
|
|
47
|
-
|
51
|
+
Bundler.with_unbundled_env do
|
52
|
+
run "DISABLE_SPRING=1 bundle exec rails generate devise #{model_name}"
|
53
|
+
end
|
48
54
|
end
|
49
55
|
|
50
56
|
def add_devise_authentication_filter_to_application_controller
|
@@ -60,7 +66,9 @@ module Boring
|
|
60
66
|
say "Adding devise views", :green
|
61
67
|
model_name = options[:model_name] || DEFAULT_DEVISE_MODEL_NAME
|
62
68
|
|
63
|
-
|
69
|
+
Bundler.with_unbundled_env do
|
70
|
+
run "DISABLE_SPRING=1 bundle exec rails generate devise:views #{model_name.pluralize}"
|
71
|
+
end
|
64
72
|
end
|
65
73
|
end
|
66
74
|
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler'
|
4
|
+
|
5
|
+
module Boring
|
6
|
+
module Oauth
|
7
|
+
module Facebook
|
8
|
+
class InstallGenerator < Rails::Generators::Base
|
9
|
+
class MissingDeviseConfigurationError < StandardError; end
|
10
|
+
|
11
|
+
desc "Adds facebook OmniAuth to the application"
|
12
|
+
source_root File.expand_path("templates", __dir__)
|
13
|
+
|
14
|
+
def add_facebook_omniauth_gem
|
15
|
+
say "Adding Facebook OmniAuth gem", :green
|
16
|
+
facebook_omniauth_gem = <<~RUBY
|
17
|
+
\n
|
18
|
+
# for omniauth facebook
|
19
|
+
gem 'omniauth-facebook', '~> 8.0'
|
20
|
+
RUBY
|
21
|
+
append_to_file "Gemfile", facebook_omniauth_gem
|
22
|
+
Bundler.with_unbundled_env do
|
23
|
+
run "bundle install"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def add_provider_and_uuid_user_details
|
28
|
+
say "Adding migration to add provider and uuid columns to users", :green
|
29
|
+
Bundler.with_unbundled_env do
|
30
|
+
run "DISABLE_SPRING=1 bundle exec rails generate migration AddOmniauthToUsers provider:string uid:string"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def configure_devise_omniauth_facebook
|
35
|
+
say "Adding omniauth devise configuration", :green
|
36
|
+
if File.exist?("config/initializers/devise.rb")
|
37
|
+
insert_into_file "config/initializers/devise.rb", <<~RUBY, after: /Devise.setup do \|config\|/
|
38
|
+
\n
|
39
|
+
\tconfig.omniauth :facebook, "APP_ID", "APP_SECRET"
|
40
|
+
RUBY
|
41
|
+
else
|
42
|
+
raise MissingDeviseConfigurationError, <<~ERROR
|
43
|
+
Looks like the devise installation is incomplete. Could not find devise.rb in config/initializers.
|
44
|
+
ERROR
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def add_omniauth_callback_routes
|
49
|
+
devise_route = '# devise_for :users, controllers: { omniauth_callbacks: "users/omniauth_callbacks" }'.dup
|
50
|
+
route devise_route
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_omniauth_callback_controller
|
54
|
+
say "Copying omniauth_callbacks_controller.rb", :green
|
55
|
+
template("omniauth_callbacks_controller.rb", "app/controllers/users/omniauth_callbacks_controller.rb")
|
56
|
+
end
|
57
|
+
|
58
|
+
def configure_and_add_devise_setting_in_user_model
|
59
|
+
say "Configuring facebook omniauth for user model", :green
|
60
|
+
insert_into_file "app/models/user.rb", <<~RUBY, after: /class User < ApplicationRecord/
|
61
|
+
|
62
|
+
\tdevise :omniauthable, omniauth_providers: %i[facebook]
|
63
|
+
|
64
|
+
\tdef self.from_omniauth(auth)
|
65
|
+
\twhere(provider: auth.provider, uid: auth.uid).first_or_create do |user|
|
66
|
+
\tuser.email = auth.info.email
|
67
|
+
\tuser.password = Devise.friendly_token[0, 20]
|
68
|
+
\tuser.name = auth.info.name # assuming the user model has a name
|
69
|
+
\t# user.image = auth.info.image # assuming the user model has an image
|
70
|
+
\t# If you are using confirmable and the provider(s) you use validate emails,
|
71
|
+
\t# uncomment the line below to skip the confirmation emails.
|
72
|
+
\t# user.skip_confirmation!
|
73
|
+
\tend
|
74
|
+
\tend
|
75
|
+
RUBY
|
76
|
+
end
|
77
|
+
|
78
|
+
def add_the_facebook_devise_omniauth_view
|
79
|
+
insert_into_file "app/views/users/sessions/new.html.erb", <<~RUBY, after: /<%= render "users\/shared\/links" %>/
|
80
|
+
|
81
|
+
<%= link_to "Sign in with Facebook", user_facebook_omniauth_authorize_path %>
|
82
|
+
RUBY
|
83
|
+
end
|
84
|
+
|
85
|
+
def show_readme
|
86
|
+
readme "README"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|