decidim 0.0.1.alpha2 → 0.0.1.alpha3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of decidim might be problematic. Click here for more details.

Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +8 -2
  3. data/.dockerignore +5 -0
  4. data/.gitignore +2 -1
  5. data/.hound.yml +4 -0
  6. data/.rubocop.yml +16 -3
  7. data/.ruby-version +1 -0
  8. data/.travis.yml +28 -0
  9. data/Dockerfile +36 -0
  10. data/Gemfile +7 -2
  11. data/Gemfile.lock +188 -30
  12. data/README.md +40 -6
  13. data/Rakefile +4 -20
  14. data/codecov.yml +71 -0
  15. data/common_gemfile.rb +6 -18
  16. data/decidim-admin/Gemfile +17 -0
  17. data/decidim-admin/Gemfile.lock +383 -0
  18. data/decidim-admin/README.md +28 -0
  19. data/decidim-admin/Rakefile +32 -0
  20. data/decidim-admin/app/assets/config/decidim_admin_manifest.js +2 -0
  21. data/{template.rb → decidim-admin/app/assets/images/decidim/admin/.keep} +0 -0
  22. data/decidim-admin/app/assets/javascripts/decidim/admin.js +21 -0
  23. data/decidim-admin/app/assets/stylesheets/decidim/admin.scss +8 -0
  24. data/decidim-admin/app/assets/stylesheets/decidim/admin/_actions.scss +8 -0
  25. data/decidim-admin/app/assets/stylesheets/decidim/admin/_foundation_and_overrides.scss +52 -0
  26. data/decidim-admin/app/assets/stylesheets/decidim/admin/_layout.scss +16 -0
  27. data/decidim-admin/app/assets/stylesheets/decidim/admin/_login.scss +36 -0
  28. data/decidim-admin/app/assets/stylesheets/decidim/admin/_settings.scss +566 -0
  29. data/decidim-admin/app/assets/stylesheets/decidim/admin/_sidebar.scss +73 -0
  30. data/decidim-admin/app/assets/stylesheets/decidim/admin/_tables.scss +5 -0
  31. data/decidim-admin/app/constraints/decidim/admin/organization_dashboard_constraint.rb +36 -0
  32. data/decidim-admin/app/controllers/decidim/admin/application_controller.rb +10 -0
  33. data/decidim-admin/app/controllers/decidim/admin/dashboard_controller.rb +9 -0
  34. data/decidim-admin/app/helpers/decidim/admin/application_helper.rb +12 -0
  35. data/decidim-admin/app/jobs/decidim/admin/application_job.rb +9 -0
  36. data/decidim-admin/app/mailers/decidim/admin/application_mailer.rb +11 -0
  37. data/decidim-admin/app/models/decidim/admin/application_record.rb +10 -0
  38. data/decidim-admin/app/policies/decidim/admin/application_policy.rb +20 -0
  39. data/decidim-admin/app/policies/decidim/admin/organization_policy.rb +15 -0
  40. data/decidim-admin/app/views/decidim/admin/dashboard/show.html.erb +3 -0
  41. data/decidim-admin/app/views/decidim/admin/devise/mailers/password_change.html.erb +3 -0
  42. data/decidim-admin/app/views/decidim/admin/devise/mailers/reset_password_instructions.html.erb +8 -0
  43. data/decidim-admin/app/views/layouts/decidim/admin/_header.html.erb +4 -0
  44. data/decidim-admin/app/views/layouts/decidim/admin/_login_items.html.erb +8 -0
  45. data/decidim-admin/app/views/layouts/decidim/admin/_sidebar.html.erb +13 -0
  46. data/decidim-admin/app/views/layouts/decidim/admin/application.html.erb +40 -0
  47. data/decidim-admin/app/views/layouts/decidim/admin/login.html.erb +19 -0
  48. data/decidim-admin/bin/rails +14 -0
  49. data/decidim-admin/config/i18n-tasks.yml +120 -0
  50. data/decidim-admin/config/locales/en.yml +8 -0
  51. data/decidim-admin/config/routes.rb +4 -0
  52. data/decidim-admin/decidim-admin.gemspec +38 -0
  53. data/decidim-admin/lib/decidim/admin.rb +12 -0
  54. data/decidim-admin/lib/decidim/admin/engine.rb +31 -0
  55. data/decidim-admin/lib/tasks/decidim/admin_tasks.rake +5 -0
  56. data/decidim-admin/spec/factories.rb +1 -0
  57. data/decidim-admin/spec/features/admin_access_control.rb +52 -0
  58. data/decidim-admin/spec/features/admin_invite_spec.rb +38 -0
  59. data/decidim-admin/spec/policies/organization_policy_spec.rb +41 -0
  60. data/decidim-admin/spec/spec_helper.rb +3 -0
  61. data/decidim-dev/Gemfile +17 -0
  62. data/decidim-dev/Gemfile.lock +381 -0
  63. data/decidim-dev/README.md +28 -0
  64. data/decidim-dev/decidim-dev.gemspec +30 -0
  65. data/decidim-dev/lib/decidim/common_rake.rb +14 -0
  66. data/decidim-dev/lib/decidim/test/base_spec_helper.rb +44 -0
  67. data/decidim-dev/lib/decidim/test/i18n_spec.rb +18 -0
  68. data/decidim-dev/lib/decidim/test/rspec_support/action_mailer.rb +46 -0
  69. data/decidim-dev/lib/decidim/test/rspec_support/active_job.rb +11 -0
  70. data/decidim-dev/lib/decidim/test/rspec_support/capybara.rb +19 -0
  71. data/decidim-dev/lib/decidim/test/rspec_support/database_cleaner.rb +13 -0
  72. data/decidim-dev/lib/decidim/test/rspec_support/factory_girl.rb +4 -0
  73. data/decidim-dev/lib/decidim/test/rspec_support/i18n.rb +12 -0
  74. data/decidim-dev/lib/decidim/test/rspec_support/warden.rb +8 -0
  75. data/decidim-dev/lib/decidim/test/rspec_support/wisper.rb +6 -0
  76. data/decidim-dev/lib/generators/decidim/dummy_generator.rb +65 -0
  77. data/decidim-system/Gemfile +17 -0
  78. data/decidim-system/Gemfile.lock +377 -0
  79. data/decidim-system/README.md +28 -0
  80. data/decidim-system/Rakefile +32 -0
  81. data/decidim-system/app/assets/config/decidim_system_manifest.js +2 -0
  82. data/decidim-system/app/assets/images/decidim/system/.keep +0 -0
  83. data/decidim-system/app/assets/javascripts/decidim/system.js +21 -0
  84. data/decidim-system/app/assets/stylesheets/decidim/system.scss +8 -0
  85. data/decidim-system/app/assets/stylesheets/decidim/system/_actions.scss +8 -0
  86. data/decidim-system/app/assets/stylesheets/decidim/system/_foundation_and_overrides.scss +52 -0
  87. data/decidim-system/app/assets/stylesheets/decidim/system/_layout.scss +16 -0
  88. data/decidim-system/app/assets/stylesheets/decidim/system/_login.scss +36 -0
  89. data/decidim-system/app/assets/stylesheets/decidim/system/_settings.scss +566 -0
  90. data/decidim-system/app/assets/stylesheets/decidim/system/_sidebar.scss +73 -0
  91. data/decidim-system/app/assets/stylesheets/decidim/system/_tables.scss +5 -0
  92. data/decidim-system/app/commands/decidim/system/create_admin.rb +40 -0
  93. data/decidim-system/app/commands/decidim/system/register_organization.rb +59 -0
  94. data/decidim-system/app/commands/decidim/system/update_admin.rb +52 -0
  95. data/decidim-system/app/commands/decidim/system/update_organization.rb +51 -0
  96. data/decidim-system/app/controllers/decidim/system/admins_controller.rb +67 -0
  97. data/decidim-system/app/controllers/decidim/system/application_controller.rb +11 -0
  98. data/decidim-system/app/controllers/decidim/system/dashboard_controller.rb +9 -0
  99. data/decidim-system/app/controllers/decidim/system/devise/passwords_controller.rb +12 -0
  100. data/decidim-system/app/controllers/decidim/system/devise/sessions_controller.rb +12 -0
  101. data/decidim-system/app/controllers/decidim/system/organizations_controller.rb +59 -0
  102. data/decidim-system/app/forms/decidim/system/admin_form.rb +33 -0
  103. data/decidim-system/app/forms/decidim/system/register_organization_form.rb +20 -0
  104. data/decidim-system/app/forms/decidim/system/update_organization_form.rb +28 -0
  105. data/decidim-system/app/helpers/decidim/system/application_helper.rb +12 -0
  106. data/decidim-system/app/jobs/decidim/system/application_job.rb +9 -0
  107. data/decidim-system/app/mailers/decidim/system/application_mailer.rb +11 -0
  108. data/decidim-system/app/models/decidim/system/admin.rb +18 -0
  109. data/decidim-system/app/models/decidim/system/application_record.rb +10 -0
  110. data/decidim-system/app/views/decidim/system/admins/_form.html.erb +11 -0
  111. data/decidim-system/app/views/decidim/system/admins/edit.html.erb +11 -0
  112. data/decidim-system/app/views/decidim/system/admins/index.html.erb +33 -0
  113. data/decidim-system/app/views/decidim/system/admins/new.html.erb +11 -0
  114. data/decidim-system/app/views/decidim/system/admins/show.html.erb +9 -0
  115. data/decidim-system/app/views/decidim/system/dashboard/show.html.erb +3 -0
  116. data/decidim-system/app/views/decidim/system/devise/mailers/password_change.html.erb +3 -0
  117. data/decidim-system/app/views/decidim/system/devise/mailers/reset_password_instructions.html.erb +8 -0
  118. data/decidim-system/app/views/decidim/system/devise/passwords/edit.html.erb +23 -0
  119. data/decidim-system/app/views/decidim/system/devise/passwords/new.html.erb +15 -0
  120. data/decidim-system/app/views/decidim/system/devise/sessions/new.html.erb +23 -0
  121. data/decidim-system/app/views/decidim/system/devise/shared/_links.html.erb +25 -0
  122. data/decidim-system/app/views/decidim/system/organizations/edit.html.erb +17 -0
  123. data/decidim-system/app/views/decidim/system/organizations/index.html.erb +34 -0
  124. data/decidim-system/app/views/decidim/system/organizations/new.html.erb +25 -0
  125. data/decidim-system/app/views/decidim/system/organizations/show.html.erb +11 -0
  126. data/decidim-system/app/views/layouts/decidim/system/_header.html.erb +4 -0
  127. data/decidim-system/app/views/layouts/decidim/system/_login_items.html.erb +8 -0
  128. data/decidim-system/app/views/layouts/decidim/system/_sidebar.html.erb +15 -0
  129. data/decidim-system/app/views/layouts/decidim/system/application.html.erb +40 -0
  130. data/decidim-system/app/views/layouts/decidim/system/login.html.erb +19 -0
  131. data/decidim-system/bin/rails +14 -0
  132. data/decidim-system/config/i18n-tasks.yml +120 -0
  133. data/decidim-system/config/locales/en.yml +60 -0
  134. data/decidim-system/config/routes.rb +17 -0
  135. data/decidim-system/db/migrate/20160919105637_devise_create_decidim_admins.rb +26 -0
  136. data/decidim-system/db/seeds.rb +9 -0
  137. data/decidim-system/decidim-system.gemspec +36 -0
  138. data/decidim-system/lib/decidim/system.rb +12 -0
  139. data/decidim-system/lib/decidim/system/engine.rb +31 -0
  140. data/decidim-system/lib/tasks/decidim/system_tasks.rake +5 -0
  141. data/decidim-system/spec/commands/decidim/system/create_admin_spec.rb +48 -0
  142. data/decidim-system/spec/commands/decidim/system/register_organization_spec.rb +68 -0
  143. data/decidim-system/spec/factories.rb +9 -0
  144. data/decidim-system/spec/features/manage_admins_spec.rb +67 -0
  145. data/decidim-system/spec/features/organizations_spec.rb +62 -0
  146. data/decidim-system/spec/features/sessions_spec.rb +38 -0
  147. data/decidim-system/spec/models/admin_spec.rb +23 -0
  148. data/decidim-system/spec/spec_helper.rb +2 -0
  149. data/decidim.gemspec +3 -1
  150. data/docker-compose.yml +24 -0
  151. data/lib/decidim.rb +8 -0
  152. data/lib/generators/decidim/app_builder.rb +1 -1
  153. data/lib/generators/decidim/app_generator.rb +35 -4
  154. data/lib/generators/decidim/install_generator.rb +121 -0
  155. data/lib/generators/decidim/templates/Dockerfile.erb +26 -0
  156. data/lib/generators/decidim/templates/Gemfile.erb +8 -1
  157. data/lib/generators/decidim/templates/README.md.erb +26 -0
  158. data/lib/generators/decidim/templates/app.json.erb +13 -0
  159. data/lib/generators/decidim/templates/cable.yml.erb +9 -0
  160. data/lib/generators/decidim/templates/database.yml.erb +85 -0
  161. data/lib/generators/decidim/templates/docker-compose.yml.erb +28 -0
  162. data/lib/generators/decidim/templates/initializer.rb +4 -0
  163. data/lib/generators/decidim/templates/secrets.yml.erb +30 -0
  164. data/run_ci.sh +7 -0
  165. metadata +183 -8
  166. data/circle.yml +0 -19
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ module Decidim
5
+ module System
6
+ describe RegisterOrganization, :db do
7
+ describe "call" do
8
+ let(:form) do
9
+ RegisterOrganizationForm.new(params)
10
+ end
11
+
12
+ let(:command) { described_class.new(form) }
13
+
14
+ context "when the form is valid" do
15
+ let(:params) do
16
+ {
17
+ name: "Gotham City",
18
+ host: "decide.gotham.gov",
19
+ description_en: "Fictional city appearing in American comic books.",
20
+ organization_admin_email: "f.laguardia@gotham.gov"
21
+ }
22
+ end
23
+
24
+ it "returns a valid response" do
25
+ expect { command.call }.to broadcast(:ok)
26
+ end
27
+
28
+ it "creates a new organization" do
29
+ expect { command.call }.to change { Organization.count }.by(1)
30
+ organization = Organization.last
31
+
32
+ expect(organization.name).to eq("Gotham City")
33
+ expect(organization.host).to eq("decide.gotham.gov")
34
+ end
35
+
36
+ it "invites a user as organization admin" do
37
+ expect { command.call }.to change { User.count }.by(1)
38
+ admin = User.last
39
+
40
+ expect(admin.email).to eq("f.laguardia@gotham.gov")
41
+ expect(admin.organization.name).to eq("Gotham City")
42
+ expect(admin.organization.description).to include("en" => "Fictional city appearing in American comic books.")
43
+ expect(admin.roles).to include("admin")
44
+ expect(admin).to be_created_by_invite
45
+ end
46
+
47
+ it "sends a custom email", perform_enqueued: true do
48
+ expect { command.call }.to change { emails.count }.by(1)
49
+ expect(last_email_body).to include(URI.encode_www_form(["/admin"]))
50
+ end
51
+ end
52
+
53
+ context "when the form is invalid" do
54
+ let(:params) do
55
+ {
56
+ name: nil,
57
+ host: "foo.com"
58
+ }
59
+ end
60
+
61
+ it "returns an invalid response" do
62
+ expect { command.call }.to broadcast(:invalid)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,9 @@
1
+ require_relative "../../decidim-core/spec/factories"
2
+
3
+ FactoryGirl.define do
4
+ factory :admin, class: Decidim::System::Admin do
5
+ sequence(:email) { |n| "admin#{n}@citizen.corp" }
6
+ password "password1234"
7
+ password_confirmation "password1234"
8
+ end
9
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe "Manage admins", type: :feature do
6
+ let(:admin) { create(:admin) }
7
+ let!(:admin2) { create(:admin) }
8
+
9
+ before do
10
+ login_as admin, scope: :admin
11
+ visit decidim_system.admins_path
12
+ end
13
+
14
+ it "creates a new admin" do
15
+ find(".actions .new").click
16
+
17
+ within ".new_admin" do
18
+ fill_in :admin_email, with: "admin@foo.bar"
19
+ fill_in :admin_password, with: "fake123"
20
+ fill_in :admin_password_confirmation, with: "fake123"
21
+
22
+ find("*[type=submit]").click
23
+ end
24
+
25
+ within ".flash" do
26
+ expect(page).to have_content("successfully")
27
+ end
28
+
29
+ within "table" do
30
+ expect(page).to have_content("admin@foo.bar")
31
+ end
32
+ end
33
+
34
+ it "updates an admin" do
35
+ within find("tr", text: admin.email) do
36
+ click_link "Edit"
37
+ end
38
+
39
+ within ".edit_admin" do
40
+ fill_in :admin_email, with: "admin@another.domain"
41
+
42
+ find("*[type=submit]").click
43
+ end
44
+
45
+ within ".flash" do
46
+ expect(page).to have_content("successfully")
47
+ end
48
+
49
+ within "table" do
50
+ expect(page).to have_content("admin@another.domain")
51
+ end
52
+ end
53
+
54
+ it "deletes an admin" do
55
+ within find("tr", text: admin2.email) do
56
+ click_link "Destroy"
57
+ end
58
+
59
+ within ".flash" do
60
+ expect(page).to have_content("successfully")
61
+ end
62
+
63
+ within "table" do
64
+ expect(page).to_not have_content(admin2.email)
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe "Organizations", type: :feature do
6
+ let(:admin) { create(:admin) }
7
+
8
+ context "authenticated admin" do
9
+ before do
10
+ login_as admin, scope: :admin
11
+ visit decidim_system.root_path
12
+ end
13
+
14
+ context "creating an organization" do
15
+ before do
16
+ click_link "Organizations"
17
+ click_link "New"
18
+ end
19
+
20
+ it "creates a new organization" do
21
+ fill_in "Name", with: "Citizen Corp"
22
+ fill_in "Host", with: "www.citizen.corp"
23
+ fill_in "Organization admin email", with: "mayor@citizen.corp"
24
+ click_button "Create organization & invite admin"
25
+
26
+ expect(page).to have_css("div.flash.success")
27
+ expect(page).to have_content("Citizen Corp")
28
+ end
29
+
30
+ context "with invalid data" do
31
+ it "doesn't create an organization" do
32
+ fill_in "Name", with: "Bad"
33
+ click_button "Create organization & invite admin"
34
+
35
+ expect(page).to have_css("div.flash.alert")
36
+ expect(page).to_not have_content("Organization created successfully")
37
+ end
38
+ end
39
+ end
40
+
41
+ context "editing an organization" do
42
+ let!(:organization) { create(:organization, name: "Citizen Corp") }
43
+
44
+ before do
45
+ click_link "Organizations"
46
+ within("table tbody tr:first") do
47
+ click_link "Edit"
48
+ end
49
+ end
50
+
51
+ it "edits the data" do
52
+ fill_in "Name", with: "Citizens Rule!"
53
+ fill_in "Host", with: "www.foo.org"
54
+ fill_in "Description (en)", with: "Organization description."
55
+ click_button "Save"
56
+
57
+ expect(page).to have_css("div.flash.success")
58
+ expect(page).to have_content("Citizens Rule!")
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe "Sessions", type: :feature do
5
+ let!(:admin) do
6
+ create(:admin, email: "admin@example.org",
7
+ password: "123456",
8
+ password_confirmation: "123456")
9
+ end
10
+
11
+ before(:each) do
12
+ visit decidim_system.root_path
13
+ end
14
+
15
+ context "when using a correct username and password" do
16
+ it "lets you into the system panel" do
17
+ within ".new_admin" do
18
+ fill_in :admin_email, with: "admin@example.org"
19
+ fill_in :admin_password, with: "123456"
20
+ find("*[type=submit]").click
21
+ end
22
+
23
+ expect(page).to have_content("Dashboard")
24
+ end
25
+ end
26
+
27
+ context "when using an incorrect username and password" do
28
+ it "doesn't let you in the admin panel" do
29
+ within ".new_admin" do
30
+ fill_in :admin_email, with: "admin@example.org"
31
+ fill_in :admin_password, with: "forged_password"
32
+ find("*[type=submit]").click
33
+ end
34
+
35
+ expect(page).not_to have_content("Dashboard")
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ module Decidim
5
+ module System
6
+ describe Admin, :db do
7
+ let(:admin) { build(:admin) }
8
+
9
+ it "is valid" do
10
+ expect(admin).to be_valid
11
+ end
12
+
13
+ context "devise emails" do
14
+ let(:admin) { create(:admin) }
15
+
16
+ it "sends them asynchronously" do
17
+ described_class.send_reset_password_instructions(email: admin.email)
18
+ expect(ActionMailer::DeliveryJob).to have_been_enqueued.on_queue("mailers")
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,2 @@
1
+ ENV["ENGINE_NAME"] = File.dirname(File.dirname(__FILE__)).split("/").last
2
+ require "decidim/test/base_spec_helper"
data/decidim.gemspec CHANGED
@@ -23,9 +23,11 @@ Gem::Specification.new do |spec|
23
23
  spec.require_paths = ["lib"]
