potassium 6.3.0 → 6.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +1 -1
  3. data/.node-version +1 -1
  4. data/CHANGELOG.md +45 -0
  5. data/README.md +30 -3
  6. data/docs/CONTRIBUTING.md +2 -2
  7. data/lib/potassium/assets/.circleci/config.yml.erb +40 -12
  8. data/lib/potassium/assets/.eslintrc.json +15 -9
  9. data/lib/potassium/assets/.pryrc +0 -6
  10. data/lib/potassium/assets/.rubocop.yml +1 -0
  11. data/lib/potassium/assets/Aptfile +5 -0
  12. data/lib/potassium/assets/README.yml +74 -7
  13. data/lib/potassium/assets/active_admin/admin-component.vue +22 -30
  14. data/lib/potassium/assets/active_admin/policies/admin_user_policy.rb +2 -0
  15. data/lib/potassium/assets/active_admin/policies/comment_policy.rb +2 -0
  16. data/lib/potassium/assets/active_admin/policies/default_policy.rb +49 -0
  17. data/lib/potassium/assets/active_admin/policies/page_policy.rb +2 -0
  18. data/lib/potassium/assets/app/javascript/{app.spec.js → components/app.spec.ts} +2 -2
  19. data/lib/potassium/assets/app/javascript/components/app.vue +9 -0
  20. data/lib/potassium/assets/app/javascript/types/vue.d.ts +5 -0
  21. data/lib/potassium/assets/app/jobs/shrine_promote_job.rb +14 -0
  22. data/lib/potassium/assets/app/mailers/application_mailer.rb +1 -1
  23. data/lib/potassium/assets/app/mailers/example_mailer.rb +6 -0
  24. data/lib/potassium/assets/app/serializers/base_serializer.rb +3 -0
  25. data/lib/potassium/assets/app/serializers/concerns/image_handling_attributes.rb +20 -0
  26. data/lib/potassium/assets/app/uploaders/cover_image_uploader.rb +52 -0
  27. data/lib/potassium/assets/app/views/example_mailer/example_mail.html.mjml +7 -0
  28. data/lib/potassium/assets/app/views/layouts/default_mail.html.mjml +49 -0
  29. data/lib/potassium/assets/config/initializers/shrine/plugins/image_handling_utilities.rb +143 -0
  30. data/lib/potassium/assets/config/mailer.rb.erb +0 -2
  31. data/lib/potassium/assets/config/shrine.rb +15 -0
  32. data/lib/potassium/assets/config/webpack/rules/css.js +5 -0
  33. data/lib/potassium/assets/config/webpack/rules/index.js +11 -0
  34. data/lib/potassium/assets/config/webpack/rules/jquery.js +11 -0
  35. data/lib/potassium/assets/config/webpack/rules/typescript.js +32 -0
  36. data/lib/potassium/assets/config/webpack/rules/vue.js +19 -0
  37. data/lib/potassium/assets/config/webpack/webpack.config.js +4 -0
  38. data/lib/potassium/assets/public/mails/platanus-logo.png +0 -0
  39. data/lib/potassium/assets/testing/.rspec +1 -0
  40. data/lib/potassium/assets/testing/devise_config.rb +6 -0
  41. data/lib/potassium/assets/testing/factory_bot_config.rb +3 -0
  42. data/lib/potassium/assets/testing/faker_config.rb +1 -0
  43. data/lib/potassium/assets/testing/power_types_config.rb +1 -0
  44. data/lib/potassium/assets/testing/rails_helper.rb +130 -49
  45. data/lib/potassium/assets/testing/shoulda_matchers_config.rb +8 -0
  46. data/lib/potassium/assets/testing/simplecov_config.rb +64 -0
  47. data/lib/potassium/assets/testing/system_tests_config.rb +6 -0
  48. data/lib/potassium/assets/tsconfig.json +31 -0
  49. data/lib/potassium/cli/commands/create.rb +3 -1
  50. data/lib/potassium/cli_options.rb +23 -3
  51. data/lib/potassium/platanus_config.rb +20 -0
  52. data/lib/potassium/recipes/admin.rb +37 -16
  53. data/lib/potassium/recipes/api.rb +8 -85
  54. data/lib/potassium/recipes/coverage.rb +66 -0
  55. data/lib/potassium/recipes/file_storage.rb +50 -0
  56. data/lib/potassium/recipes/front_end.rb +87 -108
  57. data/lib/potassium/recipes/google_tag_manager.rb +20 -16
  58. data/lib/potassium/recipes/heroku.rb +1 -2
  59. data/lib/potassium/recipes/mailer.rb +22 -10
  60. data/lib/potassium/recipes/mjml.rb +31 -0
  61. data/lib/potassium/recipes/node.rb +11 -13
  62. data/lib/potassium/recipes/pundit.rb +29 -10
  63. data/lib/potassium/recipes/rails.rb +0 -4
  64. data/lib/potassium/recipes/spring.rb +9 -0
  65. data/lib/potassium/recipes/style.rb +9 -2
  66. data/lib/potassium/recipes/testing.rb +75 -18
  67. data/lib/potassium/recipes/vue_admin.rb +38 -8
  68. data/lib/potassium/templates/application.rb +5 -2
  69. data/lib/potassium/version.rb +10 -4
  70. data/spec/features/api_spec.rb +6 -1
  71. data/spec/features/ci_spec.rb +1 -1
  72. data/spec/features/coverage_spec.rb +43 -0
  73. data/spec/features/file_storage_spec.rb +102 -26
  74. data/spec/features/front_end_spec.rb +16 -47
  75. data/spec/features/google_tag_manager_spec.rb +1 -24
  76. data/spec/features/heroku_spec.rb +0 -4
  77. data/spec/features/mailer_spec.rb +79 -33
  78. data/spec/features/mjml_spec.rb +53 -0
  79. data/spec/features/node_spec.rb +1 -1
  80. data/spec/features/pundit_spec.rb +34 -0
  81. data/spec/features/testing_spec.rb +56 -0
  82. data/spec/features/vue_admin_spec.rb +0 -10
  83. data/spec/support/potassium_test_helpers.rb +2 -2
  84. data/spec/support/shared_examples.rb +5 -0
  85. metadata +50 -27
  86. data/lib/potassium/assets/active_admin/admin_application.js +0 -14
  87. data/lib/potassium/assets/active_admin/admin_user_policy.rb +0 -2
  88. data/lib/potassium/assets/active_admin/comment_policy.rb +0 -2
  89. data/lib/potassium/assets/active_admin/init_activeadmin_vue.rb +0 -10
  90. data/lib/potassium/assets/active_admin/pundit_page_policy.rb +0 -5
  91. data/lib/potassium/assets/app/graphql/graphql_controller.rb +0 -55
  92. data/lib/potassium/assets/app/graphql/mutations/login_mutation.rb +0 -23
  93. data/lib/potassium/assets/app/graphql/queries/base_query.rb +0 -4
  94. data/lib/potassium/assets/app/graphql/types/base/base_argument.rb +0 -4
  95. data/lib/potassium/assets/app/graphql/types/base/base_enum.rb +0 -4
  96. data/lib/potassium/assets/app/graphql/types/base/base_field.rb +0 -5
  97. data/lib/potassium/assets/app/graphql/types/base/base_input_object.rb +0 -5
  98. data/lib/potassium/assets/app/graphql/types/base/base_interface.rb +0 -7
  99. data/lib/potassium/assets/app/graphql/types/base/base_object.rb +0 -5
  100. data/lib/potassium/assets/app/graphql/types/base/base_scalar.rb +0 -4
  101. data/lib/potassium/assets/app/graphql/types/base/base_union.rb +0 -4
  102. data/lib/potassium/assets/app/graphql/types/mutation_type.rb +0 -10
  103. data/lib/potassium/assets/app/graphql/types/query_type.rb +0 -13
  104. data/lib/potassium/assets/config/graphql_playground.rb +0 -20
  105. data/spec/features/graphql_spec.rb +0 -71
