redmineup 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/Gemfile +4 -0
  4. data/README.md +204 -0
  5. data/Rakefile +11 -0
  6. data/app/controllers/redmineup_controller.rb +26 -0
  7. data/app/views/redmine_crm/redmineup_calendar/_calendar.html.erb +34 -0
  8. data/app/views/redmineup/_money.html.erb +44 -0
  9. data/app/views/redmineup/settings.html.erb +10 -0
  10. data/bitbucket-pipelines.yml +50 -0
  11. data/config/currency_iso.json +2544 -0
  12. data/config/locales/cs.yml +13 -0
  13. data/config/locales/de.yml +13 -0
  14. data/config/locales/en.yml +13 -0
  15. data/config/locales/es.yml +13 -0
  16. data/config/locales/ru.yml +13 -0
  17. data/config/routes.rb +5 -0
  18. data/doc/CHANGELOG +14 -0
  19. data/doc/LICENSE.txt +339 -0
  20. data/lib/redmineup/acts_as_draftable/draft.rb +40 -0
  21. data/lib/redmineup/acts_as_draftable/up_acts_as_draftable.rb +172 -0
  22. data/lib/redmineup/acts_as_list/list.rb +282 -0
  23. data/lib/redmineup/acts_as_priceable/up_acts_as_priceable.rb +33 -0
  24. data/lib/redmineup/acts_as_taggable/tag.rb +81 -0
  25. data/lib/redmineup/acts_as_taggable/tag_list.rb +111 -0
  26. data/lib/redmineup/acts_as_taggable/tagging.rb +16 -0
  27. data/lib/redmineup/acts_as_taggable/up_acts_as_taggable.rb +357 -0
  28. data/lib/redmineup/acts_as_viewed/up_acts_as_viewed.rb +274 -0
  29. data/lib/redmineup/acts_as_votable/up_acts_as_votable.rb +80 -0
  30. data/lib/redmineup/acts_as_votable/up_acts_as_voter.rb +20 -0
  31. data/lib/redmineup/acts_as_votable/votable.rb +323 -0
  32. data/lib/redmineup/acts_as_votable/vote.rb +28 -0
  33. data/lib/redmineup/acts_as_votable/voter.rb +131 -0
  34. data/lib/redmineup/assets_manager.rb +43 -0
  35. data/lib/redmineup/colors_helper.rb +192 -0
  36. data/lib/redmineup/compatibility/application_controller_patch.rb +33 -0
  37. data/lib/redmineup/compatibility/routing_mapper_patch.rb +25 -0
  38. data/lib/redmineup/currency/formatting.rb +224 -0
  39. data/lib/redmineup/currency/heuristics.rb +151 -0
  40. data/lib/redmineup/currency/loader.rb +23 -0
  41. data/lib/redmineup/currency.rb +450 -0
  42. data/lib/redmineup/engine.rb +4 -0
  43. data/lib/redmineup/helpers/external_assets_helper.rb +20 -0
  44. data/lib/redmineup/helpers/form_tag_helper.rb +88 -0
  45. data/lib/redmineup/helpers/rup_calendar_helper.rb +146 -0
  46. data/lib/redmineup/helpers/tags_helper.rb +13 -0
  47. data/lib/redmineup/helpers/vote_helper.rb +35 -0
  48. data/lib/redmineup/hooks/views_layouts_hook.rb +11 -0
  49. data/lib/redmineup/liquid/drops/attachment_drop.rb +47 -0
  50. data/lib/redmineup/liquid/drops/issue_relations_drop.rb +41 -0
  51. data/lib/redmineup/liquid/drops/issues_drop.rb +217 -0
  52. data/lib/redmineup/liquid/drops/news_drop.rb +54 -0
  53. data/lib/redmineup/liquid/drops/projects_drop.rb +86 -0
  54. data/lib/redmineup/liquid/drops/time_entries_drop.rb +65 -0
  55. data/lib/redmineup/liquid/drops/users_drop.rb +68 -0
  56. data/lib/redmineup/liquid/filters/arrays.rb +254 -0
  57. data/lib/redmineup/liquid/filters/base.rb +249 -0
  58. data/lib/redmineup/liquid/filters/colors.rb +31 -0
  59. data/lib/redmineup/money_helper.rb +66 -0
  60. data/lib/redmineup/patches/liquid_patch.rb +33 -0
  61. data/lib/redmineup/settings/money.rb +46 -0
  62. data/lib/redmineup/settings.rb +53 -0
  63. data/lib/redmineup/version.rb +3 -0
  64. data/lib/redmineup.rb +108 -0
  65. data/redmineup.gemspec +29 -0
  66. data/test/acts_as_draftable/draft_test.rb +29 -0
  67. data/test/acts_as_draftable/rup_acts_as_draftable_test.rb +178 -0
  68. data/test/acts_as_taggable/rup_acts_as_taggable_test.rb +350 -0
  69. data/test/acts_as_taggable/tag_list_test.rb +34 -0
  70. data/test/acts_as_taggable/tag_test.rb +72 -0
  71. data/test/acts_as_taggable/tagging_test.rb +15 -0
  72. data/test/acts_as_viewed/rup_acts_as_viewed_test.rb +47 -0
  73. data/test/acts_as_votable/rup_acts_as_votable_test.rb +19 -0
  74. data/test/acts_as_votable/rup_acts_as_voter_test.rb +14 -0
  75. data/test/acts_as_votable/votable_test.rb +507 -0
  76. data/test/acts_as_votable/voter_test.rb +296 -0
  77. data/test/currency_test.rb +292 -0
  78. data/test/database.yml +17 -0
  79. data/test/fixtures/attachments.yml +14 -0
  80. data/test/fixtures/issues.yml +24 -0
  81. data/test/fixtures/news.yml +8 -0
  82. data/test/fixtures/projects.yml +10 -0
  83. data/test/fixtures/taggings.yml +32 -0
  84. data/test/fixtures/tags.yml +11 -0
  85. data/test/fixtures/users.yml +9 -0
  86. data/test/fixtures/votable_caches.yml +2 -0
  87. data/test/fixtures/votables.yml +4 -0
  88. data/test/fixtures/voters.yml +6 -0
  89. data/test/liquid/drops/attachment_drop_test.rb +15 -0
  90. data/test/liquid/drops/issue_relations_drop_test.rb +24 -0
  91. data/test/liquid/drops/issues_drop_test.rb +38 -0
  92. data/test/liquid/drops/news_drop_test.rb +38 -0
  93. data/test/liquid/drops/projects_drop_test.rb +44 -0
  94. data/test/liquid/drops/uses_drop_test.rb +36 -0
  95. data/test/liquid/filters/arrays_filter_test.rb +31 -0
  96. data/test/liquid/filters/base_filter_test.rb +67 -0
  97. data/test/liquid/filters/colors_filter_test.rb +33 -0
  98. data/test/liquid/liquid_helper.rb +34 -0
  99. data/test/models/attachment.rb +3 -0
  100. data/test/models/issue.rb +21 -0
  101. data/test/models/issue_relation.rb +10 -0
  102. data/test/models/news.rb +3 -0
  103. data/test/models/project.rb +8 -0
  104. data/test/models/user.rb +11 -0
  105. data/test/models/vote_classes.rb +33 -0
  106. data/test/money_helper_test.rb +12 -0
  107. data/test/schema.rb +144 -0
  108. data/test/tags_helper_test.rb +29 -0
  109. data/test/test_helper.rb +66 -0
  110. data/test/vote_helper_test.rb +28 -0
  111. data/vendor/assets/images/money.png +0 -0
  112. data/vendor/assets/images/vcard.png +0 -0
  113. data/vendor/assets/javascripts/Chart.bundle.min.js +16 -0
  114. data/vendor/assets/javascripts/select2.js +2 -0
  115. data/vendor/assets/javascripts/select2_helpers.js +192 -0
  116. data/vendor/assets/stylesheets/money.css +96 -0
  117. data/vendor/assets/stylesheets/select2.css +424 -0
  118. metadata +295 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f8906ecd18c32f3d77f7ecb9ce342051cf620884442332900bd18b3678847264