24
24
 
25
25
  spec.add_dependency "decidim-core", Decidim.version
26
+ spec.add_dependency "decidim-system", Decidim.version
27
+ spec.add_dependency "decidim-admin", Decidim.version
26
28
  spec.add_dependency "rails", Decidim.rails_version
27
29
 
28
30
  spec.add_development_dependency "bundler", "~> 1.12"
29
- spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "rake", "~> 11.0"
30
32
  spec.add_development_dependency "rspec", "~> 3.0"
31
33
  end
@@ -0,0 +1,24 @@
1
+ version: '2'
2
+ services:
3
+ decidim:
4
+ build: '.'
5
+ working_dir: /code
6
+ volumes:
7
+ - .:/code
8
+ environment:
9
+ - DATABASE_HOST=pg
10
+ - DATABASE_USERNAME=postgres
11
+ links:
12
+ - pg
13
+ - redis
14
+ pg:
15
+ image: postgres
16
+ volumes:
17
+ - pg-data:/var/lib/postgresql/data
18
+ redis:
19
+ image: redis
20
+ volumes:
21
+ - redis-data:/data
22
+ volumes:
23
+ pg-data: {}
24
+ redis-data: {}
data/lib/decidim.rb CHANGED
@@ -1,6 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
  require "decidim/core"
