granule 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +21 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +8 -7
- data/Gemfile +2 -0
- data/README.md +112 -13
- data/Rakefile +2 -0
- data/bin/console +1 -0
- data/exe/granule +1 -2
- data/granule.gemspec +2 -0
- data/lib/granule/cli.rb +19 -4
- data/lib/granule/feature/devise_semantic/devise.en.yml +65 -0
- data/lib/granule/feature/devise_semantic/devise.rb +303 -0
- data/lib/granule/feature/devise_semantic/devise_create_users.rb +43 -0
- data/lib/granule/feature/devise_semantic/user.rb +8 -0
- data/lib/granule/feature/devise_semantic/views/users/confirmations/new.html.erb +16 -0
- data/lib/granule/feature/devise_semantic/views/users/mailer/confirmation_instructions.html.erb +5 -0
- data/lib/granule/feature/devise_semantic/views/users/mailer/email_changed.html.erb +7 -0
- data/lib/granule/feature/devise_semantic/views/users/mailer/password_change.html.erb +3 -0
- data/lib/granule/feature/devise_semantic/views/users/mailer/reset_password_instructions.html.erb +8 -0
- data/lib/granule/feature/devise_semantic/views/users/mailer/unlock_instructions.html.erb +7 -0
- data/lib/granule/feature/devise_semantic/views/users/passwords/edit.html.erb +25 -0
- data/lib/granule/feature/devise_semantic/views/users/passwords/new.html.erb +18 -0
- data/lib/granule/feature/devise_semantic/views/users/registrations/edit.html.erb +45 -0
- data/lib/granule/feature/devise_semantic/views/users/registrations/new.html.erb +31 -0
- data/lib/granule/feature/devise_semantic/views/users/sessions/new.html.erb +37 -0
- data/lib/granule/feature/devise_semantic/views/users/shared/_error_messages.html.erb +14 -0
- data/lib/granule/feature/devise_semantic/views/users/shared/_links.html.erb +25 -0
- data/lib/granule/feature/devise_semantic/views/users/show.html.erb +22 -0
- data/lib/granule/feature/devise_semantic/views/users/unlocks/new.html.erb +16 -0
- data/lib/granule/feature/devise_semantic.rb +58 -0
- data/lib/granule/feature/semantic_react/hello_react.jsx +340 -0
- data/lib/granule/feature/semantic_react/homes_controller.rb +5 -0
- data/lib/granule/feature/semantic_react/index.html.erb +0 -0
- data/lib/granule/feature/semantic_react.rb +50 -0
- data/lib/granule/new/base/.dockerignore.tt +5 -0
- data/lib/granule/new/base/.gitignore.tt +33 -0
- data/lib/granule/{templates → new/base}/.rubocop.yml.tt +0 -0
- data/lib/granule/new/base/Dockerfile.dev.tt +34 -0
- data/lib/granule/{templates → new/base}/Gemfile.tt +5 -8
- data/lib/granule/new/base/README.md.tt +21 -0
- data/lib/granule/new/base/database.yml.tt +21 -0
- data/lib/granule/new/base/docker-compose.yml.tt +83 -0
- data/lib/granule/new/base.rb +19 -0
- data/lib/granule/version.rb +4 -2
- data/lib/granule.rb +2 -1
- metadata +38 -8
- data/Gemfile.lock +0 -169
- data/lib/granule/template.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 36c6e3904ef0412b890f1ef65ed92960a3b1e914607989f387a4c124ad7ddd4a
|
4
|
+
data.tar.gz: 8412718336be9b9648da1fa3e653ac9e7b4580bf48c675e1f6f8f8a1bf0c3e86
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1fb416fa5cbac9176c66047a08acc71c7f3239e00dec11f4718faea790b09ecdf5909520ef97b36da3bf03948d82cbf7eea7c1f3c361ff7a5337cc68ad8aad0
|
7
|
+
data.tar.gz: 6315f37cba131cc7a59aff0de80d8dc4697915b6b9ffb39e6a7e1aa692927b56c2718877b616da1d99ed86d31a3b16cc39fcec6b790738eb61f53a800f8f3d79
|
@@ -0,0 +1,21 @@
|
|
1
|
+
name: Ruby
|
2
|
+
|
3
|
+
on: [push]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
|
8
|
+
runs-on: ubuntu-latest
|
9
|
+
|
10
|
+
steps:
|
11
|
+
- uses: actions/checkout@v1
|
12
|
+
- name: Set up Ruby 2.6
|
13
|
+
uses: actions/setup-ruby@v1
|
14
|
+
with:
|
15
|
+
ruby-version: 2.6.x
|
16
|
+
- name: Get bundle dependencies
|
17
|
+
run: |
|
18
|
+
gem install bundler
|
19
|
+
bundle install --jobs 4 --retry 3
|
20
|
+
- name: Run tests
|
21
|
+
run: bundle exec rspec
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -9,19 +9,20 @@ AllCops:
|
|
9
9
|
Metrics/LineLength:
|
10
10
|
Max: 120
|
11
11
|
|
12
|
-
Documentation:
|
13
|
-
Enabled: false
|
14
|
-
|
15
|
-
FrozenStringLiteralComment:
|
16
|
-
Enabled: false
|
17
|
-
|
18
|
-
Style/LambdaCall:
|
12
|
+
Style/Documentation:
|
19
13
|
Enabled: false
|
20
14
|
|
21
15
|
Metrics/BlockLength:
|
16
|
+
Max: 50
|
22
17
|
Exclude:
|
23
18
|
- 'spec/**/*.rb'
|
24
19
|
- '*.gemspec'
|
25
20
|
|
21
|
+
Metrics/MethodLength:
|
22
|
+
Max: 50
|
23
|
+
|
26
24
|
RSpec/MultipleExpectations:
|
27
25
|
Enabled: false
|
26
|
+
|
27
|
+
RSpec/ExampleLength:
|
28
|
+
Max: 20
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,45 +1,144 @@
|
|
1
1
|
# Granule
|
2
|
+
> Boilerplate/template/generator for Rails app
|
2
3
|
|
3
|
-
Rails (
|
4
|
+
Rails (6.0.2) template with useful gems, configs and features. Ready for development out of the box. Dockerized for development.
|
4
5
|
|
5
|
-
##
|
6
|
+
## Installing / Getting started
|
6
7
|
|
7
|
-
|
8
|
+
A quick introduction of the minimal setup you need to get a hello world up & running.
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
```shell
|
11
|
+
gem install granule
|
12
|
+
```
|
12
13
|
|
14
|
+
### Initial Configuration
|
13
15
|
|
14
|
-
|
16
|
+
```shell
|
17
|
+
granule new my-rails-app
|
18
|
+
```
|
15
19
|
|
16
|
-
|
17
|
-
|
18
|
-
$ rails new -T --database=postgresql --webpack=react --skip-sprockets --skip-turbolinks
|
20
|
+
Executes `rails new --skip-test --skip-bundle --database=postgresql --webpack=react --skip-turbolinks my-rails-app` under the hood.
|
19
21
|
|
20
22
|
### Gems
|
21
23
|
|
22
24
|
Core
|
23
25
|
|
26
|
+
* [bootsnap](https://github.com/Shopify/bootsnap) - library that plugs into Ruby, with optional support for ActiveSupport and YAML, to optimize and cache expensive computations
|
24
27
|
* [devise](https://github.com/plataformatec/devise) - Authentication
|
25
28
|
* [dry-matcher](https://github.com/dry-rb/dry-matcher) - Pattern matching for ruby. Used to unify controller handlers
|
26
29
|
* [dry-monads](https://github.com/dry-rb/dry-monads) - Set of common monads for Ruby. Service Object/Interactor.
|
27
30
|
* [dry-validation](https://github.com/dry-rb/dry-validation) - Validation library with type-safe schemas and rules.
|
28
31
|
* [i18n-js](https://github.com/fnando/i18n-js) - Small library to provide the I18n translations on the Javascript
|
29
|
-
* [
|
32
|
+
* [mini_magick](https://github.com/minimagick/minimagick) - mini replacement for RMagick
|
33
|
+
* [pg](https://github.com/ged/ruby-pg) - A PostgreSQL client library for Ruby
|
34
|
+
* [data_migrate](https://github.com/ilyakatz/data-migrate) - Migrate and update data alongside your database structure.
|
35
|
+
* [puma](https://github.com/puma/puma) - A Ruby/Rack web server built for concurrency
|
30
36
|
* [rolify](https://github.com/RolifyCommunity/rolify) - Role management library with resource scoping
|
31
37
|
* [webpacker](https://github.com/rails/webpacker) - Bundling JavaScript assets
|
32
38
|
|
33
39
|
Development
|
34
40
|
|
35
|
-
*
|
41
|
+
* [better_errors](https://github.com/BetterErrors/better_errors) - Replaces the standard Rails error page with a much better and more useful error page
|
42
|
+
* [letter_opener_web](https://github.com/fgrehm/letter_opener_web) - A web interface for browsing Ruby on Rails sent emails
|
43
|
+
* [listen](https://github.com/guard/listen) (default) - Listens to file modifications and notifies you about the changes. (Used for spring)
|
44
|
+
* [spring](https://github.com/rails/spring) (default) - Rails application preloader
|
45
|
+
* [spring-watcher-listen](https://github.com/jonleighton/spring-watcher-listen) (default) - Makes Spring watch the filesystem for changes using Listen rather than by polling the filesystem.
|
46
|
+
* [web-console](https://github.com/rails/web-console) (default) - Web Console is a debugging tool for your Ruby on Rails applications.
|
47
|
+
|
48
|
+
Development + Test
|
49
|
+
|
50
|
+
* [brakeman](https://github.com/presidentbeef/brakeman) - A static analysis security vulnerability scanner for Ruby on Rails applications
|
51
|
+
* [bullet](https://github.com/flyerhzm/bullet) - Helps to kill N+1 queries and unused eager loading
|
52
|
+
* [bundler-audit](https://github.com/rubysec/bundler-audit) - Patch-level verification for Bundler
|
53
|
+
* [factory_bot_rails](https://github.com/thoughtbot/factory_bot_rails) - fixtures replacement with a straightforward definition syntax, support for multiple build strategies (saved instances, unsaved instances, attribute hashes, and stubbed objects), and support for multiple factories for the same class (user, admin_user, and so on), including factory inheritance.
|
54
|
+
* [fasterer](https://github.com/DamirSvrtan/fasterer) - Fasterer will suggest some speed improvements which you can check in detail at the fast-ruby repo.
|
55
|
+
* [ffaker](https://github.com/ffaker/ffaker) - Used to easily generate fake data: names, addresses, phone numbers, etc.
|
56
|
+
* [i18n-tasks](https://github.com/glebm/i18n-tasks) - Manage translation and localization with static analysis, for Ruby i18n
|
57
|
+
* [lol_dba](https://github.com/plentz/lol_dba) - small package of rake tasks that scan your application models and displays a list of columns that probably should be indexed. Also, it can generate .sql migration scripts
|
58
|
+
* [pry-rails](https://github.com/rweng/pry-rails) - Causes rails console to open pry. It therefore depends on pry.
|
59
|
+
* [pry-rescue](https://github.com/ConradIrwin/pry-rescue) - Whenever an exception is raised, but not rescued, pry-rescue will automatically open Pry for you:
|
60
|
+
* [pry-stack_explorer](https://github.com/pry/pry-stack_explorer) - plugin for the Pry REPL that enables the user to navigate the call-stack
|
61
|
+
* [rails_best_practices](https://github.com/flyerhzm/rails_best_practices) - code metric tool to check the quality of Rails code.
|
62
|
+
* [reek](https://github.com/troessner/reek) - Code smell detector for Ruby
|
63
|
+
* [rubocop](https://github.com/rubocop-hq/rubocop) - A Ruby static code analyzer and formatter, based on the community Ruby style guide.
|
64
|
+
* [rubocop-performance](https://github.com/rubocop-hq/rubocop-performance) - An extension of RuboCop focused on code performance checks.
|
65
|
+
* [rubocop-rspec](https://github.com/rubocop-hq/rubocop-rspec) - Code style checking for RSpec files
|
66
|
+
* [rubycritic](https://github.com/whitesmith/rubycritic) - A Ruby code quality reporter
|
36
67
|
|
37
68
|
Test
|
38
69
|
|
39
|
-
*
|
70
|
+
* [capybara](https://github.com/teamcapybara/capybara) - Acceptance test framework for web applications
|
71
|
+
* [rspec-rails](https://github.com/rspec/rspec-rails) - RSpec for Rails-3+
|
72
|
+
* [selenium-webdriver](https://github.com/SeleniumHQ/selenium) - Provides Ruby bindings for WebDriver
|
73
|
+
* [shoulda-matchers](https://github.com/thoughtbot/shoulda-matchers) - Provides RSpec- and Minitest-compatible one-liners to test common Rails functionality that, if written by hand, would be much longer, more complex, and error-prone.
|
74
|
+
* [simplecov](https://github.com/colszowka/simplecov) - Code coverage for Ruby 1.9+ with a powerful configuration library and automatic merging of coverage across test suites
|
75
|
+
* [webdrivers](https://github.com/titusfortner/webdrivers) - Keep your Selenium WebDrivers updated automatically
|
76
|
+
|
77
|
+
### Conventions
|
78
|
+
|
79
|
+
#### Folder structure
|
80
|
+
|
81
|
+
`feature folders` is convenient way to split business logic regarding controller actions.
|
82
|
+
|
83
|
+
.
|
84
|
+
├── app
|
85
|
+
│ ├── controllers
|
86
|
+
│ │ ├── applications_controller.rb # Default
|
87
|
+
│ │ └── sessions_controller.rb # Typical rails controller
|
88
|
+
│ ├── core
|
89
|
+
│ │ ├── application_interactor.rb # Parent interactor class
|
90
|
+
│ │ ├── application_contract.rb # Parent contract class
|
91
|
+
│ │ └── session_create # Feature folder (controller_action name)
|
92
|
+
│ │ ├── contract.rb # params validations
|
93
|
+
│ │ ├── interactor.rb # business logic
|
94
|
+
│ │ ├── policy.rb # authorization layer
|
95
|
+
│ │ ├── serializer.rb # json presenter
|
96
|
+
│ │ └── you_name_it.rb # custom logic
|
97
|
+
│ ...
|
98
|
+
├── spec
|
99
|
+
│ ├── core
|
100
|
+
│ │ ├── session_create_spec.rb # Unit tests input/output
|
101
|
+
│ │ ...
|
102
|
+
│ ├── request
|
103
|
+
│ │ ├── sessions_request_spec.rb # Integration tests (SUCCESS/FAIL)
|
104
|
+
│ │ ...
|
105
|
+
│ └── system
|
106
|
+
│ ├── login_spec.rb # Rails System specs (using browser driver)
|
107
|
+
│ ...
|
108
|
+
|
109
|
+
## Features
|
110
|
+
|
111
|
+
What's all the bells and whistles this project can perform?
|
112
|
+
* What's the main functionality
|
113
|
+
* You can also do another thing
|
114
|
+
* If you get really randy, you can even do this
|
115
|
+
|
116
|
+
## Usage
|
117
|
+
|
118
|
+
### Controllers
|
119
|
+
|
120
|
+
TBD
|
121
|
+
|
122
|
+
### Matchers
|
123
|
+
|
124
|
+
TBD
|
125
|
+
|
126
|
+
### Interactors
|
127
|
+
|
128
|
+
TBD
|
129
|
+
|
130
|
+
### Contracts
|
131
|
+
|
132
|
+
TBD
|
133
|
+
|
134
|
+
### Authorization
|
135
|
+
|
136
|
+
TBD
|
40
137
|
|
41
138
|
## Contributing
|
42
139
|
|
140
|
+
TBD
|
141
|
+
|
43
142
|
Bug reports and pull requests are welcome on GitHub at https://github.com/leksster/granule. 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.
|
44
143
|
|
45
144
|
## License
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
data/exe/granule
CHANGED
data/granule.gemspec
CHANGED
data/lib/granule/cli.rb
CHANGED
@@ -1,15 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'thor'
|
4
|
+
require 'granule/feature/semantic_react'
|
5
|
+
require 'granule/feature/devise_semantic'
|
2
6
|
|
3
7
|
module Granule
|
4
8
|
class CLI < Thor
|
5
9
|
include Thor::Actions
|
6
10
|
|
7
|
-
DEFAULT_OPTIONS = '-
|
8
|
-
'--webpack=react
|
9
|
-
"--skip-turbolinks -m #{File.dirname __dir__}/granule/
|
11
|
+
DEFAULT_OPTIONS = '--skip-bundle --skip-webpack-install --skip-test --database=postgresql '\
|
12
|
+
'--webpack=react'\
|
13
|
+
"--skip-turbolinks -m #{File.dirname __dir__}/granule/new/base.rb"
|
10
14
|
|
11
15
|
desc 'new DIRECTORY', 'Create a new rails app'
|
12
|
-
|
13
16
|
def new(name)
|
14
17
|
cmd = "rails new #{name} #{DEFAULT_OPTIONS}"
|
15
18
|
|
@@ -19,5 +22,17 @@ module Granule
|
|
19
22
|
run(cmd)
|
20
23
|
end
|
21
24
|
end
|
25
|
+
|
26
|
+
desc 'feature NAME', 'available: semantic-devise'
|
27
|
+
def feature(name)
|
28
|
+
service = {
|
29
|
+
"semantic-react": Granule::Feature::SemanticReact,
|
30
|
+
"semantic-devise": Granule::Feature::DeviseSemantic
|
31
|
+
}[name.to_sym]
|
32
|
+
|
33
|
+
return unless service
|
34
|
+
|
35
|
+
service.new.call
|
36
|
+
end
|
22
37
|
end
|
23
38
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
2
|
+
|
3
|
+
en:
|
4
|
+
devise:
|
5
|
+
confirmations:
|
6
|
+
confirmed: "Your email address has been successfully confirmed."
|
7
|
+
send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
|
8
|
+
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
|
9
|
+
failure:
|
10
|
+
already_authenticated: "You are already signed in."
|
11
|
+
inactive: "Your account is not activated yet."
|
12
|
+
invalid: "Invalid %{authentication_keys} or password."
|
13
|
+
locked: "Your account is locked."
|
14
|
+
last_attempt: "You have one more attempt before your account is locked."
|
15
|
+
not_found_in_database: "Invalid %{authentication_keys} or password."
|
16
|
+
timeout: "Your session expired. Please sign in again to continue."
|
17
|
+
unauthenticated: "You need to sign in or sign up before continuing."
|
18
|
+
unconfirmed: "You have to confirm your email address before continuing."
|
19
|
+
mailer:
|
20
|
+
confirmation_instructions:
|
21
|
+
subject: "Confirmation instructions"
|
22
|
+
reset_password_instructions:
|
23
|
+
subject: "Reset password instructions"
|
24
|
+
unlock_instructions:
|
25
|
+
subject: "Unlock instructions"
|
26
|
+
email_changed:
|
27
|
+
subject: "Email Changed"
|
28
|
+
password_change:
|
29
|
+
subject: "Password Changed"
|
30
|
+
omniauth_callbacks:
|
31
|
+
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
32
|
+
success: "Successfully authenticated from %{kind} account."
|
33
|
+
passwords:
|
34
|
+
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
|
35
|
+
send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
|
36
|
+
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
|
37
|
+
updated: "Your password has been changed successfully. You are now signed in."
|
38
|
+
updated_not_active: "Your password has been changed successfully."
|
39
|
+
registrations:
|
40
|
+
destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
|
41
|
+
signed_up: "Welcome! You have signed up successfully."
|
42
|
+
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
43
|
+
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
44
|
+
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
45
|
+
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirmation link to confirm your new email address."
|
46
|
+
updated: "Your account has been updated successfully."
|
47
|
+
updated_but_not_signed_in: "Your account has been updated successfully, but since your password was changed, you need to sign in again"
|
48
|
+
sessions:
|
49
|
+
signed_in: "Signed in successfully."
|
50
|
+
signed_out: "Signed out successfully."
|
51
|
+
already_signed_out: "Signed out successfully."
|
52
|
+
unlocks:
|
53
|
+
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
|
54
|
+
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
|
55
|
+
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
|
56
|
+
errors:
|
57
|
+
messages:
|
58
|
+
already_confirmed: "was already confirmed, please try signing in"
|
59
|
+
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
60
|
+
expired: "has expired, please request a new one"
|
61
|
+
not_found: "not found"
|
62
|
+
not_locked: "was not locked"
|
63
|
+
not_saved:
|
64
|
+
one: "1 error prohibited this %{resource} from being saved:"
|
65
|
+
other: "%{count} errors prohibited this %{resource} from being saved:"
|