@@ -1,23 +0,0 @@
1
- require 'jwt'
2
-
3
- class Mutations::LoginMutation < Mutations::BaseMutation
4
- null true
5
-
6
- argument :email, String, required: true
7
- argument :password, String, required: true
8
-
9
-
10
- field :token, String, null: true
11
-
12
- def resolve(email:, password:)
13
- user = User.find_by(email: email)
14
- if user&.valid_password?(password)
15
- payload = { id: user.id, email: user.email, exp: (Time.zone.now + 24.hours).to_i }
16
- token = JWT.encode payload, ENV['HMAC_SECRET'], 'HS256'
17
- return { token: token }
18
- end
19
- GraphQL::ExecutionError.new("User or Password invalid")
20
- rescue ActiveRecord::RecordInvalid => e
21
- GraphQL::ExecutionError.new("Invalid input: #{e.record.errors.full_messages.join(', ')}")
22
- end
23
- end
@@ -1,4 +0,0 @@
1
- module Queries
2
- class BaseQuery < GraphQL::Schema::Resolver
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Types::Base
2
- class BaseArgument < GraphQL::Schema::Argument
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Types::Base
2
- class BaseEnum < GraphQL::Schema::Enum
3
- end
4
- end
@@ -1,5 +0,0 @@
1
- module Types::Base
2
- class BaseField < GraphQL::Schema::Field
3
- argument_class Types::Base::BaseArgument
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- module Types::Base
2
- class BaseInputObject < GraphQL::Schema::InputObject
3
- argument_class Types::Base::BaseArgument
4
- end
5
- end
@@ -1,7 +0,0 @@
1
- module Types::Base
2
- module BaseInterface
3
- include GraphQL::Schema::Interface
4
-
5
- field_class Types::Base::BaseField
6
- end
7
- end
@@ -1,5 +0,0 @@
1
- module Types::Base
2
- class BaseObject < GraphQL::Schema::Object
3
- field_class Types::Base::BaseField
4
- end
5
- end
@@ -1,4 +0,0 @@
1
- module Types::Base
2
- class BaseScalar < GraphQL::Schema::Scalar
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Types::Base
2
- class BaseUnion < GraphQL::Schema::Union
3
- end
4
- end
@@ -1,10 +0,0 @@
1
- module Types
2
- class MutationType < Types::Base::BaseObject
3
- # TODO: remove me
4
- field :test_field, String, null: false,
5
- description: "An example field added by the generator"
6
- def test_field
7
- "Hello World"
8
- end
9
- end
10
- end
@@ -1,13 +0,0 @@
1
- module Types
2
- class QueryType < Types::Base::BaseObject
3
- # Add root-level fields here.
4
- # They will be entry points for queries on your schema.
5
-
6
- # TODO: remove me
7
- field :test_field, String, null: false,
8
- description: "An example field added by the generator"
9
- def test_field
10
- "Hello World!"
11
- end
12
- end
13
- end
@@ -1,20 +0,0 @@
1
- # config/initializers/graphql_playground.rb
2
- # All config options have a default that should work out of the box
3
- if Rails.env.development?
4
- GraphqlPlayground::Rails.configure do |config|
5
- # config.headers = {
6
- # 'X-Auth-Header' => ->(view_context) { "123" }
7
- # }
8
- # config.title = "Playground"
9
- # config.csrf = true
10
- # config.playground_version = "latest"
11
- # # Ideally the assets would be added to your projects `vendor/assets` directories
12
- # config.favicon = "/assets/playground.ico"
13
- # config.playground_js_url = "/assets/playground.js"
14
- # config.playground_css_url = "/assets/playground.css"
15
- # # see: https://github.com/prisma-labs/graphql-playground#settings
16
- config.settings = {
17
- "schema.polling.enable": false
18
- }
19
- end
20
- end
@@ -1,71 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "GraphQL" do
4
- context 'when using only graphql' do
5
- before :all do
6
- drop_dummy_database
7
- remove_project_directory
8
- create_dummy_project("api" => :graphql)
9
- end
10
-
11
- it "adds graphql related gems to Gemfile" do
12
- gemfile_content = IO.read("#{project_path}/Gemfile")
13
- expect(gemfile_content).to include("gem 'graphql'")
14
- expect(gemfile_content).to include("gem 'graphql_playground-rails'")
15
- expect(gemfile_content).not_to include("gem 'graphiql'")
16
- end
17
-
18
- it 'installs and sets up graphql' do
19
- schema = IO.read(
20
- "#{project_path}/app/graphql/#{PotassiumTestHelpers::APP_NAME.dasherize.tr('-', '_')}_schema.rb"
21
- )
22
- expect(schema).to include(
23
- "class #{PotassiumTestHelpers::APP_NAME.titleize.delete(' ')}Schema < GraphQL::Schema"
24
- )
25
-
26
- base_mutation = IO.read("#{project_path}/app/graphql/mutations/base_mutation.rb")
27
- expect(base_mutation).to include('Types::Base::Base')
28
- expect(base_mutation).not_to include('input_object_class')
29
- expect(base_mutation).not_to include('RelayClassic')
30
-
31
- controller = IO.read("#{project_path}/app/controllers/graphql_controller.rb")
32
- expect(controller).to include('skip_before_action :verify_authenticity_token')
33
- end
34
-
35
- it 'sets up graphql playground' do
36
- routes = IO.read("#{project_path}/config/routes.rb")
37
- expect(routes).to include(
38
- 'mount GraphqlPlayground::Rails::Engine, at: "/graphiql", graphql_path: "/graphql"'
39
- )
40
- config = IO.read("#{project_path}/config/initializers/graphql_playground.rb")
41
- expect(config).to include('GraphqlPlayground::Rails.configure do |config|')
42
- end
43
- end
44
-
45
- context 'when using authentication' do
46
- before :all do
47
- drop_dummy_database
48
- remove_project_directory
49
- create_dummy_project("api" => :graphql, "devise": true)
50
- end
51
-
52
- it 'gathers jwt gem' do
53
- gemfile_content = IO.read("#{project_path}/Gemfile")
54
- expect(gemfile_content).to include("gem 'jwt'")
55
- end
56
-
57
- it 'Adds auth related mutation and controller' do
58
- controller = IO.read("#{project_path}/app/controllers/graphql_controller.rb")
59
- expect(controller).to include('get_current_user')
60
- expect(controller).to include(
61
- "#{PotassiumTestHelpers::APP_NAME.titleize.delete(' ')}Schema.execute"
62
- )
63
-
64
- mutation_type = IO.read("#{project_path}/app/graphql/types/mutation_type.rb")
65
- expect(mutation_type).to include('field :login, mutation: Mutations::LoginMutation')
66
-
67
- login_mutation = IO.read("#{project_path}/app/graphql/mutations/login_mutation.rb")
68
- expect(login_mutation).to include('class Mutations::LoginMutation < Mutations::BaseMutation')
69
- end
70
- end
71
- end