3
+ require "decidim/system"
4
+ require "decidim/admin"
3
5
 
4
6
  # Module declaration.
5
7
  module Decidim
8
+ # Loads seeds from all engines.
9
+ def self.seed!
10
+ Rails.application.railties.select do |railtie|
11
+ railtie.respond_to?(:load_seed) && railtie.class.name.include?("Decidim::")
12
+ end.each(&:load_seed)
13
+ end
6
14
  end
@@ -4,7 +4,7 @@ module Decidim
4
4
  # Custom app builder to inject own Gemfile.
5
5
  class AppBuilder < Rails::AppBuilder
6
6
  def gemfile
7
- template "Gemfile.erb", "Gemfile"
7
+ template "Gemfile.erb", "Gemfile", rails_version: Decidim.rails_version
8
8
  end
9
9
  end
10
10
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
  require "rails/generators"
3
3
  require "rails/generators/rails/app/app_generator"
4
- require_relative "app_builder"
5
- require "generators/decidim/install_generator"
6
4
  require "decidim/core/version"
5
+ require_relative "app_builder"
6
+ require_relative "install_generator"
7
7
 
8
8
  module Decidim
9
9
  module Generators
@@ -32,17 +32,48 @@ module Decidim
32
32
  desc: "Path to the gem"
33
33
 