4
+ data.tar.gz: ac7a23b98f0a4e612fe255c981d563069c53d4d29448fd1e60fefc8d45244cca
5
+ SHA512:
6
+ metadata.gz: 9367020f0bb91903c3c64c2e631f4ccf7559331b59373f11b4b6afa0ed98f6496e1441af347ef287720cee9a6461aab3b3138f4e902dad6e5d6e54ac2d9ad29c
7
+ data.tar.gz: 6dc7397b41cd7141de6167777edfc2306dd9d7010aa8813e868df272e648f8f6ed49a129104ff54d469fad074d0762d38468f86b2ac8ebdea38e90f0774f25ae
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /pkg/
7
+ /public/
8
+ /test/public/
9
+ /spec/reports/
10
+ /tmp/
11
+ *.bundle
12
+ *.so
13
+ *.o
14
+ *.a
15
+ mkmf.log
16
+ /test/debug.log
17
+ /Guardfile
18
+ /Gemfile.local
19
+ /Gemfile.local.lock
20
+ *.gem
21
+ /.idea/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in redmineup.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,204 @@
1
+ # Redmineup
2
+
3
+ This gem is used at RedmineUP as a general place for shared functionality and
4
+ assets. It contains **Chart.js** and **select2** JS libraries, various mixins
5
+ for ActiveRecord models and other things you might find useful.
6
+
7
+ Among mixins there are:
8
+
9
+ * up_acts_as_draftable
10
+ * up_acts_as_taggable
11
+ * up_acts_as_viewable
12
+ * up_acts_as_votable
13
+
14
+
15
+ ## Installation
16
+
17
+ Add it to your plugin's Gemfile:
18
+ ```ruby
19
+ gem 'redmineup'
20
+ ```
21
+
22
+ Then invoke the following command in your plugin's or Redmine directory:
23
+ ```
24
+ $ bundle install
25
+ ```
26
+
27
+ And now you can start using it.
28
+
29
+
30
+ ## Usage
31
+ ### Drafts
32
+ This module allows saving and restoring drafts for different models. To be
33
+ saved as a draft, an instance does not need to pass the validations. Drafts
34
+ store not only model attributes, but also associations and virtual attributes.
35
+ A draft could be linked to a given user, so every user can manage his/her own
36
+ drafts independent of others. A draft might have a parent instance.
37
+
38
+ First of all, drafts need to be saved somewhere, so let's create a migration:
39
+ ```ruby
40
+ class CreateDrafts < Rails.version > '5' ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
41
+ def change
42
+ ActiveRecord::Base.create_drafts_table
43
+ end
44
+ end
45
+ ```
46
+
47
+ Then in the Redmine directory run:
48
+ ```
49
+ $ rake redmine:plugins:migrate
50
+ ```
51
+
52
+ Next, add `up_acts_as_draftable` to a model for which you want to save drafts:
53
+ ```ruby
54
+ class Message < ActiveRecord::Base
55
+ up_acts_as_draftable
56
+ end
57
+ ```
58
+
59
+ And that's it for the preparation, now you're ready to make use of drafts:
60
+ ```ruby
61
+ # You can save message as a draft.
62
+ Message.new(subject: 'foo').save_draft
63
+
64
+ # And later restore message from the draft.
65
+ draft = Message.drafts(nil).last
66
+ message = draft.restore
67
+ puts message.subject
68
+ # => foo
69
+
70
+ # Draft can be overwritten.
71
+ message.content = 'bar'
72
+ puts message.save_draft
73
+ # => true
74
+
75
+ # You can also save draft linked to a particular user.
76
+ Message.new(subject: 'baz').save_draft(user: current_user)
77
+
78
+ # And restore message from some user's draft.
79
+ user_draft = Message.drafts(current_user).last
80
+ user_message = user_draft.restore
81
+ puts user_message.subject
82
+ # => baz
83
+
84
+ # It's also possible to restore a bunch of messages at once.
85
+ messages = Message.drafts(current_user).restore_all
86
+ p messages.map(&:subject)
87
+ # => ["baz"]
88
+
89
+ # When a model instance is saved, corresponding draft is removed.
90
+ puts Message.drafts(current_user).count
91
+ # => 1
92
+ user_message.board_id = Board.first.id
93
+ user_message.save!
94
+ puts Message.drafts(current_user).count
95
+ # => 0
96
+
97
+ # Drafts will be saved only for new (not persisted) or changed instances.
98
+ puts Message.new.save_draft
99
+ # => true
100
+ persisted = Message.last
101
+ puts persisted.save_draft
102
+ # => false
103
+ persisted.subject = 'other subject'
104
+ puts persisted.save_draft
105
+ # => true
106
+ ```
107
+
108
+ ### Tags
109
+ This module makes it possible to tag objects.
110
+
111
+ First, create a migration:
112
+ ```ruby
113
+ class CreateTags < Rails.version > '5' ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
114
+ def change
115
+ ActiveRecord::Base.create_taggable_table
116
+ end
117
+ end
118
+ ```
119
+
120
+ Then in the Redmine directory run:
121
+ ```
122
+ $ rake redmine:plugins:migrate
123
+ ```
124
+
125
+ Next, add `up_acts_as_taggable` to a model for which you want to provide tags:
126
+ ```ruby
127
+ class Contact < ActiveRecord::Base
128
+ up_acts_as_taggable
129
+ end
130
+ ```
131
+
132
+ TODO: Add examples of usage.
133
+
134
+ ### Viewings
135
+ This module allows you to count views for some ActiveRecord model instances.
136
+
137
+ To count views you'll need to create a migration:
138
+ ```ruby
139
+ class CreateViewings < Rails.version > '5' ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
140
+ def change
141
+ ActiveRecord::Base.create_viewings_table
142
+ end
143
+ end
144
+ ```
145
+
146
+ To apply it, run the following in the Redmine directory:
147
+ ```
148
+ $ rake redmine:plugins:migrate
149
+ ```
150
+
151
+ Then add `up_acts_as_viewed` to a model for which you want to count views.
152
+ ```ruby
153
+ class Question < ActiveRecord::Base
154
+ up_acts_as_viewed
155
+ end
156
+ ```
157
+
158
+ TODO: Provide some usage examples.
159
+
160
+ ### Votes
161
+ With this module you can make your models votable and allow users to vote.
162
+
163
+ As always, create a migration first:
164
+ ```ruby
165
+ class CreateVotes < Rails.version > '5' ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
166
+ def change
167
+ ActiveRecord::Base.create_votable_table
168
+ end
169
+ end
170
+ ```
171
+
172
+ Then apply it by running the following command in the Redmine directory:
173
+ ```
174
+ $ rake redmine:plugins:migrate
175
+ ```
176
+
177
+ To make a model votable, add `up_acts_as_votable` to it:
178
+ ```ruby
179
+ class Question < ActiveRecord::Base
180
+ up_acts_as_votable
181
+ end
182
+ ```
183
+
184
+ TODO: Write about `up_acts_as_voter` and add usage examples.
185
+
186
+
187
+ ## Development
188
+
189
+ If you're planning to extend this gem, you will need to install development
190
+ dependencies. To do this, execute the following command in the project's
191
+ directory:
192
+ ```
193
+ $ bundle install
194
+ ```
195
+
196
+ After that you'll be able to run tests:
197
+ ```
198
+ $ bundle exec rake test
199
+ ```
200
+
201
+ SQLite in-memory database will be used by default, which is the fastest way to run tests. To run them using different database adapters, set `DB` environment variable to one of the available values — `mysql`, `postgresql`, `sqlite`. For example, to use PostgreSQL, invoke tests like so:
202
+ ```
203
+ $ bundle exec rake test DB=postgresql
204
+ ```
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ task default: :test
5
+
6
+ desc 'Run tests'
7
+ Rake::TestTask.new(:test) do |t|
8
+ t.libs << 'test'
9
+ t.pattern = 'test/**/*_test.rb'
10
+ t.verbose = true
11
+ end
@@ -0,0 +1,26 @@
1
+ class RedmineupController < ApplicationController
2
+ layout 'admin'
3
+
4
+ before_action :require_admin
5
+ require_sudo_mode :settings if respond_to?(:require_sudo_mode)
6
+
7
+ def settings
8
+ @section = Redmineup::Settings::SECTIONS[params[:id]]
9
+ return render_404 unless @section
10
+
11
+ if request.post?
12
+ setting =
13
+ if params[:settings].present?
14
+ params[:settings].respond_to?(:to_unsafe_hash) ? params[:settings].to_unsafe_hash : params[:settings]
15
+ else
16
+ {}
17
+ end
18
+ Redmineup::Settings.apply = setting
19
+ flash[:notice] = l(:notice_successful_update)
20
+ redirect_to redmineup_settings_path(@section[:id])
21
+ else
22
+ @settings = Redmineup::Settings.values
23
+ end
24
+ @section_tabs = Redmineup::Settings::SECTIONS.map { |_n, s| { name: s[:id], partial: s[:partial], label: s[:label] } }
25
+ end
26
+ end
@@ -0,0 +1,34 @@
1
+ <ul class="cal">
2
+ <li scope="col" title="<%= l(:label_week) %>" class="calhead week-number"></li>
3
+ <% 7.times do |i| %>
4
+ <li scope="col" class="calhead"><%= day_name((calendar.first_wday + i) % 7) %></li>
5
+ <% end %>
6
+ <% calendar.format_month.each_slice(7) do |week| %>
7
+ <li class='week-number'>
8
+ <span class="label-week"><%= l(:label_week) %></span> <%= calendar.week_number week.first %>
9
+ </li>
10
+ <% week.each do |day| %>
11
+ <li class="<%= calendar.day_css_classes day %> calbody">
12
+ <p class="day-num"><%= day.day %>
13
+ <span class="abbr-day">(<%= abbr_day_name(day.cwday) %>)</span>
14
+ </p>
15
+ <% calendar.events_on(day).each do |i| %>
16
+ <% if i.is_a? Issue %>
17
+ <%= tag.div class: [ i.css_classes, 'tooltip hascontextmenu', starting: day == i.start_date, ending: day == i.due_date] do %>
18
+ <%= "#{i.project} -" unless @project && @project == i.project %>
19
+ <%= link_to_issue i, :truncate => 30 %>
20
+ <span class="tip"><%= render_issue_tooltip i %></span>
21
+ <%= check_box_tag 'ids[]', i.id, false, :style => 'display:none;', :id => nil %>
22
+ <% end %>
23
+ <% else %>
24
+ <span class="icon icon-package">
25
+ <%= "#{i.project} -" unless @project && @project == i.project %>
26
+ <%= link_to_version i %>
27
+ </span>
28
+ <% end %>
29
+ <% end %>
30
+ </li>
31
+ <% end %>
32
+ <% end %>
33
+ </ul>
34
+ <%= context_menu %>
@@ -0,0 +1,44 @@
1
+ <p>
2
+ <label for="cb_settings_disable_taxes"><%= l(:label_redmineup_disable_taxes) %></label>
3
+ <%= hidden_field_tag 'settings[disable_taxes]', '0' %>
4
+ <%= check_box_tag 'settings[disable_taxes]', 1, Redmineup::Settings::Money.disable_taxes?, id: 'cb_settings_disable_taxes' %>
5
+ </p>
6
+
7
+ <span id="tax_data">
8
+ <p>
9
+ <label><%= l(:label_redmineup_default_tax) %></label>
10
+ <%= text_field_tag 'settings[default_tax]', Redmineup::Settings::Money.default_tax, size: 6, maxlength: 5 %> %
11
+ </p>
12
+
13
+ <p>
14
+ <label><%= l(:label_redmineup_tax_type) %></label>
15
+ <%= select_tag 'settings[tax_type]', options_for_select([[l(:label_redmineup_tax_type_exclusive), Redmineup::Settings::Money::TAX_TYPE_EXCLUSIVE],
16
+ [l(:label_redmineup_tax_type_inclusive), Redmineup::Settings::Money::TAX_TYPE_INCLUSIVE]],
17
+ @settings['tax_type']) %>
18
+ </p>
19
+ </span>
20
+
21
+ <p>
22
+ <label><%= l(:label_redmineup_default_currency) %></label>
23
+ <%= select_tag 'settings[default_currency]', options_for_select(all_currencies.insert(0, ['', '']), Redmineup::Settings::Money.default_currency) %>
24
+ </p>
25
+
26
+ <p>
27
+ <label><%= l(:label_redmineup_major_currencies) %></label>
28
+ <%= text_field_tag 'settings[major_currencies]', Redmineup::Settings::Money.major_currencies.join(', '), size: 40 %>
29
+ <br>
30
+ <em class="info"><%= l(:text_comma_separated) %></em>
31
+ </p>
32
+
33
+ <p>
34
+ <label><%= l(:label_redmineup_thousands_delimiter) %></label>
35
+ <%= select_tag 'settings[thousands_delimiter]', options_for_select([["9 999", " "],
36
+ ["9,999", ","],
37
+ ["9.999", "."]], Redmineup::Settings::Money.thousands_delimiter) %>
38
+ </p>
39
+
40
+ <p>
41
+ <label><%= l(:label_redmineup_decimal_separator) %></label>
42
+ <%= select_tag 'settings[decimal_separator]', options_for_select([["0.00", "."],
43
+ ["0,00", ","]], Redmineup::Settings::Money.decimal_separator) %>
44
+ </p>
@@ -0,0 +1,10 @@
1
+ <%= title l(:label_redmineup_settings) %>
2
+
3
+ <div id="settings">
4
+ <%= form_tag({ action: 'settings', id: @section[:id] }) do %>
5
+ <div class="box tabular settings">
6
+ <%= render partial: 'money' %>
7
+ </div>
8
+ <%= submit_tag l(:button_apply) %>
9
+ <% end %>
10
+ </div>
@@ -0,0 +1,50 @@
1
+ # This is a sample build configuration for Ruby.
2
+ # Check our guides at https://confluence.atlassian.com/x/8r-5Mw for more examples.
3
+ # Only use spaces to indent your .yml configuration.
4
+ # -----
5
+ # You can specify a custom docker image from Docker Hub as your build environment.
6
+
7
+ pipelines:
8
+ default:
9
+ - parallel:
10
+ - step:
11
+ name: 2.4.1 ruby
12
+ image: ruby:2.4.1
13
+ script:
14
+ - sed -i "s/'sqlite3'/'sqlite3', '~> 1.3.6'/g" redmineup.gemspec
15
+ - sed -i "s/'mysql2'/'mysql2', '~> 0.4.0'/g" redmineup.gemspec
16
+ - sed -i "s/'rubyzip'/'rubyzip'\n spec.add_runtime_dependency 'loofah', '~>2.19.1'/g" redmineup.gemspec
17
+ - bundle install
18
+ - bundle exec rake test DB=sqlite
19
+ - bundle exec rake test DB=postgresql
20
+ - bundle exec rake test DB=mysql
21
+ services:
22
+ - mysql
23
+ - postgres
24
+ - step:
25
+ name: 3.2.2 ruby
26
+ image: ruby:3.2.2
27
+ script:
28
+ - sed -i "s/'sqlite3'/'sqlite3', '~> 1.4.4'/g" redmineup.gemspec
29
+ - sed -i "s/'mysql2'/'mysql2', '~> 0.5.0'/g" redmineup.gemspec
30
+ - sed -i "s/'rubyzip'/'rubyzip'\n spec.add_runtime_dependency 'loofah', '~>2.19.1'/g" redmineup.gemspec
31
+ - bundle install
32
+ - bundle exec rake test DB=sqlite
33
+ - bundle exec rake test DB=postgresql
34
+ - bundle exec rake test DB=mysql
35
+ services:
36
+ - mysql
37
+ - postgres
38
+
39
+ definitions:
40
+ services:
41
+ mysql:
42
+ image: mysql:5.7
43
+ environment:
44
+ MYSQL_DATABASE: redmineup_test
45
+ MYSQL_ROOT_PASSWORD: password
46
+ postgres:
47
+ image: postgres
48
+ environment:
49
+ POSTGRES_DB: redmineup_test
50
+ POSTGRES_PASSWORD: password