34
34
  class_option :edge, type: :boolean, default: false,
35
- desc: "Use github's edge version"
35
+ desc: "Use GitHub's edge version"
36
36
 
37
37
  class_option :database, type: :string, aliases: "-d", default: "postgresql",
38
38
  desc: "Configure for selected database (options: #{DATABASES.join("/")})"
39
39
 
40
+ class_option :recreate_db, type: :boolean, default: false,
41
+ desc: "Recreate test database"
42
+
40
43
  class_option :migrate, type: :boolean, default: false,
41
44
  desc: "Run migrations after installing decidim"
42
45
 
46
+ def database_yml
47
+ template "database.yml.erb", "config/database.yml", force: true
48
+ end
49
+
50
+ def docker
51
+ template "Dockerfile.erb", "Dockerfile"
52
+ template "docker-compose.yml.erb", "docker-compose.yml"
53
+ end
54
+
55
+ def cable_yml
56
+ template "cable.yml.erb", "config/cable.yml", force: true
57
+ end
58
+
59
+ def readme
60
+ template "README.md.erb", "README.md", force: true
61
+ end
62
+
63
+ def secret_token
64
+ require "securerandom"
65
+ SecureRandom.hex(64)
66
+ end
67
+
68
+ def app_json
69
+ template "app.json.erb", "app.json"
70
+ end
71
+
43
72
  def install
44
73
  Decidim::Generators::InstallGenerator.start [
45
- "--migrate=#{options[:migrate]}"
74
+ "--recreate_db=#{options[:recreate_db]}",
75
+ "--migrate=#{options[:migrate]}",
76
+ "--app_name=#{app_name}"
46
77
  ]
47
78
  end
48
79
 
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+ require "rails/generators/base"
3
+ require "securerandom"
4
+
5
+ module Decidim
6
+ module Generators
7
+ # Installs `decidim` to a Rails app by adding the needed lines of code
8
+ # automatically to important files in the Rails app.
9
+ #
10
+ # Remember that, for how generators work, actions are executed based on the
11
+ # definition order of the public methods.
12
+ class InstallGenerator < Rails::Generators::Base
13
+ desc "Install decidim"
14
+ source_root File.expand_path("../templates", __FILE__)
15
+
16
+ class_option :app_name, type: :string, default: nil,
17
+ desc: "The name of the app"
18
+ class_option :migrate, type: :boolean, default: false,
19
+ desc: "Run migrations after installing decidim"
20
+ class_option :recreate_db, type: :boolean, default: false,
21
+ desc: "Run migrations after installing decidim"
22
+
23
+ def install
24
+ route "mount Decidim::System::Engine => '/system'"
25
+ route "mount Decidim::Admin::Engine => '/admin'"
26
+ route "mount Decidim::Core::Engine => '/'"
27
+ end
28
+
29
+ def copy_migrations
30
+ rake "railties:install:migrations"
31
+ recreate_db if options[:recreate_db]
32
+ rake "db:migrate" if options[:migrate]
33
+ end
34
+
35
+ def add_seeds
36
+ append_file "db/seeds.rb", "\nDecidim.seed!"
37
+ end
38
+
39
+ def copy_initializer
40
+ template "initializer.rb", "config/initializers/decidim.rb"
41
+ end
42
+
43
+ def insert_into_layout
44
+ inject_into_file "app/views/layouts/application.html.erb",
45
+ before: "</head>" do
46
+ " <%= render partial: 'layouts/decidim/meta' %>\n "
47
+ end
48
+
49
+ inject_into_file "app/views/layouts/application.html.erb",
50
+ after: "<body>" do
51
+ "\n <%= render partial: 'layouts/decidim/header' %>"
52
+ end
53
+
54
+ inject_into_file "app/views/layouts/application.html.erb",
55
+ before: "</body>" do
56
+ " <%= render partial: 'layouts/decidim/footer' %>\n "
57
+ end
58
+ end
59
+
60
+ def replace_title
61
+ gsub_file "app/views/layouts/application.html.erb",
62
+ %r{<title>(.*)</title>},
63
+ "<title><%= decidim_page_title %></title>"
64
+ end
65
+
66
+ def append_assets
67
+ append_file "app/assets/javascripts/application.js", "//= require decidim"
68
+ inject_into_file "app/assets/stylesheets/application.css",
69
+ before: "*= require_tree ." do
70
+ "*= require decidim\n"
71
+ end
72
+ end
73
+
74
+ def smtp_environment
75
+ inject_into_file "config/environments/production.rb",
76
+ after: "config.log_formatter = ::Logger::Formatter.new" do
77
+ %(
78
+
79
+ config.action_mailer.smtp_settings = {
80
+ :address => Rails.application.secrets.smtp_address,
81
+ :port => Rails.application.secrets.smtp_port,
82
+ :authentication => Rails.application.secrets.smtp_authentication,
83
+ :user_name => Rails.application.secrets.smtp_username,
84
+ :password => Rails.application.secrets.smtp_password,
85
+ :domain => Rails.application.secrets.smtp_domain,
86
+ :enable_starttls_auto => Rails.application.secrets.smtp_starttls_auto,
87
+ :openssl_verify_mode => 'none'
88
+ }
89
+
90
+ if Rails.application.secrets.sendgrid
91
+ config.action_mailer.default_options = {
92
+ "X-SMTPAPI" => {
93
+ filters: {
94
+ clicktrack: { settings: { enable: 0 } },
95
+ opentrack: { settings: { enable: 0 } }
96
+ }
97
+ }.to_json
98
+ }
99
+ end
100
+ )
101
+ end
102
+ end
103
+
104
+ def secrets
105
+ template "secrets.yml.erb", "config/secrets.yml", force: true
106
+ end
107
+
108
+ private
109
+
110
+ def recreate_db
111
+ unless ENV["CI"]
112
+ rake "db:environment:set", env: "development"
113
+ rake "db:drop"
114
+ end
115
+ rake "db:create"
116
+ rake "db:migrate"
117
+ rake "db:test:prepare"
118
+ end
119
+ end
120
+ end
121
+ end