mirror of
https://github.com/TracksApp/tracks.git
synced 2025-09-22 05:50:47 +02:00
Compare commits
218 commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
97220798db | ||
![]() |
bebdcb233c | ||
![]() |
52c9a50f16 | ||
![]() |
6e0cb8125d | ||
![]() |
1d483148d7 | ||
![]() |
d397e7be97 | ||
![]() |
8a8a816645 | ||
![]() |
36cba2fffc | ||
![]() |
02ca81f761 | ||
![]() |
f8966fb48f | ||
![]() |
a121b6381d | ||
![]() |
d670a70ede | ||
![]() |
21e27915a6 | ||
![]() |
2691d18cdb | ||
![]() |
4ffdf00dca | ||
![]() |
889540cc94 | ||
![]() |
ea70f0a13b | ||
![]() |
3b2c26478f | ||
![]() |
a2d86b5d6c | ||
![]() |
86a0ace6b9 | ||
![]() |
18e9fb7b0c | ||
![]() |
a3e23ef9ed | ||
![]() |
4cf825cb83 | ||
![]() |
c684b1ce19 | ||
![]() |
86b982df8e | ||
![]() |
c1dd33975b | ||
![]() |
661ef20c5f | ||
![]() |
ab640a8f46 | ||
![]() |
8a50b67edd | ||
![]() |
61841c1f14 | ||
![]() |
e7aace3cac | ||
![]() |
160b9a7ab5 | ||
![]() |
2f5451a713 | ||
![]() |
42e397d028 | ||
![]() |
edf145f366 | ||
![]() |
82e49bd00b | ||
![]() |
e3a26f9396 | ||
![]() |
3fbf0b07f5 | ||
![]() |
4bbc809a1c | ||
![]() |
a185b2c0f8 | ||
![]() |
3ccd2345ba | ||
![]() |
95597a969c | ||
![]() |
4f6d806724 | ||
![]() |
63d2060dc1 | ||
![]() |
2eb54b1c3e | ||
![]() |
36b47125ef | ||
![]() |
d51432d09b | ||
![]() |
46a6cd716b | ||
![]() |
1a9ffd96d3 | ||
![]() |
eecd15b150 | ||
![]() |
7b6f7fe8bb | ||
![]() |
2f6dd0f808 | ||
![]() |
8a8bdfe732 | ||
![]() |
db41886954 | ||
![]() |
77d12853c1 | ||
![]() |
19c8fcc0d9 | ||
![]() |
b97aa8fd4e | ||
![]() |
fc2a8bb8f3 | ||
![]() |
70c5ba94df | ||
![]() |
761ec11e07 | ||
![]() |
c69811e19c | ||
![]() |
3fbe3b2c90 | ||
![]() |
8868c389af | ||
![]() |
23223dea9b | ||
![]() |
674e24ea62 | ||
![]() |
3e07e27099 | ||
![]() |
c43cd6cb16 | ||
![]() |
7ed9f2ca3d | ||
![]() |
b32cb2090e | ||
![]() |
2094826d2f | ||
![]() |
4f94e2dfc2 | ||
![]() |
13bdef74b3 | ||
![]() |
3fc943ce2a | ||
![]() |
e77b83683a | ||
![]() |
854034c554 | ||
![]() |
7d9c5786be | ||
![]() |
fa7d213ca7 | ||
![]() |
da726b1700 | ||
![]() |
ffa79f2820 | ||
![]() |
6d5f269d77 | ||
![]() |
2144160ec5 | ||
![]() |
41f7a86bba | ||
![]() |
03dc26c06e | ||
![]() |
10bb9e86ac | ||
![]() |
4863c82469 | ||
![]() |
3a8988ac74 | ||
![]() |
5484a4c894 | ||
![]() |
ecaed7bca7 | ||
![]() |
69d3ea5f30 | ||
![]() |
fb38741fa2 | ||
![]() |
cb9fc6900d | ||
![]() |
ad356a9a01 | ||
![]() |
b27cf9f533 | ||
![]() |
7d96e9b0cf | ||
![]() |
0487c9f17c | ||
![]() |
4e6d8396ad | ||
![]() |
c8c48306ea | ||
![]() |
87a2fca247 | ||
![]() |
9d737b57f4 | ||
![]() |
2431cdef3b | ||
![]() |
f64445cd33 | ||
![]() |
0d2223ef52 | ||
![]() |
29ce045f15 | ||
![]() |
dd406ad6cc | ||
![]() |
c5e27b3c5a | ||
![]() |
57cc1185f4 | ||
![]() |
1d1bc3b71e | ||
![]() |
fbd888c200 | ||
![]() |
186901cf32 | ||
![]() |
9a2e947173 | ||
![]() |
692b6bf653 | ||
![]() |
976ad893e7 | ||
![]() |
fe2befc72e | ||
![]() |
846494843b | ||
![]() |
57aa499027 | ||
![]() |
3221f1c194 | ||
![]() |
61b9c93a7d | ||
![]() |
1ca43b8ee5 | ||
![]() |
9742bfc338 | ||
![]() |
39ab8dddcf | ||
![]() |
450db54865 | ||
![]() |
f960c1939e | ||
![]() |
308410ea71 | ||
![]() |
d946081e0f | ||
![]() |
c56db12281 | ||
![]() |
a5e5d0934f | ||
![]() |
3077578e6b | ||
![]() |
2e82791887 | ||
![]() |
5b49f9e704 | ||
![]() |
a746dd31d3 | ||
![]() |
b3754f2ee6 | ||
![]() |
5243a0a092 | ||
![]() |
5682a380f3 | ||
![]() |
477dd9737f | ||
![]() |
4b043968ad | ||
![]() |
ecccf02cc9 | ||
![]() |
9290e32739 | ||
![]() |
df1e9a064a | ||
![]() |
e4b366494d | ||
![]() |
cfaa0a00be | ||
![]() |
06000a0aab | ||
![]() |
894e497e88 | ||
![]() |
6eef42d569 | ||
![]() |
0616dc41a7 | ||
![]() |
7be0e4286a | ||
![]() |
1438f25b79 | ||
![]() |
89a464d9ea | ||
![]() |
8e85af75e8 | ||
![]() |
322d2b62d8 | ||
![]() |
6844679547 | ||
![]() |
2204b2c246 | ||
![]() |
87950c6500 | ||
![]() |
e829daca1e | ||
![]() |
e4f3fd0737 | ||
![]() |
24c4634a7b | ||
![]() |
e70a569511 | ||
![]() |
e81919888e | ||
![]() |
d9854e1a4e | ||
![]() |
8abfafa0c6 | ||
![]() |
efea77c9cb | ||
![]() |
96712ee99c | ||
![]() |
a79660299a | ||
![]() |
5f456d5300 | ||
![]() |
fac04ee0c1 | ||
![]() |
d9f254e2c5 | ||
![]() |
10a6ebcb41 | ||
![]() |
36529c50b3 | ||
![]() |
75420d9c38 | ||
![]() |
b0d288d2ef | ||
![]() |
6a4a72270e | ||
![]() |
d64e1a0fa4 | ||
![]() |
c23ca0574e | ||
![]() |
c7d81bb79f | ||
![]() |
784f8c3009 | ||
![]() |
0fc66953c0 | ||
![]() |
49fa90c7a6 | ||
![]() |
31f35f50c7 | ||
![]() |
a984011ddc | ||
![]() |
22f42211b0 | ||
![]() |
92348f9bc5 | ||
![]() |
0d2d89780b | ||
![]() |
3fcdb41fa9 | ||
![]() |
a9a978c1f8 | ||
![]() |
e1c5fbbbc2 | ||
![]() |
36f139d879 | ||
![]() |
11a1a6a58e | ||
![]() |
62ad2f7f0b | ||
![]() |
a0999e3e45 | ||
![]() |
76d3083e8f | ||
![]() |
50f5a946d4 | ||
![]() |
13d7a711a4 | ||
![]() |
55050af2cb | ||
![]() |
f5f0193b60 | ||
![]() |
ad87729e31 | ||
![]() |
f097a1f5e9 | ||
![]() |
2bf2f9476a | ||
![]() |
7b9a1e322f | ||
![]() |
d2fff6a64c | ||
![]() |
8f7b1ab7b2 | ||
![]() |
0968152c5a | ||
![]() |
7a64917647 | ||
![]() |
8464d0c60e | ||
![]() |
212b2dc20c | ||
![]() |
75a88f2955 | ||
![]() |
ff5adc5696 | ||
![]() |
5940fe10a6 | ||
![]() |
11ef1b6f6b | ||
![]() |
a66dca4a6b | ||
![]() |
2726abb8ea | ||
![]() |
2108b203a6 | ||
![]() |
78ab8b0ff2 | ||
![]() |
713c89c6e0 | ||
![]() |
38db8f983d | ||
![]() |
720cb02697 | ||
![]() |
867f1bc5d1 | ||
![]() |
b280485ef2 | ||
![]() |
54ed7d118b | ||
![]() |
f20aa13b7b |
70 changed files with 1030 additions and 655 deletions
|
@ -3,9 +3,7 @@ config/database.yml
|
||||||
config/site.yml
|
config/site.yml
|
||||||
coverage
|
coverage
|
||||||
db/*.sqlite3
|
db/*.sqlite3
|
||||||
doc
|
|
||||||
features
|
features
|
||||||
log
|
log
|
||||||
public/assets
|
public/assets
|
||||||
test
|
|
||||||
tmp
|
tmp
|
||||||
|
|
1
.github/dependabot.yml
vendored
1
.github/dependabot.yml
vendored
|
@ -9,3 +9,4 @@ updates:
|
||||||
directory: "/"
|
directory: "/"
|
||||||
schedule:
|
schedule:
|
||||||
interval: "daily"
|
interval: "daily"
|
||||||
|
open-pull-requests-limit: 10
|
||||||
|
|
55
.github/workflows/build-custom-release.yml
vendored
Normal file
55
.github/workflows/build-custom-release.yml
vendored
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
---
|
||||||
|
name: 'Build custom release'
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
tag:
|
||||||
|
description: 'Tag to release'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
name:
|
||||||
|
description: 'Name of the release'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-publish-release:
|
||||||
|
name: 'Build custom release'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout the code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
ref: ${{ inputs.tag }}
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
-
|
||||||
|
name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Login to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
uses: docker/build-push-action@v3
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
target: production
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
tracksapp/tracks:${{ inputs.name }}
|
||||||
|
ghcr.io/tracksapp/tracks:${{ inputs.name }}
|
||||||
|
|
||||||
|
# platforms: linux/amd64,linux/arm64
|
1
.github/workflows/build-latest.yml
vendored
1
.github/workflows/build-latest.yml
vendored
|
@ -35,6 +35,7 @@ jobs:
|
||||||
uses: docker/build-push-action@v3
|
uses: docker/build-push-action@v3
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
|
target: production
|
||||||
push: true
|
push: true
|
||||||
tags: |
|
tags: |
|
||||||
tracksapp/tracks:latest
|
tracksapp/tracks:latest
|
||||||
|
|
1
.github/workflows/build-release.yml
vendored
1
.github/workflows/build-release.yml
vendored
|
@ -35,6 +35,7 @@ jobs:
|
||||||
uses: docker/build-push-action@v3
|
uses: docker/build-push-action@v3
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
|
target: production
|
||||||
push: true
|
push: true
|
||||||
tags: |
|
tags: |
|
||||||
tracksapp/tracks:${{ github.event.release.name }}
|
tracksapp/tracks:${{ github.event.release.name }}
|
||||||
|
|
12
.github/workflows/continuous-integration.yml
vendored
12
.github/workflows/continuous-integration.yml
vendored
|
@ -6,18 +6,8 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
ruby: ["3.0", "3.1", "3.2", "3.3"]
|
ruby: ["3.2", "3.3"]
|
||||||
db: [sqlite, mysql, postgres]
|
db: [sqlite, mysql, postgres]
|
||||||
exclude:
|
|
||||||
- ruby: "3.1"
|
|
||||||
db: sqlite
|
|
||||||
- ruby: "3.1"
|
|
||||||
db: postgres
|
|
||||||
- ruby: "3.2"
|
|
||||||
db: sqlite
|
|
||||||
- ruby: "3.2"
|
|
||||||
db: postgres
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v1
|
||||||
- run: bash -x script/cibuild ${{ matrix.ruby }} ${{ matrix.db }}
|
- run: bash -x script/cibuild ${{ matrix.ruby }} ${{ matrix.db }}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
3.0
|
3.3
|
||||||
|
|
49
Dockerfile
49
Dockerfile
|
@ -1,19 +1,12 @@
|
||||||
FROM ruby:3.3
|
ARG RUBY_VERSION=3.3
|
||||||
|
FROM ruby:${RUBY_VERSION} AS base
|
||||||
# throw errors if Gemfile has been modified since Gemfile.lock
|
|
||||||
RUN bundle config --global frozen 1
|
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
RUN touch /etc/app-env
|
RUN touch /etc/app-env
|
||||||
|
|
||||||
COPY Gemfile* /app/
|
RUN apt-get update && apt-get install -y npm netcat-openbsd
|
||||||
|
RUN npm install -g yarn
|
||||||
RUN gem install bundler
|
RUN gem install bundler
|
||||||
RUN bundle install --jobs 4
|
|
||||||
|
|
||||||
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
|
|
||||||
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
|
|
||||||
RUN apt-get update && apt-get install -y yarn netcat-openbsd
|
|
||||||
|
|
||||||
RUN mkdir /app/log
|
RUN mkdir /app/log
|
||||||
|
|
||||||
|
@ -36,12 +29,38 @@ COPY lib /app/lib/
|
||||||
COPY app /app/app/
|
COPY app /app/app/
|
||||||
COPY db /app/db/
|
COPY db /app/db/
|
||||||
|
|
||||||
COPY .git /app/.git
|
# Use glob to omit error if the .git directory doesn't exists (in case the
|
||||||
|
# code is from a release archive, not a Git clone)
|
||||||
|
COPY .gi[t] /app/.git
|
||||||
|
|
||||||
RUN RAILS_ENV=production bundle exec rake assets:precompile
|
COPY Gemfile* /app/
|
||||||
|
|
||||||
ENTRYPOINT ["/app/docker-entrypoint.sh"]
|
ENTRYPOINT ["/app/docker-entrypoint.sh"]
|
||||||
|
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
|
||||||
CMD ["./bin/rails", "server", "-b", "0.0.0.0"]
|
CMD ["./bin/rails", "server", "-b", "0.0.0.0"]
|
||||||
|
|
||||||
|
FROM base AS precompile
|
||||||
|
RUN bundle config set deployment true
|
||||||
|
RUN bundle install --jobs 4
|
||||||
|
RUN RAILS_GROUPS=assets bundle exec rake assets:precompile
|
||||||
|
|
||||||
|
# Build the environment-specific stuff
|
||||||
|
FROM base AS production
|
||||||
|
RUN bundle config set without assets
|
||||||
|
RUN bundle config --global frozen 1
|
||||||
|
RUN bundle install --jobs 4
|
||||||
|
COPY --from=precompile /app/public/assets /app/public/assets
|
||||||
|
|
||||||
|
FROM base AS test
|
||||||
|
COPY test /app/test/
|
||||||
|
# For testing the API client
|
||||||
|
COPY doc /app/doc/
|
||||||
|
RUN bundle config set without assets
|
||||||
|
RUN bundle config set with development test
|
||||||
|
RUN bundle config --global frozen 1
|
||||||
|
RUN bundle install --jobs 4
|
||||||
|
COPY --from=precompile /app/public/assets /app/public/assets
|
||||||
|
|
||||||
|
FROM base AS development
|
||||||
|
RUN bundle config set with development test
|
||||||
|
RUN bundle install --jobs 4
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
FROM ruby:3.0
|
|
||||||
|
|
||||||
# throw errors if Gemfile has been modified since Gemfile.lock
|
|
||||||
RUN bundle config --global frozen 1
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
RUN touch /etc/app-env
|
|
||||||
|
|
||||||
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
|
|
||||||
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
|
|
||||||
RUN apt-get update && apt-get install -y yarn
|
|
||||||
|
|
||||||
COPY Gemfile* /app/
|
|
||||||
RUN gem install bundler
|
|
||||||
RUN bundle install --jobs 4
|
|
||||||
|
|
||||||
RUN mkdir /app/log
|
|
||||||
|
|
||||||
COPY . /app/
|
|
||||||
COPY config/database.docker.yml /app/config/database.yml
|
|
||||||
COPY config/site.docker.yml /app/config/site.yml
|
|
||||||
|
|
||||||
RUN RAILS_ENV=production bundle exec rake assets:precompile
|
|
||||||
|
|
||||||
ENTRYPOINT ["/app/docker-entrypoint.sh"]
|
|
||||||
|
|
||||||
EXPOSE 3000
|
|
||||||
|
|
||||||
CMD ["rails", "server", "-b", "0.0.0.0"]
|
|
|
@ -1,30 +0,0 @@
|
||||||
FROM ruby:3.1
|
|
||||||
|
|
||||||
# throw errors if Gemfile has been modified since Gemfile.lock
|
|
||||||
RUN bundle config --global frozen 1
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
RUN touch /etc/app-env
|
|
||||||
|
|
||||||
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
|
|
||||||
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
|
|
||||||
RUN apt-get update && apt-get install -y yarn
|
|
||||||
|
|
||||||
COPY Gemfile* /app/
|
|
||||||
RUN gem install bundler
|
|
||||||
RUN bundle install --jobs 4
|
|
||||||
|
|
||||||
RUN mkdir /app/log
|
|
||||||
|
|
||||||
COPY . /app/
|
|
||||||
COPY config/database.docker.yml /app/config/database.yml
|
|
||||||
COPY config/site.docker.yml /app/config/site.yml
|
|
||||||
|
|
||||||
RUN RAILS_ENV=production bundle exec rake assets:precompile
|
|
||||||
|
|
||||||
ENTRYPOINT ["/app/docker-entrypoint.sh"]
|
|
||||||
|
|
||||||
EXPOSE 3000
|
|
||||||
|
|
||||||
CMD ["rails", "server", "-b", "0.0.0.0"]
|
|
|
@ -1,30 +0,0 @@
|
||||||
FROM ruby:3.2
|
|
||||||
|
|
||||||
# throw errors if Gemfile has been modified since Gemfile.lock
|
|
||||||
RUN bundle config --global frozen 1
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
RUN touch /etc/app-env
|
|
||||||
|
|
||||||
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
|
|
||||||
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
|
|
||||||
RUN apt-get update && apt-get install -y yarn
|
|
||||||
|
|
||||||
COPY Gemfile* /app/
|
|
||||||
RUN gem install bundler
|
|
||||||
RUN bundle install --jobs 4
|
|
||||||
|
|
||||||
RUN mkdir /app/log
|
|
||||||
|
|
||||||
COPY . /app/
|
|
||||||
COPY config/database.docker.yml /app/config/database.yml
|
|
||||||
COPY config/site.docker.yml /app/config/site.yml
|
|
||||||
|
|
||||||
RUN RAILS_ENV=production bundle exec rake assets:precompile
|
|
||||||
|
|
||||||
ENTRYPOINT ["/app/docker-entrypoint.sh"]
|
|
||||||
|
|
||||||
EXPOSE 3000
|
|
||||||
|
|
||||||
CMD ["rails", "server", "-b", "0.0.0.0"]
|
|
66
Gemfile
66
Gemfile
|
@ -1,70 +1,72 @@
|
||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
gem 'actionpack-xml_parser', '~> 2.0'
|
gem 'actionpack-xml_parser', '~> 2.0'
|
||||||
gem 'activemodel-serializers-xml', '~> 1.0.1'
|
gem 'activemodel-serializers-xml', '~> 1.0.3'
|
||||||
|
|
||||||
gem 'coffee-rails', '~> 5.0.0'
|
gem 'rails', '~> 7.1'
|
||||||
|
|
||||||
|
gem 'font-awesome-sass', '~> 6.7.2'
|
||||||
gem 'jquery-rails', '~> 4.6'
|
gem 'jquery-rails', '~> 4.6'
|
||||||
gem 'jquery-ui-rails', '~>7.0.0'
|
gem 'jquery-ui-rails', '~>8.0.0'
|
||||||
|
gem 'aasm', '~> 5.5.1'
|
||||||
gem 'rails', '~> 6.1'
|
|
||||||
gem 'sassc-rails', '~> 2.1.2'
|
|
||||||
|
|
||||||
gem 'bootstrap-sass', '3.4.1'
|
|
||||||
gem 'font-awesome-sass', '~> 6.5.2'
|
|
||||||
|
|
||||||
gem 'uglifier', '>=1.3.0'
|
|
||||||
|
|
||||||
gem 'aasm', '~> 5.5.0'
|
|
||||||
gem 'acts_as_list'
|
gem 'acts_as_list'
|
||||||
gem 'bcrypt', '~> 3.1.20'
|
gem 'bcrypt', '~> 3.1.20'
|
||||||
gem 'htmlentities'
|
gem 'htmlentities'
|
||||||
gem "kt-paperclip", "~> 7.2"
|
gem "kt-paperclip", "~> 7.2"
|
||||||
gem 'puma', '~> 6.4'
|
gem 'puma', '~> 6.6'
|
||||||
gem 'rails_autolink'
|
gem 'rails_autolink'
|
||||||
gem 'RedCloth'
|
gem 'RedCloth'
|
||||||
gem 'sanitize', '~> 6.1'
|
gem 'sanitize', '~> 7.0'
|
||||||
gem 'tracks-chartjs-ror'
|
gem 'tracks-chartjs-ror'
|
||||||
gem 'will_paginate'
|
gem 'will_paginate'
|
||||||
|
|
||||||
|
gem 'rexml'
|
||||||
|
|
||||||
|
# Use --without <group> argument to skip unnecessary drivers
|
||||||
|
gem 'sqlite3', '~> 2.7', group: :sqlite
|
||||||
|
gem 'mysql2', '~> 0.5', group: :mysql
|
||||||
|
gem 'pg', '~> 1.5', group: :postgresql
|
||||||
|
|
||||||
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
|
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
|
||||||
gem 'mini_racer', group: :therubyracer
|
gem 'mini_racer', group: :therubyracer
|
||||||
|
|
||||||
# Use --without <group> argument to skip unnecessary drivers
|
gem 'sprockets-rails'
|
||||||
gem 'sqlite3', group: :sqlite
|
gem 'coffee-rails', '~> 5.0.0'
|
||||||
gem 'mysql2', '~> 0.5.6', group: :mysql
|
gem 'dartsass-sprockets'
|
||||||
gem 'pg', '~> 1.5.6', group: :postgresql
|
gem 'bootstrap-sass', '3.4.1'
|
||||||
|
gem 'terser'
|
||||||
|
gem 'listen'
|
||||||
|
gem 'tolk', '~> 6.0.0'
|
||||||
|
|
||||||
group :development do
|
group :development, :optional => true do
|
||||||
gem 'spring', '~> 4'
|
gem 'spring', '~> 4'
|
||||||
gem 'yard'
|
gem 'yard'
|
||||||
|
|
||||||
gem 'tolk', '~> 5.0.1'
|
|
||||||
|
|
||||||
gem 'bullet'
|
gem 'bullet'
|
||||||
gem 'rack-mini-profiler'
|
gem 'rack-mini-profiler'
|
||||||
gem 'solargraph'
|
gem 'solargraph'
|
||||||
|
|
||||||
gem 'i18n-tasks', '~> 1.0.14'
|
gem 'i18n-tasks', '~> 1.0.15'
|
||||||
end
|
end
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test, :optional => true do
|
||||||
gem 'byebug'
|
gem 'byebug'
|
||||||
gem 'listen'
|
gem 'rubocop', '~> 1.78'
|
||||||
gem 'rubocop', '~> 1.64', require: false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
group :test do
|
group :test, :optional => true do
|
||||||
|
|
||||||
# get test coverage info on codeclimate
|
# get test coverage info on codeclimate
|
||||||
gem 'codeclimate-test-reporter', '1.0.9', group: :test, require: nil
|
gem 'codeclimate-test-reporter', '1.0.9'
|
||||||
gem 'database_cleaner', '~> 1'
|
gem 'database_cleaner', '~> 2'
|
||||||
gem 'factory_bot_rails'
|
gem 'factory_bot_rails'
|
||||||
gem 'minitest-stub-const'
|
gem 'minitest-stub-const'
|
||||||
gem 'mocha', :require => false
|
gem 'mocha'
|
||||||
gem 'rails-controller-testing'
|
gem 'rails-controller-testing'
|
||||||
gem 'rails-dom-testing', '~> 2.2.0'
|
gem 'rails-dom-testing', '~> 2.3.0'
|
||||||
gem 'rspec-expectations'
|
gem 'rspec-expectations'
|
||||||
gem 'simplecov'
|
gem 'simplecov'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
group :stripe, :optional => true do
|
||||||
|
gem 'stripe'
|
||||||
|
end
|
||||||
|
|
466
Gemfile.lock
466
Gemfile.lock
|
@ -1,92 +1,112 @@
|
||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
RedCloth (4.3.3)
|
RedCloth (4.3.4)
|
||||||
aasm (5.5.0)
|
aasm (5.5.1)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
actioncable (6.1.7.8)
|
actioncable (7.1.5.1)
|
||||||
actionpack (= 6.1.7.8)
|
actionpack (= 7.1.5.1)
|
||||||
activesupport (= 6.1.7.8)
|
activesupport (= 7.1.5.1)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
websocket-driver (>= 0.6.1)
|
websocket-driver (>= 0.6.1)
|
||||||
actionmailbox (6.1.7.8)
|
zeitwerk (~> 2.6)
|
||||||
actionpack (= 6.1.7.8)
|
actionmailbox (7.1.5.1)
|
||||||
activejob (= 6.1.7.8)
|
actionpack (= 7.1.5.1)
|
||||||
activerecord (= 6.1.7.8)
|
activejob (= 7.1.5.1)
|
||||||
activestorage (= 6.1.7.8)
|
activerecord (= 7.1.5.1)
|
||||||
activesupport (= 6.1.7.8)
|
activestorage (= 7.1.5.1)
|
||||||
|
activesupport (= 7.1.5.1)
|
||||||
mail (>= 2.7.1)
|
mail (>= 2.7.1)
|
||||||
actionmailer (6.1.7.8)
|
net-imap
|
||||||
actionpack (= 6.1.7.8)
|
net-pop
|
||||||
actionview (= 6.1.7.8)
|
net-smtp
|
||||||
activejob (= 6.1.7.8)
|
actionmailer (7.1.5.1)
|
||||||
activesupport (= 6.1.7.8)
|
actionpack (= 7.1.5.1)
|
||||||
|
actionview (= 7.1.5.1)
|
||||||
|
activejob (= 7.1.5.1)
|
||||||
|
activesupport (= 7.1.5.1)
|
||||||
mail (~> 2.5, >= 2.5.4)
|
mail (~> 2.5, >= 2.5.4)
|
||||||
rails-dom-testing (~> 2.0)
|
net-imap
|
||||||
actionpack (6.1.7.8)
|
net-pop
|
||||||
actionview (= 6.1.7.8)
|
net-smtp
|
||||||
activesupport (= 6.1.7.8)
|
rails-dom-testing (~> 2.2)
|
||||||
rack (~> 2.0, >= 2.0.9)
|
actionpack (7.1.5.1)
|
||||||
|
actionview (= 7.1.5.1)
|
||||||
|
activesupport (= 7.1.5.1)
|
||||||
|
nokogiri (>= 1.8.5)
|
||||||
|
racc
|
||||||
|
rack (>= 2.2.4)
|
||||||
|
rack-session (>= 1.0.1)
|
||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.2)
|
||||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
rails-html-sanitizer (~> 1.6)
|
||||||
actionpack-xml_parser (2.0.1)
|
actionpack-xml_parser (2.0.1)
|
||||||
actionpack (>= 5.0)
|
actionpack (>= 5.0)
|
||||||
railties (>= 5.0)
|
railties (>= 5.0)
|
||||||
actiontext (6.1.7.8)
|
actiontext (7.1.5.1)
|
||||||
actionpack (= 6.1.7.8)
|
actionpack (= 7.1.5.1)
|
||||||
activerecord (= 6.1.7.8)
|
activerecord (= 7.1.5.1)
|
||||||
activestorage (= 6.1.7.8)
|
activestorage (= 7.1.5.1)
|
||||||
activesupport (= 6.1.7.8)
|
activesupport (= 7.1.5.1)
|
||||||
|
globalid (>= 0.6.0)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
actionview (6.1.7.8)
|
actionview (7.1.5.1)
|
||||||
activesupport (= 6.1.7.8)
|
activesupport (= 7.1.5.1)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
erubi (~> 1.4)
|
erubi (~> 1.11)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.2)
|
||||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
rails-html-sanitizer (~> 1.6)
|
||||||
activejob (6.1.7.8)
|
activejob (7.1.5.1)
|
||||||
activesupport (= 6.1.7.8)
|
activesupport (= 7.1.5.1)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
activemodel (6.1.7.8)
|
activemodel (7.1.5.1)
|
||||||
activesupport (= 6.1.7.8)
|
activesupport (= 7.1.5.1)
|
||||||
activemodel-serializers-xml (1.0.2)
|
activemodel-serializers-xml (1.0.3)
|
||||||
activemodel (> 5.x)
|
activemodel (>= 5.0.0.a)
|
||||||
activesupport (> 5.x)
|
activesupport (>= 5.0.0.a)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
activerecord (6.1.7.8)
|
activerecord (7.1.5.1)
|
||||||
activemodel (= 6.1.7.8)
|
activemodel (= 7.1.5.1)
|
||||||
activesupport (= 6.1.7.8)
|
activesupport (= 7.1.5.1)
|
||||||
activestorage (6.1.7.8)
|
timeout (>= 0.4.0)
|
||||||
actionpack (= 6.1.7.8)
|
activestorage (7.1.5.1)
|
||||||
activejob (= 6.1.7.8)
|
actionpack (= 7.1.5.1)
|
||||||
activerecord (= 6.1.7.8)
|
activejob (= 7.1.5.1)
|
||||||
activesupport (= 6.1.7.8)
|
activerecord (= 7.1.5.1)
|
||||||
|
activesupport (= 7.1.5.1)
|
||||||
marcel (~> 1.0)
|
marcel (~> 1.0)
|
||||||
mini_mime (>= 1.1.0)
|
activesupport (7.1.5.1)
|
||||||
activesupport (6.1.7.8)
|
base64
|
||||||
|
benchmark (>= 0.3)
|
||||||
|
bigdecimal
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
|
connection_pool (>= 2.2.5)
|
||||||
|
drb
|
||||||
i18n (>= 1.6, < 2)
|
i18n (>= 1.6, < 2)
|
||||||
|
logger (>= 1.4.2)
|
||||||
minitest (>= 5.1)
|
minitest (>= 5.1)
|
||||||
|
mutex_m
|
||||||
|
securerandom (>= 0.3)
|
||||||
tzinfo (~> 2.0)
|
tzinfo (~> 2.0)
|
||||||
zeitwerk (~> 2.3)
|
acts_as_list (1.2.4)
|
||||||
acts_as_list (1.2.1)
|
|
||||||
activerecord (>= 6.1)
|
activerecord (>= 6.1)
|
||||||
activesupport (>= 6.1)
|
activesupport (>= 6.1)
|
||||||
ast (2.4.2)
|
ast (2.4.3)
|
||||||
autoprefixer-rails (10.4.7.0)
|
autoprefixer-rails (10.4.21.0)
|
||||||
execjs (~> 2)
|
execjs (~> 2)
|
||||||
backport (1.2.0)
|
backport (1.2.0)
|
||||||
|
base64 (0.3.0)
|
||||||
bcrypt (3.1.20)
|
bcrypt (3.1.20)
|
||||||
benchmark (0.3.0)
|
benchmark (0.4.1)
|
||||||
|
bigdecimal (3.2.2)
|
||||||
bootstrap-sass (3.4.1)
|
bootstrap-sass (3.4.1)
|
||||||
autoprefixer-rails (>= 5.2.1)
|
autoprefixer-rails (>= 5.2.1)
|
||||||
sassc (>= 2.0.0)
|
sassc (>= 2.0.0)
|
||||||
builder (3.3.0)
|
builder (3.3.0)
|
||||||
bullet (7.1.4)
|
bullet (8.0.8)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
uniform_notifier (~> 1.11)
|
uniform_notifier (~> 1.11)
|
||||||
byebug (11.1.3)
|
byebug (12.0.0)
|
||||||
climate_control (0.2.0)
|
climate_control (0.2.0)
|
||||||
codeclimate-test-reporter (1.0.9)
|
codeclimate-test-reporter (1.0.9)
|
||||||
simplecov (<= 0.13)
|
simplecov (<= 0.13)
|
||||||
|
@ -97,30 +117,47 @@ GEM
|
||||||
coffee-script-source
|
coffee-script-source
|
||||||
execjs
|
execjs
|
||||||
coffee-script-source (1.12.2)
|
coffee-script-source (1.12.2)
|
||||||
concurrent-ruby (1.3.3)
|
concurrent-ruby (1.3.5)
|
||||||
|
connection_pool (2.5.3)
|
||||||
crass (1.0.6)
|
crass (1.0.6)
|
||||||
database_cleaner (1.99.0)
|
dartsass-sprockets (3.2.1)
|
||||||
date (3.3.4)
|
railties (>= 4.0.0)
|
||||||
diff-lcs (1.5.0)
|
sassc-embedded (~> 1.80.1)
|
||||||
|
sprockets (> 3.0)
|
||||||
|
sprockets-rails
|
||||||
|
tilt
|
||||||
|
database_cleaner (2.1.0)
|
||||||
|
database_cleaner-active_record (>= 2, < 3)
|
||||||
|
database_cleaner-active_record (2.2.0)
|
||||||
|
activerecord (>= 5.a)
|
||||||
|
database_cleaner-core (~> 2.0.0)
|
||||||
|
database_cleaner-core (2.0.1)
|
||||||
|
date (3.4.1)
|
||||||
|
diff-lcs (1.6.2)
|
||||||
docile (1.1.5)
|
docile (1.1.5)
|
||||||
e2mmap (0.1.0)
|
drb (2.2.3)
|
||||||
erubi (1.13.0)
|
erb (5.0.1)
|
||||||
execjs (2.8.1)
|
erubi (1.13.1)
|
||||||
factory_bot (6.4.6)
|
execjs (2.10.0)
|
||||||
activesupport (>= 5.0.0)
|
factory_bot (6.5.4)
|
||||||
factory_bot_rails (6.4.3)
|
activesupport (>= 6.1.0)
|
||||||
factory_bot (~> 6.4)
|
factory_bot_rails (6.5.0)
|
||||||
railties (>= 5.0.0)
|
factory_bot (~> 6.5)
|
||||||
|
railties (>= 6.1.0)
|
||||||
ffi (1.17.0)
|
ffi (1.17.0)
|
||||||
font-awesome-sass (6.5.2)
|
font-awesome-sass (6.7.2)
|
||||||
sassc (~> 2.0)
|
sassc (~> 2.0)
|
||||||
globalid (1.2.1)
|
globalid (1.2.1)
|
||||||
activesupport (>= 6.1)
|
activesupport (>= 6.1)
|
||||||
highline (3.0.1)
|
google-protobuf (4.31.1)
|
||||||
|
bigdecimal
|
||||||
|
rake (>= 13)
|
||||||
|
highline (3.1.2)
|
||||||
|
reline
|
||||||
htmlentities (4.3.4)
|
htmlentities (4.3.4)
|
||||||
i18n (1.14.5)
|
i18n (1.14.7)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
i18n-tasks (1.0.14)
|
i18n-tasks (1.0.15)
|
||||||
activesupport (>= 4.0.2)
|
activesupport (>= 4.0.2)
|
||||||
ast (>= 2.1.0)
|
ast (>= 2.1.0)
|
||||||
erubi
|
erubi
|
||||||
|
@ -129,17 +166,23 @@ GEM
|
||||||
parser (>= 3.2.2.1)
|
parser (>= 3.2.2.1)
|
||||||
rails-i18n
|
rails-i18n
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
|
ruby-progressbar (~> 1.8, >= 1.8.1)
|
||||||
terminal-table (>= 1.5.1)
|
terminal-table (>= 1.5.1)
|
||||||
jaro_winkler (1.5.6)
|
io-console (0.8.0)
|
||||||
|
irb (1.15.2)
|
||||||
|
pp (>= 0.6.0)
|
||||||
|
rdoc (>= 4.0.0)
|
||||||
|
reline (>= 0.4.2)
|
||||||
|
jaro_winkler (1.6.1)
|
||||||
jquery-rails (4.6.0)
|
jquery-rails (4.6.0)
|
||||||
rails-dom-testing (>= 1, < 3)
|
rails-dom-testing (>= 1, < 3)
|
||||||
railties (>= 4.2.0)
|
railties (>= 4.2.0)
|
||||||
thor (>= 0.14, < 2.0)
|
thor (>= 0.14, < 2.0)
|
||||||
jquery-ui-rails (7.0.0)
|
jquery-ui-rails (8.0.0)
|
||||||
railties (>= 3.2.16)
|
railties (>= 3.2.16)
|
||||||
json (2.7.2)
|
json (2.12.2)
|
||||||
kramdown (2.4.0)
|
kramdown (2.5.1)
|
||||||
rexml
|
rexml (>= 3.3.9)
|
||||||
kramdown-parser-gfm (1.1.0)
|
kramdown-parser-gfm (1.1.0)
|
||||||
kramdown (~> 2.0)
|
kramdown (~> 2.0)
|
||||||
kt-paperclip (7.2.0)
|
kt-paperclip (7.2.0)
|
||||||
|
@ -148,12 +191,14 @@ GEM
|
||||||
marcel (~> 1.0.1)
|
marcel (~> 1.0.1)
|
||||||
mime-types
|
mime-types
|
||||||
terrapin (~> 0.6.0)
|
terrapin (~> 0.6.0)
|
||||||
language_server-protocol (3.17.0.3)
|
language_server-protocol (3.17.0.5)
|
||||||
libv8-node (21.7.2.0)
|
libv8-node (24.1.0.0)
|
||||||
|
lint_roller (1.1.0)
|
||||||
listen (3.9.0)
|
listen (3.9.0)
|
||||||
rb-fsevent (~> 0.10, >= 0.10.3)
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||||
rb-inotify (~> 0.9, >= 0.9.10)
|
rb-inotify (~> 0.9, >= 0.9.10)
|
||||||
loofah (2.22.0)
|
logger (1.7.0)
|
||||||
|
loofah (2.24.1)
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.12.0)
|
nokogiri (>= 1.12.0)
|
||||||
mail (2.8.1)
|
mail (2.8.1)
|
||||||
|
@ -161,193 +206,223 @@ GEM
|
||||||
net-imap
|
net-imap
|
||||||
net-pop
|
net-pop
|
||||||
net-smtp
|
net-smtp
|
||||||
marcel (1.0.2)
|
marcel (1.0.4)
|
||||||
method_source (1.1.0)
|
|
||||||
mime-types (3.4.1)
|
mime-types (3.4.1)
|
||||||
mime-types-data (~> 3.2015)
|
mime-types-data (~> 3.2015)
|
||||||
mime-types-data (3.2023.0218.1)
|
mime-types-data (3.2023.0218.1)
|
||||||
mini_mime (1.1.5)
|
mini_mime (1.1.5)
|
||||||
mini_portile2 (2.8.7)
|
mini_portile2 (2.8.9)
|
||||||
mini_racer (0.12.0)
|
mini_racer (0.19.0)
|
||||||
libv8-node (~> 21.7.2.0)
|
libv8-node (~> 24.1.0.0)
|
||||||
minitest (5.23.1)
|
minitest (5.25.5)
|
||||||
minitest-stub-const (0.6)
|
minitest-stub-const (0.6)
|
||||||
mocha (2.1.0)
|
mocha (2.7.1)
|
||||||
ruby2_keywords (>= 0.0.5)
|
ruby2_keywords (>= 0.0.5)
|
||||||
|
mutex_m (0.3.0)
|
||||||
mysql2 (0.5.6)
|
mysql2 (0.5.6)
|
||||||
net-imap (0.4.12)
|
net-imap (0.5.9)
|
||||||
date
|
date
|
||||||
net-protocol
|
net-protocol
|
||||||
net-pop (0.1.2)
|
net-pop (0.1.2)
|
||||||
net-protocol
|
net-protocol
|
||||||
net-protocol (0.2.2)
|
net-protocol (0.2.2)
|
||||||
timeout
|
timeout
|
||||||
net-smtp (0.5.0)
|
net-smtp (0.5.1)
|
||||||
net-protocol
|
net-protocol
|
||||||
nio4r (2.7.3)
|
nio4r (2.7.4)
|
||||||
nokogiri (1.16.6)
|
nokogiri (1.18.9)
|
||||||
mini_portile2 (~> 2.8.2)
|
mini_portile2 (~> 2.8.2)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
parallel (1.25.1)
|
observer (0.1.2)
|
||||||
parser (3.3.3.0)
|
ostruct (0.6.2)
|
||||||
|
parallel (1.27.0)
|
||||||
|
parser (3.3.8.0)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
racc
|
racc
|
||||||
pg (1.5.6)
|
pg (1.5.9)
|
||||||
puma (6.4.2)
|
pp (0.6.2)
|
||||||
|
prettyprint
|
||||||
|
prettyprint (0.2.0)
|
||||||
|
prism (1.4.0)
|
||||||
|
psych (5.2.6)
|
||||||
|
date
|
||||||
|
stringio
|
||||||
|
puma (6.6.0)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
racc (1.8.0)
|
racc (1.8.1)
|
||||||
rack (2.2.9)
|
rack (3.2.0)
|
||||||
rack-mini-profiler (3.3.1)
|
rack-mini-profiler (4.0.1)
|
||||||
rack (>= 1.2.0)
|
rack (>= 1.2.0)
|
||||||
rack-test (2.1.0)
|
rack-session (2.1.1)
|
||||||
|
base64 (>= 0.1.0)
|
||||||
|
rack (>= 3.0.0)
|
||||||
|
rack-test (2.2.0)
|
||||||
rack (>= 1.3)
|
rack (>= 1.3)
|
||||||
rails (6.1.7.8)
|
rackup (2.2.1)
|
||||||
actioncable (= 6.1.7.8)
|
rack (>= 3)
|
||||||
actionmailbox (= 6.1.7.8)
|
rails (7.1.5.1)
|
||||||
actionmailer (= 6.1.7.8)
|
actioncable (= 7.1.5.1)
|
||||||
actionpack (= 6.1.7.8)
|
actionmailbox (= 7.1.5.1)
|
||||||
actiontext (= 6.1.7.8)
|
actionmailer (= 7.1.5.1)
|
||||||
actionview (= 6.1.7.8)
|
actionpack (= 7.1.5.1)
|
||||||
activejob (= 6.1.7.8)
|
actiontext (= 7.1.5.1)
|
||||||
activemodel (= 6.1.7.8)
|
actionview (= 7.1.5.1)
|
||||||
activerecord (= 6.1.7.8)
|
activejob (= 7.1.5.1)
|
||||||
activestorage (= 6.1.7.8)
|
activemodel (= 7.1.5.1)
|
||||||
activesupport (= 6.1.7.8)
|
activerecord (= 7.1.5.1)
|
||||||
|
activestorage (= 7.1.5.1)
|
||||||
|
activesupport (= 7.1.5.1)
|
||||||
bundler (>= 1.15.0)
|
bundler (>= 1.15.0)
|
||||||
railties (= 6.1.7.8)
|
railties (= 7.1.5.1)
|
||||||
sprockets-rails (>= 2.0.0)
|
|
||||||
rails-controller-testing (1.0.5)
|
rails-controller-testing (1.0.5)
|
||||||
actionpack (>= 5.0.1.rc1)
|
actionpack (>= 5.0.1.rc1)
|
||||||
actionview (>= 5.0.1.rc1)
|
actionview (>= 5.0.1.rc1)
|
||||||
activesupport (>= 5.0.1.rc1)
|
activesupport (>= 5.0.1.rc1)
|
||||||
rails-dom-testing (2.2.0)
|
rails-dom-testing (2.3.0)
|
||||||
activesupport (>= 5.0.0)
|
activesupport (>= 5.0.0)
|
||||||
minitest
|
minitest
|
||||||
nokogiri (>= 1.6)
|
nokogiri (>= 1.6)
|
||||||
rails-html-sanitizer (1.6.0)
|
rails-html-sanitizer (1.6.2)
|
||||||
loofah (~> 2.21)
|
loofah (~> 2.21)
|
||||||
nokogiri (~> 1.14)
|
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
|
||||||
rails-i18n (7.0.9)
|
rails-i18n (7.0.10)
|
||||||
i18n (>= 0.7, < 2)
|
i18n (>= 0.7, < 2)
|
||||||
railties (>= 6.0.0, < 8)
|
railties (>= 6.0.0, < 8)
|
||||||
rails_autolink (1.1.8)
|
rails_autolink (1.1.8)
|
||||||
actionview (> 3.1)
|
actionview (> 3.1)
|
||||||
activesupport (> 3.1)
|
activesupport (> 3.1)
|
||||||
railties (> 3.1)
|
railties (> 3.1)
|
||||||
railties (6.1.7.8)
|
railties (7.1.5.1)
|
||||||
actionpack (= 6.1.7.8)
|
actionpack (= 7.1.5.1)
|
||||||
activesupport (= 6.1.7.8)
|
activesupport (= 7.1.5.1)
|
||||||
method_source
|
irb
|
||||||
|
rackup (>= 1.0.0)
|
||||||
rake (>= 12.2)
|
rake (>= 12.2)
|
||||||
thor (~> 1.0)
|
thor (~> 1.0, >= 1.2.2)
|
||||||
|
zeitwerk (~> 2.6)
|
||||||
rainbow (3.1.1)
|
rainbow (3.1.1)
|
||||||
rake (13.2.1)
|
rake (13.3.0)
|
||||||
rb-fsevent (0.11.2)
|
rb-fsevent (0.11.2)
|
||||||
rb-inotify (0.11.1)
|
rb-inotify (0.11.1)
|
||||||
ffi (~> 1.0)
|
ffi (~> 1.0)
|
||||||
rbs (2.8.4)
|
rbs (3.9.4)
|
||||||
regexp_parser (2.9.2)
|
logger
|
||||||
reverse_markdown (2.1.1)
|
rdoc (6.14.1)
|
||||||
|
erb
|
||||||
|
psych (>= 4.0.0)
|
||||||
|
regexp_parser (2.10.0)
|
||||||
|
reline (0.6.1)
|
||||||
|
io-console (~> 0.5)
|
||||||
|
reverse_markdown (3.0.0)
|
||||||
nokogiri
|
nokogiri
|
||||||
rexml (3.3.0)
|
rexml (3.4.1)
|
||||||
strscan
|
rspec-expectations (3.13.5)
|
||||||
rspec-expectations (3.12.3)
|
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.12.0)
|
rspec-support (~> 3.13.0)
|
||||||
rspec-support (3.12.0)
|
rspec-support (3.13.4)
|
||||||
rubocop (1.64.1)
|
rubocop (1.78.0)
|
||||||
json (~> 2.3)
|
json (~> 2.3)
|
||||||
language_server-protocol (>= 3.17.0)
|
language_server-protocol (~> 3.17.0.2)
|
||||||
|
lint_roller (~> 1.1.0)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 3.3.0.2)
|
parser (>= 3.3.0.2)
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
regexp_parser (>= 1.8, < 3.0)
|
regexp_parser (>= 2.9.3, < 3.0)
|
||||||
rexml (>= 3.2.5, < 4.0)
|
rubocop-ast (>= 1.45.1, < 2.0)
|
||||||
rubocop-ast (>= 1.31.1, < 2.0)
|
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 2.4.0, < 3.0)
|
unicode-display_width (>= 2.4.0, < 4.0)
|
||||||
rubocop-ast (1.31.3)
|
rubocop-ast (1.45.1)
|
||||||
parser (>= 3.3.1.0)
|
parser (>= 3.3.7.2)
|
||||||
|
prism (~> 1.4)
|
||||||
ruby-progressbar (1.13.0)
|
ruby-progressbar (1.13.0)
|
||||||
ruby2_keywords (0.0.5)
|
ruby2_keywords (0.0.5)
|
||||||
safe_yaml (1.0.5)
|
sanitize (7.0.0)
|
||||||
sanitize (6.1.1)
|
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.12.0)
|
nokogiri (>= 1.16.8)
|
||||||
|
sass-embedded (1.89.2)
|
||||||
|
google-protobuf (~> 4.31)
|
||||||
|
rake (>= 13)
|
||||||
sassc (2.4.0)
|
sassc (2.4.0)
|
||||||
ffi (~> 1.9)
|
ffi (~> 1.9)
|
||||||
sassc-rails (2.1.2)
|
sassc-embedded (1.80.4)
|
||||||
railties (>= 4.0.0)
|
sass-embedded (~> 1.80)
|
||||||
sassc (>= 2.0)
|
securerandom (0.4.1)
|
||||||
sprockets (> 3.0)
|
|
||||||
sprockets-rails
|
|
||||||
tilt
|
|
||||||
simplecov (0.13.0)
|
simplecov (0.13.0)
|
||||||
docile (~> 1.1.0)
|
docile (~> 1.1.0)
|
||||||
json (>= 1.8, < 3)
|
json (>= 1.8, < 3)
|
||||||
simplecov-html (~> 0.10.0)
|
simplecov-html (~> 0.10.0)
|
||||||
simplecov-html (0.10.2)
|
simplecov-html (0.10.2)
|
||||||
solargraph (0.50.0)
|
solargraph (0.56.0)
|
||||||
backport (~> 1.2)
|
backport (~> 1.2)
|
||||||
benchmark
|
benchmark (~> 0.4)
|
||||||
bundler (~> 2.0)
|
bundler (~> 2.0)
|
||||||
diff-lcs (~> 1.4)
|
diff-lcs (~> 1.4)
|
||||||
e2mmap
|
jaro_winkler (~> 1.6, >= 1.6.1)
|
||||||
jaro_winkler (~> 1.5)
|
|
||||||
kramdown (~> 2.3)
|
kramdown (~> 2.3)
|
||||||
kramdown-parser-gfm (~> 1.1)
|
kramdown-parser-gfm (~> 1.1)
|
||||||
|
logger (~> 1.6)
|
||||||
|
observer (~> 0.1)
|
||||||
|
ostruct (~> 0.6)
|
||||||
parser (~> 3.0)
|
parser (~> 3.0)
|
||||||
rbs (~> 2.0)
|
prism (~> 1.4)
|
||||||
reverse_markdown (~> 2.0)
|
rbs (~> 3.3)
|
||||||
|
reverse_markdown (~> 3.0)
|
||||||
rubocop (~> 1.38)
|
rubocop (~> 1.38)
|
||||||
thor (~> 1.0)
|
thor (~> 1.0)
|
||||||
tilt (~> 2.0)
|
tilt (~> 2.0)
|
||||||
yard (~> 0.9, >= 0.9.24)
|
yard (~> 0.9, >= 0.9.24)
|
||||||
spring (4.2.1)
|
yard-solargraph (~> 0.1)
|
||||||
sprockets (4.2.0)
|
spring (4.3.0)
|
||||||
|
sprockets (4.2.2)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
|
logger
|
||||||
rack (>= 2.2.4, < 4)
|
rack (>= 2.2.4, < 4)
|
||||||
sprockets-rails (3.4.2)
|
sprockets-rails (3.5.2)
|
||||||
actionpack (>= 5.2)
|
actionpack (>= 6.1)
|
||||||
activesupport (>= 5.2)
|
activesupport (>= 6.1)
|
||||||
sprockets (>= 3.0.0)
|
sprockets (>= 3.0.0)
|
||||||
sqlite3 (1.6.9)
|
sqlite3 (2.7.3)
|
||||||
mini_portile2 (~> 2.8.0)
|
mini_portile2 (~> 2.8.0)
|
||||||
strscan (3.1.0)
|
stringio (3.1.7)
|
||||||
terminal-table (3.0.2)
|
stripe (15.5.0)
|
||||||
unicode-display_width (>= 1.1.1, < 3)
|
terminal-table (4.0.0)
|
||||||
|
unicode-display_width (>= 1.1.1, < 4)
|
||||||
terrapin (0.6.0)
|
terrapin (0.6.0)
|
||||||
climate_control (>= 0.0.3, < 1.0)
|
climate_control (>= 0.0.3, < 1.0)
|
||||||
thor (1.3.1)
|
terser (1.2.6)
|
||||||
tilt (2.3.0)
|
execjs (>= 0.3.0, < 3)
|
||||||
timeout (0.4.1)
|
thor (1.4.0)
|
||||||
tolk (5.0.1)
|
tilt (2.6.0)
|
||||||
rails (>= 6.0)
|
timeout (0.4.3)
|
||||||
safe_yaml (>= 0.8.6)
|
tolk (6.0.0)
|
||||||
|
rails (>= 7.0, < 7.3)
|
||||||
sprockets-rails (~> 3.4)
|
sprockets-rails (~> 3.4)
|
||||||
tracks-chartjs-ror (3.6.4)
|
tracks-chartjs-ror (3.6.4)
|
||||||
rails (>= 3.1)
|
rails (>= 3.1)
|
||||||
tzinfo (2.0.6)
|
tzinfo (2.0.6)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
uglifier (4.2.0)
|
unicode-display_width (3.1.4)
|
||||||
execjs (>= 0.3.0, < 3)
|
unicode-emoji (~> 4.0, >= 4.0.4)
|
||||||
unicode-display_width (2.5.0)
|
unicode-emoji (4.0.4)
|
||||||
uniform_notifier (1.16.0)
|
uniform_notifier (1.17.0)
|
||||||
websocket-driver (0.7.6)
|
websocket-driver (0.8.0)
|
||||||
|
base64
|
||||||
websocket-extensions (>= 0.1.0)
|
websocket-extensions (>= 0.1.0)
|
||||||
websocket-extensions (0.1.5)
|
websocket-extensions (0.1.5)
|
||||||
will_paginate (4.0.1)
|
will_paginate (4.0.1)
|
||||||
yard (0.9.36)
|
yard (0.9.37)
|
||||||
zeitwerk (2.6.15)
|
yard-solargraph (0.1.0)
|
||||||
|
yard (~> 0.9)
|
||||||
|
zeitwerk (2.7.3)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
RedCloth
|
RedCloth
|
||||||
aasm (~> 5.5.0)
|
aasm (~> 5.5.1)
|
||||||
actionpack-xml_parser (~> 2.0)
|
actionpack-xml_parser (~> 2.0)
|
||||||
activemodel-serializers-xml (~> 1.0.1)
|
activemodel-serializers-xml (~> 1.0.3)
|
||||||
acts_as_list
|
acts_as_list
|
||||||
bcrypt (~> 3.1.20)
|
bcrypt (~> 3.1.20)
|
||||||
bootstrap-sass (= 3.4.1)
|
bootstrap-sass (= 3.4.1)
|
||||||
|
@ -355,37 +430,40 @@ DEPENDENCIES
|
||||||
byebug
|
byebug
|
||||||
codeclimate-test-reporter (= 1.0.9)
|
codeclimate-test-reporter (= 1.0.9)
|
||||||
coffee-rails (~> 5.0.0)
|
coffee-rails (~> 5.0.0)
|
||||||
database_cleaner (~> 1)
|
dartsass-sprockets
|
||||||
|
database_cleaner (~> 2)
|
||||||
factory_bot_rails
|
factory_bot_rails
|
||||||
font-awesome-sass (~> 6.5.2)
|
font-awesome-sass (~> 6.7.2)
|
||||||
htmlentities
|
htmlentities
|
||||||
i18n-tasks (~> 1.0.14)
|
i18n-tasks (~> 1.0.15)
|
||||||
jquery-rails (~> 4.6)
|
jquery-rails (~> 4.6)
|
||||||
jquery-ui-rails (~> 7.0.0)
|
jquery-ui-rails (~> 8.0.0)
|
||||||
kt-paperclip (~> 7.2)
|
kt-paperclip (~> 7.2)
|
||||||
listen
|
listen
|
||||||
mini_racer
|
mini_racer
|
||||||
minitest-stub-const
|
minitest-stub-const
|
||||||
mocha
|
mocha
|
||||||
mysql2 (~> 0.5.6)
|
mysql2 (~> 0.5)
|
||||||
pg (~> 1.5.6)
|
pg (~> 1.5)
|
||||||
puma (~> 6.4)
|
puma (~> 6.6)
|
||||||
rack-mini-profiler
|
rack-mini-profiler
|
||||||
rails (~> 6.1)
|
rails (~> 7.1)
|
||||||
rails-controller-testing
|
rails-controller-testing
|
||||||
rails-dom-testing (~> 2.2.0)
|
rails-dom-testing (~> 2.3.0)
|
||||||
rails_autolink
|
rails_autolink
|
||||||
|
rexml
|
||||||
rspec-expectations
|
rspec-expectations
|
||||||
rubocop (~> 1.64)
|
rubocop (~> 1.78)
|
||||||
sanitize (~> 6.1)
|
sanitize (~> 7.0)
|
||||||
sassc-rails (~> 2.1.2)
|
|
||||||
simplecov
|
simplecov
|
||||||
solargraph
|
solargraph
|
||||||
spring (~> 4)
|
spring (~> 4)
|
||||||
sqlite3
|
sprockets-rails
|
||||||
tolk (~> 5.0.1)
|
sqlite3 (~> 2.7)
|
||||||
|
stripe
|
||||||
|
terser
|
||||||
|
tolk (~> 6.0.0)
|
||||||
tracks-chartjs-ror
|
tracks-chartjs-ror
|
||||||
uglifier (>= 1.3.0)
|
|
||||||
will_paginate
|
will_paginate
|
||||||
yard
|
yard
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
* Hosted services: https://github.com/TracksApp/tracks/wiki/Hosted-Tracks
|
* Hosted services: https://github.com/TracksApp/tracks/wiki/Hosted-Tracks
|
||||||
* Bug reports and feature requests: https://github.com/TracksApp/tracks/issues
|
* Bug reports and feature requests: https://github.com/TracksApp/tracks/issues
|
||||||
* Mailing list: http://groups.google.com/group/TracksApp
|
* Mailing list: http://groups.google.com/group/TracksApp
|
||||||
* IRC channel: #tracks on Libera, available also on [Matrix](https://matrix.to/#/#tracks:matrix.org)
|
|
||||||
* License: See COPYING
|
* License: See COPYING
|
||||||
|
|
||||||
Full instructions for both new installations and upgrades from older installations
|
Full instructions for both new installations and upgrades from older installations
|
||||||
|
|
40
app/assets/javascripts-jquery-ui/datepicker-zh-TW.js
Normal file
40
app/assets/javascripts-jquery-ui/datepicker-zh-TW.js
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/* Traditional Chinese (Taiwan) initialisation for the jQuery UI date picker plugin. */
|
||||||
|
/* Written by Claude Code for Tracks application. */
|
||||||
|
( function( factory ) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
|
||||||
|
// AMD. Register as an anonymous module.
|
||||||
|
define( [ "../widgets/datepicker" ], factory );
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Browser globals
|
||||||
|
factory( jQuery.datepicker );
|
||||||
|
}
|
||||||
|
} )( function( datepicker ) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
datepicker.regional["zh-TW"] = {
|
||||||
|
closeText: "關閉",
|
||||||
|
prevText: "上一月",
|
||||||
|
nextText: "下一月",
|
||||||
|
currentText: "今天",
|
||||||
|
monthNames: [ "一月", "二月", "三月", "四月", "五月", "六月",
|
||||||
|
"七月", "八月", "九月", "十月", "十一月", "十二月" ],
|
||||||
|
monthNamesShort: [ "1月", "2月", "3月", "4月", "5月", "6月",
|
||||||
|
"7月", "8月", "9月", "10月", "11月", "12月" ],
|
||||||
|
dayNames: [ "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" ],
|
||||||
|
dayNamesShort: [ "日", "一", "二", "三", "四", "五", "六" ],
|
||||||
|
dayNamesMin: [ "日", "一", "二", "三", "四", "五", "六" ],
|
||||||
|
weekHeader: "週",
|
||||||
|
dateFormat: "yy/mm/dd",
|
||||||
|
firstDay: 0,
|
||||||
|
isRTL: false,
|
||||||
|
showMonthAfterYear: true,
|
||||||
|
yearSuffix: "年" };
|
||||||
|
datepicker.setDefaults( datepicker.regional["zh-TW"] );
|
||||||
|
|
||||||
|
return datepicker.regional["zh-TW"];
|
||||||
|
|
||||||
|
} );
|
|
@ -10,9 +10,9 @@
|
||||||
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
|
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
|
||||||
// about supported directives.
|
// about supported directives.
|
||||||
//
|
//
|
||||||
//= require jquery
|
|
||||||
//= require jquery_ujs
|
//= require jquery_ujs
|
||||||
//= require bootstrap-sprockets
|
//= require jquery3
|
||||||
|
//= require bootstrap
|
||||||
|
|
||||||
//= require jquery-ui/widgets/autocomplete
|
//= require jquery-ui/widgets/autocomplete
|
||||||
//= require jquery-ui/widgets/datepicker
|
//= require jquery-ui/widgets/datepicker
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.bootstrap {
|
.bootstrap {
|
||||||
@import "bootstrap-sprockets";
|
|
||||||
@import "bootstrap";
|
@import "bootstrap";
|
||||||
@import "tracks-logo";
|
@import "tracks-logo";
|
||||||
@import "login";
|
@import "login";
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
require_dependency "login_system"
|
require_dependency "login_system"
|
||||||
require_dependency "tracks/source_view"
|
require_dependency "tracks/source_view_switching"
|
||||||
|
|
||||||
class ApplicationController < ActionController::Base
|
class ApplicationController < ActionController::Base
|
||||||
# Prevent CSRF attacks by raising an exception.
|
# Prevent CSRF attacks by raising an exception.
|
||||||
|
|
|
@ -36,7 +36,7 @@ class FeedlistController < ApplicationController
|
||||||
|
|
||||||
def get_feeds_for(object)
|
def get_feeds_for(object)
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { render :file => "feedlist/get_feeds_for_#{object.class.name.downcase}" }
|
format.html { render :template => "feedlist/get_feeds_for_#{object.class.name.downcase}" }
|
||||||
format.js
|
format.js
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -863,8 +863,10 @@ class TodosController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
@single_tag = @tag_expr.size == 1 && @tag_expr[0].size == 1
|
@single_tag = @tag_expr.size == 1 && @tag_expr[0].size == 1
|
||||||
@tag_name = @tag_expr[0][0]
|
|
||||||
@tag_title = @single_tag ? @tag_name : tag_title(@tag_expr)
|
# These are used in the templates, sanitise to prevent XSS.
|
||||||
|
@tag_name = sanitize(@tag_expr[0][0])
|
||||||
|
@tag_title = sanitize(@single_tag ? @tag_name : tag_title(@tag_expr))
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter_format_for_tag_view
|
def filter_format_for_tag_view
|
||||||
|
|
|
@ -81,13 +81,15 @@ class UsersController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
unless params['approve_tos'] == 'on' || SITE_CONFIG['tos_link'].blank?
|
unless params['approve_tos'] == 'on' || SITE_CONFIG['tos_link'].blank?
|
||||||
render_failure "You have to accept the terms of service to sign up!"
|
notify :error, t('users.tos_error')
|
||||||
|
redirect_to signup_path
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
user = User.new(user_params)
|
user = User.new(user_params)
|
||||||
|
|
||||||
unless user.valid?
|
unless user.valid?
|
||||||
|
notify :error, t('users.create_error')
|
||||||
redirect_to signup_path
|
redirect_to signup_path
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,7 +11,7 @@ xml.rss :version => "2.0" do
|
||||||
xml.item do
|
xml.item do
|
||||||
xml.title h(context.title)
|
xml.title h(context.title)
|
||||||
xml.description context_summary(context, count_undone_todos_phrase(context))
|
xml.description context_summary(context, count_undone_todos_phrase(context))
|
||||||
xml.pubDate context.created_at.to_s(:rfc822)
|
xml.pubDate context.created_at.to_formatted_s(:rfc822)
|
||||||
xml.link context_url(context)
|
xml.link context_url(context)
|
||||||
xml.guid context_url(context)
|
xml.guid context_url(context)
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,14 +7,14 @@
|
||||||
<%= javascript_include_tag "application" %>
|
<%= javascript_include_tag "application" %>
|
||||||
<%= csrf_meta_tags %>
|
<%= csrf_meta_tags %>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var SOURCE_VIEW = '<%=@source_view%>';
|
var SOURCE_VIEW = '<%=j @source_view %>';
|
||||||
var AUTH_TOKEN = '<%= raw(protect_against_forgery? ? form_authenticity_token.inspect : "") %>'
|
var AUTH_TOKEN = '<%=j raw(protect_against_forgery? ? form_authenticity_token.inspect : "") %>'
|
||||||
var TAG_NAME = '<%= @tag_name ? @tag_name : "" %>'
|
var TAG_NAME = '<%=j @tag_name ? @tag_name : "" %>'
|
||||||
var GROUP_VIEW_BY = '<%= @group_view_by ? @group_view_by : "" %>'
|
var GROUP_VIEW_BY = '<%=j @group_view_by ? @group_view_by : "" %>'
|
||||||
var defaultContexts = <%= default_contexts_for_autocomplete.html_safe rescue '{}' %>;
|
var defaultContexts = <%= default_contexts_for_autocomplete.html_safe rescue '{}' %>;
|
||||||
var defaultTags = <%= default_tags_for_autocomplete.html_safe rescue '{}' %>;
|
var defaultTags = <%= default_tags_for_autocomplete.html_safe rescue '{}' %>;
|
||||||
var dateFormat = '<%= date_format_for_date_picker %>';
|
var dateFormat = '<%=j date_format_for_date_picker %>';
|
||||||
var weekStart = '<%= current_user.prefs.week_starts %>';
|
var weekStart = '<%=j current_user.prefs.week_starts %>';
|
||||||
function relative_to_root(path) { return '<%= root_url %>'+path; };
|
function relative_to_root(path) { return '<%= root_url %>'+path; };
|
||||||
<% if current_user.prefs.refresh != 0 -%>
|
<% if current_user.prefs.refresh != 0 -%>
|
||||||
setup_auto_refresh(<%= current_user.prefs["refresh"].to_i*60000 %>);
|
setup_auto_refresh(<%= current_user.prefs["refresh"].to_i*60000 %>);
|
||||||
|
|
|
@ -86,7 +86,7 @@ var <%=object_name%> = {
|
||||||
return "<%= source_view_is_one_of(:project_list, :review) ? js_render('project_listing', {:suppress_drag_handle => source_view_is(:review)}, @project) : "" %>";
|
return "<%= source_view_is_one_of(:project_list, :review) ? js_render('project_listing', {:suppress_drag_handle => source_view_is(:review)}, @project) : "" %>";
|
||||||
},
|
},
|
||||||
html_for_sidebar: function() {
|
html_for_sidebar: function() {
|
||||||
return "<%= source_view_is(:project) ? escape_javascript(render(:file => 'sidebar/sidebar')) : "" %>";
|
return "<%= source_view_is(:project) ? escape_javascript(render(:template => 'sidebar/sidebar.html.erb')) : "" %>";
|
||||||
},
|
},
|
||||||
html_for_project_settings: function() {
|
html_for_project_settings: function() {
|
||||||
return "<%= source_view_is(:project) ? js_render('project_settings', {}, @project) : "" %>";
|
return "<%= source_view_is(:project) ? js_render('project_settings', {}, @project) : "" %>";
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
unless @further
|
unless @further
|
||||||
-%>
|
-%>
|
||||||
<%= raw t('stats.click_to_show_actions_from_week',
|
<%= raw t('stats.click_to_show_actions_from_week',
|
||||||
:link => link_to("here", show_actions_from_chart_path(:id=>"#{params[:id]}_end", :index => params[:index])),
|
:link => link_to("here", show_actions_from_chart_path(:id=>"#{params[:id].to_i}_end", :index => params[:index].to_i)),
|
||||||
:week => params[:index])
|
:week => params[:index].to_i)
|
||||||
-%>
|
-%>
|
||||||
<%
|
<%
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,7 +11,7 @@ xml.rss :version => "2.0" do
|
||||||
xml.item do
|
xml.item do
|
||||||
xml.title h(todo.description)
|
xml.title h(todo.description)
|
||||||
xml.description feed_content_for_todo(todo)
|
xml.description feed_content_for_todo(todo)
|
||||||
xml.pubDate todo.created_at.to_s(:rfc822)
|
xml.pubDate todo.created_at.to_formatted_s(:rfc822)
|
||||||
xml.link (todo.project && !todo.project.is_a?(NullProject)) ? project_url(todo.project) : context_url(todo.context)
|
xml.link (todo.project && !todo.project.is_a?(NullProject)) ? project_url(todo.project) : context_url(todo.context)
|
||||||
xml.guid todo_url(todo)
|
xml.guid todo_url(todo)
|
||||||
end
|
end
|
||||||
|
|
2
bin/rake
2
bin/rake
|
@ -9,5 +9,5 @@ if [ -e $SCRIPTPATH/../.use-docker -a ! -e /etc/app-env ];
|
||||||
then
|
then
|
||||||
$SCRIPTPATH/../script/docker-environment $0 "$@"
|
$SCRIPTPATH/../script/docker-environment $0 "$@"
|
||||||
else
|
else
|
||||||
$SCRIPTPATH/run-rake "$@"
|
bundle exec rake "$@"
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -12,7 +12,7 @@ SITE_CONFIG = YAML.load_file(File.join(File.dirname(__FILE__), 'site.yml'))
|
||||||
module Tracksapp
|
module Tracksapp
|
||||||
class Application < Rails::Application
|
class Application < Rails::Application
|
||||||
# Initialize configuration defaults for originally generated Rails version.
|
# Initialize configuration defaults for originally generated Rails version.
|
||||||
config.load_defaults 5.1
|
config.load_defaults 7.0
|
||||||
|
|
||||||
# Settings in config/environments/* take precedence over those specified here.
|
# Settings in config/environments/* take precedence over those specified here.
|
||||||
# Application configuration can go into files in config/initializers
|
# Application configuration can go into files in config/initializers
|
||||||
|
@ -21,8 +21,7 @@ module Tracksapp
|
||||||
|
|
||||||
# Custom directories with classes and modules you want to be autoloadable.
|
# Custom directories with classes and modules you want to be autoloadable.
|
||||||
# config.autoload_paths += %W(#{config.root}/extras)
|
# config.autoload_paths += %W(#{config.root}/extras)
|
||||||
config.autoload_paths += %W(#{config.root}/lib)
|
config.autoload_lib(ignore: %w(assets tasks))
|
||||||
config.eager_load_paths += %W(#{config.root}/lib)
|
|
||||||
|
|
||||||
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
||||||
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
||||||
|
|
|
@ -1,26 +1,26 @@
|
||||||
test:
|
test:
|
||||||
adapter: <%= ENV.fetch('DATABASE_TYPE') %>
|
adapter: <%= ENV['DATABASE_TYPE'] %>
|
||||||
encoding: <%= ENV.fetch('DATABASE_ENCODING') %>
|
encoding: <%= ENV['DATABASE_ENCODING'] %>
|
||||||
database: <%= ENV.fetch('DATABASE_NAME') %>
|
database: <%= ENV['DATABASE_NAME'] %>
|
||||||
host: <%= ENV.fetch('DATABASE_HOST') %>
|
host: <%= ENV['DATABASE_HOST'] %>
|
||||||
port: <%= ENV.fetch('DATABASE_PORT') %>
|
port: <%= ENV['DATABASE_PORT'] %>
|
||||||
username: <%= ENV.fetch('DATABASE_USERNAME') %>
|
username: <%= ENV['DATABASE_USERNAME'] %>
|
||||||
password: <%= ENV.fetch('DATABASE_PASSWORD') %>
|
password: <%= ENV['DATABASE_PASSWORD'] %>
|
||||||
|
|
||||||
development:
|
development:
|
||||||
adapter: <%= ENV.fetch('DATABASE_TYPE') %>
|
adapter: <%= ENV['DATABASE_TYPE'] %>
|
||||||
encoding: <%= ENV.fetch('DATABASE_ENCODING') %>
|
encoding: <%= ENV['DATABASE_ENCODING'] %>
|
||||||
database: <%= ENV.fetch('DATABASE_NAME') %>
|
database: <%= ENV['DATABASE_NAME'] %>
|
||||||
host: <%= ENV.fetch('DATABASE_HOST') %>
|
host: <%= ENV['DATABASE_HOST'] %>
|
||||||
port: <%= ENV.fetch('DATABASE_PORT') %>
|
port: <%= ENV['DATABASE_PORT'] %>
|
||||||
username: <%= ENV.fetch('DATABASE_USERNAME') %>
|
username: <%= ENV['DATABASE_USERNAME'] %>
|
||||||
password: <%= ENV.fetch('DATABASE_PASSWORD') %>
|
password: <%= ENV['DATABASE_PASSWORD'] %>
|
||||||
|
|
||||||
production:
|
production:
|
||||||
adapter: <%= ENV.fetch('DATABASE_TYPE') %>
|
adapter: <%= ENV['DATABASE_TYPE'] %>
|
||||||
encoding: <%= ENV.fetch('DATABASE_ENCODING') %>
|
encoding: <%= ENV['DATABASE_ENCODING'] %>
|
||||||
database: <%= ENV.fetch('DATABASE_NAME') %>
|
database: <%= ENV['DATABASE_NAME'] %>
|
||||||
host: <%= ENV.fetch('DATABASE_HOST') %>
|
host: <%= ENV['DATABASE_HOST'] %>
|
||||||
port: <%= ENV.fetch('DATABASE_PORT') %>
|
port: <%= ENV['DATABASE_PORT'] %>
|
||||||
username: <%= ENV.fetch('DATABASE_USERNAME') %>
|
username: <%= ENV['DATABASE_USERNAME'] %>
|
||||||
password: <%= ENV.fetch('DATABASE_PASSWORD') %>
|
password: <%= ENV['DATABASE_PASSWORD'] %>
|
||||||
|
|
|
@ -23,7 +23,7 @@ Rails.application.configure do
|
||||||
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
|
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
|
||||||
|
|
||||||
# Compress JavaScripts and CSS.
|
# Compress JavaScripts and CSS.
|
||||||
config.assets.js_compressor = :uglifier
|
config.assets.js_compressor = Terser.new
|
||||||
# config.assets.css_compressor = :sass
|
# config.assets.css_compressor = :sass
|
||||||
|
|
||||||
# Do not fallback to assets pipeline if a precompiled asset is missed.
|
# Do not fallback to assets pipeline if a precompiled asset is missed.
|
||||||
|
|
|
@ -23,7 +23,7 @@ Rails.application.configure do
|
||||||
config.action_controller.perform_caching = false
|
config.action_controller.perform_caching = false
|
||||||
|
|
||||||
# Raise exceptions instead of rendering exception templates.
|
# Raise exceptions instead of rendering exception templates.
|
||||||
config.action_dispatch.show_exceptions = false
|
config.action_dispatch.show_exceptions = :none
|
||||||
|
|
||||||
# Disable request forgery protection in test environment.
|
# Disable request forgery protection in test environment.
|
||||||
config.action_controller.allow_forgery_protection = false
|
config.action_controller.allow_forgery_protection = false
|
||||||
|
|
|
@ -7,3 +7,11 @@ Rails.application.config.assets.version = '1.0'
|
||||||
# Rails.application.config.assets.paths << Emoji.images_path
|
# Rails.application.config.assets.paths << Emoji.images_path
|
||||||
# Add Yarn node_modules folder to the asset load path.
|
# Add Yarn node_modules folder to the asset load path.
|
||||||
Rails.application.config.assets.paths << Rails.root.join('node_modules')
|
Rails.application.config.assets.paths << Rails.root.join('node_modules')
|
||||||
|
|
||||||
|
# Precompile additional assets.
|
||||||
|
# application.js, application.css, and all non-JS/CSS in the app/assets
|
||||||
|
# folder are already added.
|
||||||
|
# Rails.application.config.assets.precompile += %w( admin.js admin.css )
|
||||||
|
|
||||||
|
# Precompile jQuery UI datepicker locale files
|
||||||
|
Rails.application.config.assets.precompile += Dir[Rails.root.join('app/assets/javascripts-jquery-ui/datepicker-*.js')].map { |f| File.basename(f) }
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
TRACKS_VERSION='2.7'
|
TRACKS_VERSION='2.7.1'
|
||||||
TRACKS_REVISION_WITH_DATE=`git log --date=format:'%Y-%m-%d' --pretty=format:"%h @ %ad" -1`
|
TRACKS_REVISION_WITH_DATE=`git log --date=format:'%Y-%m-%d' --pretty=format:"%h @ %ad" -1`
|
||||||
TRACKS_REVISION=`git log --pretty=format:"%h" -1`
|
TRACKS_REVISION=`git log --pretty=format:"%h" -1`
|
||||||
|
|
|
@ -472,7 +472,7 @@ de:
|
||||||
)'"
|
)'"
|
||||||
'3': 'Go to %{preferences_link} and enter your incoming Mailgun email address
|
'3': 'Go to %{preferences_link} and enter your incoming Mailgun email address
|
||||||
(e.g. tracks@user.mailgun.com) in the "%{sms_email_name}" box.'
|
(e.g. tracks@user.mailgun.com) in the "%{sms_email_name}" box.'
|
||||||
'4': 'Select a default context for emails to be put in with "%{sms_context_name"'
|
'4': 'Select a default context for emails to be put in with "%{sms_context_name}"'
|
||||||
'5': "Add your Mailgun API key (not the Public API key) to the Tracks 'site.yml'"
|
'5': "Add your Mailgun API key (not the Public API key) to the Tracks 'site.yml'"
|
||||||
'6': "Update the mailmap in 'site.yml' to define which senders can send emails\
|
'6': "Update the mailmap in 'site.yml' to define which senders can send emails\
|
||||||
\ to which incoming addresses. For example, to send emails from your work\
|
\ to which incoming addresses. For example, to send emails from your work\
|
||||||
|
|
|
@ -1281,6 +1281,7 @@ en:
|
||||||
change_password_title: TRACKS::Change password
|
change_password_title: TRACKS::Change password
|
||||||
choose_password: Choose password
|
choose_password: Choose password
|
||||||
confirm_password: Confirm password
|
confirm_password: Confirm password
|
||||||
|
create_error: User creation failed, maybe you already have an account here?
|
||||||
desired_login: Desired login
|
desired_login: Desired login
|
||||||
destroy_confirmation: 'Warning: this will delete user ''%{login}'', all their
|
destroy_confirmation: 'Warning: this will delete user ''%{login}'', all their
|
||||||
actions, contexts, project and notes. Are you sure that you want to continue?'
|
actions, contexts, project and notes. Are you sure that you want to continue?'
|
||||||
|
@ -1315,6 +1316,7 @@ en:
|
||||||
signup_successful: Signup successful for user %{username}.
|
signup_successful: Signup successful for user %{username}.
|
||||||
successfully_deleted_user: Successfully deleted user %{username}
|
successfully_deleted_user: Successfully deleted user %{username}
|
||||||
tos_link: read the Terms of Service
|
tos_link: read the Terms of Service
|
||||||
|
tos_error: You have to accept the terms of service to sign up!
|
||||||
total_actions: Total actions
|
total_actions: Total actions
|
||||||
total_contexts: Total contexts
|
total_contexts: Total contexts
|
||||||
total_notes: Total notes
|
total_notes: Total notes
|
||||||
|
|
|
@ -133,7 +133,7 @@ es:
|
||||||
not_available_abbr: n/d
|
not_available_abbr: n/d
|
||||||
note:
|
note:
|
||||||
one: 1 nota
|
one: 1 nota
|
||||||
other: "%{count} notas"
|
other: '%{count} notas'
|
||||||
zero: 0 notas
|
zero: 0 notas
|
||||||
notes: Notas
|
notes: Notas
|
||||||
numbered_step: Paso %{number}
|
numbered_step: Paso %{number}
|
||||||
|
@ -1347,6 +1347,8 @@ es:
|
||||||
user_created: User created.
|
user_created: User created.
|
||||||
you_have_to_reset_your_password: Usted tiene que restablecer su contraseña
|
you_have_to_reset_your_password: Usted tiene que restablecer su contraseña
|
||||||
manage_users_title: TRACKS::Gestión de usuarios
|
manage_users_title: TRACKS::Gestión de usuarios
|
||||||
|
create_error: La creación de usuario falló, ¿quizás ya tienes una cuenta aquí?
|
||||||
|
tos_error: ¡Tienes que aceptar los términos del servicio para registrarte!
|
||||||
will_paginate:
|
will_paginate:
|
||||||
next_label: Siguiente »
|
next_label: Siguiente »
|
||||||
page_entries_info:
|
page_entries_info:
|
||||||
|
|
|
@ -132,7 +132,7 @@ fi:
|
||||||
not_available_abbr: ei
|
not_available_abbr: ei
|
||||||
note:
|
note:
|
||||||
one: 1 muistiinpano
|
one: 1 muistiinpano
|
||||||
other: "%{count} muistiinpanoa"
|
other: '%{count} muistiinpanoa'
|
||||||
zero: ei muistiinpanoja
|
zero: ei muistiinpanoja
|
||||||
notes: Muistiinpanot
|
notes: Muistiinpanot
|
||||||
numbered_step: Askel %{number}
|
numbered_step: Askel %{number}
|
||||||
|
@ -1268,7 +1268,7 @@ fi:
|
||||||
tickler_items_due:
|
tickler_items_due:
|
||||||
one: Yksi muistilistan merkintä on nyt ajankohtainen – päivitä sivu nähdäksesi
|
one: Yksi muistilistan merkintä on nyt ajankohtainen – päivitä sivu nähdäksesi
|
||||||
sen.
|
sen.
|
||||||
other: '{%count} muistilistan merkintää on nyt ajankohtaisia – päivitä sivu
|
other: '%{count} muistilistan merkintää on nyt ajankohtaisia – päivitä sivu
|
||||||
nähdäksesi ne.'
|
nähdäksesi ne.'
|
||||||
to_tickler: muistilistaan
|
to_tickler: muistilistaan
|
||||||
unable_to_add_dependency: Riippuvuuden lisääminen epäonnistui
|
unable_to_add_dependency: Riippuvuuden lisääminen epäonnistui
|
||||||
|
@ -1331,6 +1331,9 @@ fi:
|
||||||
total_users_count: Sinulla on yhteensä %{count} käyttäjää
|
total_users_count: Sinulla on yhteensä %{count} käyttäjää
|
||||||
user_created: Käyttäjä luotu.
|
user_created: Käyttäjä luotu.
|
||||||
you_have_to_reset_your_password: Palauta salasanasi
|
you_have_to_reset_your_password: Palauta salasanasi
|
||||||
|
create_error: Tunnuksen luominen epäonnistui, ehkä sinulla on jo käyttäjätunnus
|
||||||
|
täällä?
|
||||||
|
tos_error: Sinun täytyy hyväksyä käyttöehdot rekisteröityäksesi!
|
||||||
will_paginate:
|
will_paginate:
|
||||||
next_label: Seuraava →
|
next_label: Seuraava →
|
||||||
page_entries_info:
|
page_entries_info:
|
||||||
|
|
|
@ -424,7 +424,7 @@ nl:
|
||||||
)'"
|
)'"
|
||||||
'3': 'Go to %{preferences_link} and enter your incoming Mailgun email address
|
'3': 'Go to %{preferences_link} and enter your incoming Mailgun email address
|
||||||
(e.g. tracks@user.mailgun.com) in the "%{sms_email_name}" box.'
|
(e.g. tracks@user.mailgun.com) in the "%{sms_email_name}" box.'
|
||||||
'4': 'Select a default context for emails to be put in with "%{sms_context_name"'
|
'4': 'Select a default context for emails to be put in with "%{sms_context_name}"'
|
||||||
'5': "Add your Mailgun API key (not the Public API key) to the Tracks 'site.yml'"
|
'5': "Add your Mailgun API key (not the Public API key) to the Tracks 'site.yml'"
|
||||||
'6': "Update the mailmap in 'site.yml' to define which senders can send emails
|
'6': "Update the mailmap in 'site.yml' to define which senders can send emails
|
||||||
to which incoming addresses. For example, to send emails from your work
|
to which incoming addresses. For example, to send emails from your work
|
||||||
|
|
|
@ -459,7 +459,7 @@ ru:
|
||||||
интернета. Тогда Mailgun сможет отправлять на него данные.
|
интернета. Тогда Mailgun сможет отправлять на него данные.
|
||||||
description: Если вы хотите отправлять письма в Tracks, но не можете запустить
|
description: Если вы хотите отправлять письма в Tracks, но не можете запустить
|
||||||
почтовый сервер на том же сервере, то можно использовать встроенную в Tracks
|
почтовый сервер на том же сервере, то можно использовать встроенную в Tracks
|
||||||
поддержку {mailgun_link}.
|
поддержку %{mailgun_link}.
|
||||||
example_names:
|
example_names:
|
||||||
tag:
|
tag:
|
||||||
'2': метка2
|
'2': метка2
|
||||||
|
|
|
@ -35,7 +35,7 @@ tr:
|
||||||
etiketlerinizi ve notlarınızı içerir
|
etiketlerinizi ve notlarınızı içerir
|
||||||
csv_notes_title: CSV dosyası (sadece notlar)
|
csv_notes_title: CSV dosyası (sadece notlar)
|
||||||
xml_link_title: XML dosyası (sadece eylemler)
|
xml_link_title: XML dosyası (sadece eylemler)
|
||||||
yaml_description: ':{yaml}: Dışarı aktarmak için en iyisidir.'
|
yaml_description: '%{yaml}: Dışarı aktarmak için en iyisidir.'
|
||||||
download_link: İndirme bağlantısı
|
download_link: İndirme bağlantısı
|
||||||
yaml_link_title: YAML dosyası
|
yaml_link_title: YAML dosyası
|
||||||
xml_description: '%{xml}: Veri aktarımı ve düzenleme için en iyisidir'
|
xml_description: '%{xml}: Veri aktarımı ve düzenleme için en iyisidir'
|
||||||
|
@ -148,7 +148,7 @@ tr:
|
||||||
other: Günler
|
other: Günler
|
||||||
note:
|
note:
|
||||||
one: Not yok
|
one: Not yok
|
||||||
other: 1 not var
|
other: '%{count} not var'
|
||||||
actions_midsentence:
|
actions_midsentence:
|
||||||
one: eylem
|
one: eylem
|
||||||
other: eylemler
|
other: eylemler
|
||||||
|
|
352
config/locales/zh-TW.yml
Normal file
352
config/locales/zh-TW.yml
Normal file
|
@ -0,0 +1,352 @@
|
||||||
|
# Traditional Chinese (Taiwan) locale for Tracks
|
||||||
|
# 繁體中文 (台灣) 語言包
|
||||||
|
zh-TW:
|
||||||
|
activerecord:
|
||||||
|
attributes:
|
||||||
|
note:
|
||||||
|
created_at: 建立於
|
||||||
|
updated_at: 更新於
|
||||||
|
preference:
|
||||||
|
date_format: 日期格式
|
||||||
|
due_style: 到期樣式
|
||||||
|
first_name: 名字
|
||||||
|
last_name: 姓氏
|
||||||
|
email: 電子郵件
|
||||||
|
locale: 語言
|
||||||
|
mobile_todos_per_page: 每頁動作數 (行動版)
|
||||||
|
refresh: 重新整理間隔 (分鐘)
|
||||||
|
review_period: 專案檢視間隔
|
||||||
|
show_completed_projects_in_sidebar: 在側邊欄顯示已完成的專案
|
||||||
|
show_hidden_contexts_in_sidebar: 在側邊欄顯示隱藏的情境
|
||||||
|
show_hidden_projects_in_sidebar: 在側邊欄顯示隱藏的專案
|
||||||
|
show_number_completed: 顯示已完成的動作數量
|
||||||
|
show_project_on_todo_done: 完成待辦事項時進入專案頁面
|
||||||
|
sms_context: 預設電子郵件情境
|
||||||
|
sms_email: 寄件者電子郵件
|
||||||
|
staleness_starts: 過期開始時間
|
||||||
|
theme: 主題
|
||||||
|
time_zone: 時區
|
||||||
|
title_date_format: 標題日期格式
|
||||||
|
verbose_action_descriptors: 以詳細形式顯示動作的描述 (情境、專案)
|
||||||
|
week_starts: 每週開始於
|
||||||
|
project:
|
||||||
|
default_context_name: 預設情境
|
||||||
|
default_tags: 預設標籤
|
||||||
|
description: 描述
|
||||||
|
name: 名稱
|
||||||
|
todo:
|
||||||
|
context: 情境
|
||||||
|
description: 描述
|
||||||
|
due: 到期
|
||||||
|
notes: 備註
|
||||||
|
predecessors: 依賴於
|
||||||
|
project: 專案
|
||||||
|
show_from: 顯示開始時間
|
||||||
|
tags: 標籤
|
||||||
|
user:
|
||||||
|
auth_type: 驗證類型
|
||||||
|
created_at: 建立於
|
||||||
|
display_name: 顯示名稱
|
||||||
|
email: 電子郵件地址
|
||||||
|
first_name: 名字
|
||||||
|
last_login_at: 上次登入時間
|
||||||
|
last_name: 姓氏
|
||||||
|
login: 登入名稱
|
||||||
|
open_id_url: OpenID 網址
|
||||||
|
password: 密碼
|
||||||
|
errors:
|
||||||
|
full_messages:
|
||||||
|
format: "%{attribute} %{message}"
|
||||||
|
messages:
|
||||||
|
accepted: 必須被接受
|
||||||
|
blank: 不能為空
|
||||||
|
confirmation: 與確認不符
|
||||||
|
empty: 不能為空
|
||||||
|
equal_to: '必須等於 %{count}'
|
||||||
|
even: 必須為偶數
|
||||||
|
exclusion: 被保留使用
|
||||||
|
greater_than: '必須大於 %{count}'
|
||||||
|
greater_than_or_equal_to: '必須大於或等於 %{count}'
|
||||||
|
inclusion: 不在清單中
|
||||||
|
invalid: 無效
|
||||||
|
less_than: '必須小於 %{count}'
|
||||||
|
less_than_or_equal_to: '必須小於或等於 %{count}'
|
||||||
|
not_a_number: 不是數字
|
||||||
|
odd: 必須為奇數
|
||||||
|
record_invalid: '驗證失敗:%{errors}'
|
||||||
|
restrict_dependent_destroy:
|
||||||
|
has_one: '無法刪除記錄,因為存在相依的 %{record}'
|
||||||
|
has_many: '無法刪除記錄,因為存在相依的 %{record}'
|
||||||
|
taken: 已被使用
|
||||||
|
too_long: '太長了 (最多 %{count} 個字元)'
|
||||||
|
too_short: '太短了 (最少 %{count} 個字元)'
|
||||||
|
wrong_length: '長度錯誤 (應為 %{count} 個字元)'
|
||||||
|
models:
|
||||||
|
project:
|
||||||
|
attributes:
|
||||||
|
name:
|
||||||
|
blank: 專案必須有名稱
|
||||||
|
taken: 已存在
|
||||||
|
too_long: 專案名稱必須少於 256 個字元
|
||||||
|
template:
|
||||||
|
body: 下列欄位有問題:
|
||||||
|
header:
|
||||||
|
one: '1 個錯誤阻止了 %{model} 的儲存'
|
||||||
|
other: '%{count} 個錯誤阻止了 %{model} 的儲存'
|
||||||
|
common:
|
||||||
|
action: 動作
|
||||||
|
actions: 動作
|
||||||
|
actions_midsentence:
|
||||||
|
one: 動作
|
||||||
|
other: 動作
|
||||||
|
zero: 動作
|
||||||
|
add: 新增
|
||||||
|
ajaxError: 從伺服器取得資料時發生錯誤
|
||||||
|
back: 返回
|
||||||
|
bugs: 錯誤回報
|
||||||
|
cancel: 取消
|
||||||
|
collapse_expand: 摺疊/展開
|
||||||
|
context: 情境
|
||||||
|
contexts: 情境
|
||||||
|
contribute: 貢獻
|
||||||
|
create: 建立
|
||||||
|
days_midsentence:
|
||||||
|
one: 天
|
||||||
|
other: 天
|
||||||
|
zero: 天
|
||||||
|
deferred: 延期
|
||||||
|
description: 描述
|
||||||
|
drag_handle: 拖曳
|
||||||
|
email: 電子郵件
|
||||||
|
errors_with_fields: 下列欄位有問題:
|
||||||
|
first: 第一個
|
||||||
|
forth: 第四個
|
||||||
|
fourth: 第四個
|
||||||
|
go_back: 返回
|
||||||
|
last: 最後一個
|
||||||
|
logout: 登出
|
||||||
|
mailing_list: 郵寄清單
|
||||||
|
month: 月
|
||||||
|
months: 月
|
||||||
|
next: 下一個
|
||||||
|
none: 無
|
||||||
|
not_available_abbr: 無
|
||||||
|
note:
|
||||||
|
one: 1 個備註
|
||||||
|
other: "%{count} 個備註"
|
||||||
|
zero: 無備註
|
||||||
|
notes: 備註
|
||||||
|
numbered_step: '步驟 %{number}'
|
||||||
|
ok: 確定
|
||||||
|
optional: 選填
|
||||||
|
previous: 前一個
|
||||||
|
project: 專案
|
||||||
|
projects: 專案
|
||||||
|
recurring_todos: 重複動作
|
||||||
|
review: 檢視
|
||||||
|
search: 搜尋
|
||||||
|
second: 第二個
|
||||||
|
server_error: 伺服器發生錯誤。
|
||||||
|
show_all: 顯示全部
|
||||||
|
sort:
|
||||||
|
alphabetically: 依字母排序
|
||||||
|
alphabetically_confirm: 您確定要依字母順序排列這些專案嗎?這會取代現有的排序順序。
|
||||||
|
alphabetically_title: 依字母順序排列專案
|
||||||
|
by_task_count: 依任務數量排序
|
||||||
|
by_task_count_title: 依任務數量排序
|
||||||
|
by_task_count_title_confirm: 您確定要依任務數量排列這些專案嗎?這會取代現有的排序順序。
|
||||||
|
sort: 排序
|
||||||
|
third: 第三個
|
||||||
|
todo: 待辦事項
|
||||||
|
update: 更新
|
||||||
|
website: 網站
|
||||||
|
week: 週
|
||||||
|
weeks: 週
|
||||||
|
wiki: Wiki
|
||||||
|
login:
|
||||||
|
account_login: 帳戶登入
|
||||||
|
please_login: 請登入以使用 Tracks
|
||||||
|
sign_in: 登入
|
||||||
|
successful: 登入成功。歡迎回來!
|
||||||
|
unsuccessful: 登入失敗。
|
||||||
|
logout: 登出
|
||||||
|
logged_out: 您已從 Tracks 登出。
|
||||||
|
layouts:
|
||||||
|
navigation:
|
||||||
|
home: 首頁
|
||||||
|
contexts_title: 情境
|
||||||
|
projects_title: 專案
|
||||||
|
calendar: 日曆
|
||||||
|
calendar_title: 到期動作的日曆
|
||||||
|
completed_tasks: 已完成
|
||||||
|
completed_tasks_title: 已完成
|
||||||
|
starred: 已標星
|
||||||
|
starred_title: 查看您已標星的動作
|
||||||
|
preferences: 偏好設定
|
||||||
|
preferences_title: 顯示我的偏好設定
|
||||||
|
help: "?"
|
||||||
|
help_page: 說明
|
||||||
|
todos:
|
||||||
|
next_actions_title: Tracks - 下一步動作
|
||||||
|
action_saved: 動作已儲存
|
||||||
|
action_marked_complete: '動作 <strong>"%{description}"</strong> 已標記為 <strong>%{completed}</strong>'
|
||||||
|
confirm_delete: '您確定要刪除動作 "%{description}" 嗎?'
|
||||||
|
deleted_success: 動作已成功刪除。
|
||||||
|
edit_action: 編輯動作
|
||||||
|
delete_action: 刪除動作
|
||||||
|
mark_complete: 標記完成
|
||||||
|
due: 到期
|
||||||
|
context: 情境
|
||||||
|
project: 專案
|
||||||
|
tags: 標籤 (用逗號分隔)
|
||||||
|
notes: 備註
|
||||||
|
show_from: 顯示開始時間
|
||||||
|
completed: 已完成
|
||||||
|
no_actions:
|
||||||
|
not_done: 目前沒有未完成動作
|
||||||
|
completed: 目前沒有已完成動作
|
||||||
|
title: 找不到動作
|
||||||
|
contexts:
|
||||||
|
add_context: 新增情境
|
||||||
|
context_name: 情境名稱
|
||||||
|
save_status_message: 情境已儲存
|
||||||
|
delete_context: 刪除情境
|
||||||
|
delete_context_confirmation: '您確定要刪除情境 "%{name}" 嗎?請注意,這也會刪除此情境中的所有(重複)動作!'
|
||||||
|
context_deleted: '已刪除情境 "%{name}"'
|
||||||
|
edit_context: 編輯情境
|
||||||
|
show_form: 建立新情境
|
||||||
|
hide_form: 隱藏表單
|
||||||
|
projects:
|
||||||
|
add_project: 新增專案
|
||||||
|
project_saved_status: 專案已儲存
|
||||||
|
delete_project: 刪除專案
|
||||||
|
delete_project_confirmation: '您確定要刪除專案 "%{name}" 嗎?'
|
||||||
|
project_destroyed_status: '已刪除專案 "%{name}"'
|
||||||
|
edit_project_title: 編輯專案
|
||||||
|
show_form: 新增專案
|
||||||
|
hide_form: 隱藏表單
|
||||||
|
notes: 備註
|
||||||
|
add_note: 新增備註
|
||||||
|
add_note_submit: 新增備註
|
||||||
|
settings: 設定
|
||||||
|
preferences:
|
||||||
|
title: 您的偏好設定
|
||||||
|
edit_preferences: 編輯偏好設定
|
||||||
|
updated: 偏好設定已更新
|
||||||
|
tabs:
|
||||||
|
profile: 個人檔案
|
||||||
|
authentication: 驗證
|
||||||
|
date_and_time: 日期和時間
|
||||||
|
tracks_behavior: Tracks 行為
|
||||||
|
remove_account: 移除帳戶
|
||||||
|
help:
|
||||||
|
title: 說明
|
||||||
|
usage: '您可以在專案 GitHub wiki 的 %{manual_link} 中找到使用資訊。'
|
||||||
|
manual_link_text: 使用手冊
|
||||||
|
bugs: '如果您遇到錯誤或有功能請求,請在 %{issue_link} 中回報。'
|
||||||
|
issue_link_text: 問題佇列
|
||||||
|
date:
|
||||||
|
abbr_day_names:
|
||||||
|
- 日
|
||||||
|
- 一
|
||||||
|
- 二
|
||||||
|
- 三
|
||||||
|
- 四
|
||||||
|
- 五
|
||||||
|
- 六
|
||||||
|
day_names:
|
||||||
|
- 星期日
|
||||||
|
- 星期一
|
||||||
|
- 星期二
|
||||||
|
- 星期三
|
||||||
|
- 星期四
|
||||||
|
- 星期五
|
||||||
|
- 星期六
|
||||||
|
abbr_month_names:
|
||||||
|
-
|
||||||
|
- 1月
|
||||||
|
- 2月
|
||||||
|
- 3月
|
||||||
|
- 4月
|
||||||
|
- 5月
|
||||||
|
- 6月
|
||||||
|
- 7月
|
||||||
|
- 8月
|
||||||
|
- 9月
|
||||||
|
- 10月
|
||||||
|
- 11月
|
||||||
|
- 12月
|
||||||
|
month_names:
|
||||||
|
-
|
||||||
|
- 一月
|
||||||
|
- 二月
|
||||||
|
- 三月
|
||||||
|
- 四月
|
||||||
|
- 五月
|
||||||
|
- 六月
|
||||||
|
- 七月
|
||||||
|
- 八月
|
||||||
|
- 九月
|
||||||
|
- 十月
|
||||||
|
- 十一月
|
||||||
|
- 十二月
|
||||||
|
formats:
|
||||||
|
default: "%Y-%m-%d"
|
||||||
|
long: "%Y年%m月%d日"
|
||||||
|
short: "%m月%d日"
|
||||||
|
order:
|
||||||
|
- :year
|
||||||
|
- :month
|
||||||
|
- :day
|
||||||
|
time:
|
||||||
|
am: 上午
|
||||||
|
pm: 下午
|
||||||
|
formats:
|
||||||
|
default: "%a, %d %b %Y %H:%M:%S %z"
|
||||||
|
long: "%Y年%m月%d日 %H:%M"
|
||||||
|
short: "%m月%d日 %H:%M"
|
||||||
|
number:
|
||||||
|
format:
|
||||||
|
delimiter: ","
|
||||||
|
separator: "."
|
||||||
|
currency:
|
||||||
|
format:
|
||||||
|
unit: "$"
|
||||||
|
delimiter: ","
|
||||||
|
separator: "."
|
||||||
|
format: "%u%n"
|
||||||
|
errors:
|
||||||
|
format: "%{attribute} %{message}"
|
||||||
|
messages:
|
||||||
|
accepted: 必須被接受
|
||||||
|
blank: 不能為空
|
||||||
|
confirmation: '與 %{attribute} 不符'
|
||||||
|
empty: 不能為空
|
||||||
|
equal_to: '必須等於 %{count}'
|
||||||
|
even: 必須為偶數
|
||||||
|
exclusion: 被保留使用
|
||||||
|
greater_than: '必須大於 %{count}'
|
||||||
|
greater_than_or_equal_to: '必須大於或等於 %{count}'
|
||||||
|
inclusion: 不在清單中
|
||||||
|
invalid: 無效
|
||||||
|
less_than: '必須小於 %{count}'
|
||||||
|
less_than_or_equal_to: '必須小於或等於 %{count}'
|
||||||
|
not_a_number: 不是數字
|
||||||
|
not_an_integer: 必須是整數
|
||||||
|
odd: 必須為奇數
|
||||||
|
other_than: '必須不同於 %{count}'
|
||||||
|
present: 必須為空白
|
||||||
|
taken: 已被使用
|
||||||
|
too_long: '太長了 (最多 %{count} 個字元)'
|
||||||
|
too_short: '太短了 (最少 %{count} 個字元)'
|
||||||
|
wrong_length: '長度錯誤 (應為 %{count} 個字元)'
|
||||||
|
users:
|
||||||
|
signup: 註冊
|
||||||
|
signup_successful: '用戶 %{username} 註冊成功。'
|
||||||
|
create_error: 用戶建立失敗,也許您在這裡已經有帳戶?
|
||||||
|
user_created: 用戶已建立。
|
||||||
|
choose_password: 選擇密碼
|
||||||
|
confirm_password: 確認密碼
|
||||||
|
email_address: 電子郵件地址
|
||||||
|
change_password: 變更您的密碼
|
||||||
|
password_updated: 密碼已更新。
|
78
db/schema.rb
78
db/schema.rb
|
@ -2,30 +2,33 @@
|
||||||
# of editing this file, please use the migrations feature of Active Record to
|
# of editing this file, please use the migrations feature of Active Record to
|
||||||
# incrementally modify your database, and then regenerate this schema definition.
|
# incrementally modify your database, and then regenerate this schema definition.
|
||||||
#
|
#
|
||||||
# Note that this schema.rb definition is the authoritative source for your
|
# This file is the source Rails uses to define your schema when running `bin/rails
|
||||||
# database schema. If you need to create the application database on another
|
# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
|
||||||
# system, you should be using db:schema:load, not running all the migrations
|
# be faster and is potentially less error prone than running all of your
|
||||||
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
# migrations from scratch. Old migrations may fail to apply correctly if those
|
||||||
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
# migrations use external dependencies or application code.
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
|
|
||||||
create_table "attachments", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
# These are extensions that must be enabled in order to support this database
|
||||||
t.integer "todo_id"
|
enable_extension "plpgsql"
|
||||||
|
|
||||||
|
create_table "attachments", force: :cascade do |t|
|
||||||
|
t.bigint "todo_id"
|
||||||
t.string "file_file_name"
|
t.string "file_file_name"
|
||||||
t.string "file_content_type"
|
t.string "file_content_type"
|
||||||
t.integer "file_file_size"
|
t.bigint "file_file_size"
|
||||||
t.datetime "file_updated_at"
|
t.datetime "file_updated_at"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at", null: false
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at", null: false
|
||||||
t.index ["todo_id"], name: "index_attachments_on_todo_id"
|
t.index ["todo_id"], name: "index_attachments_on_todo_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "contexts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "contexts", force: :cascade do |t|
|
||||||
t.string "name", null: false
|
t.string "name", null: false
|
||||||
t.integer "position", default: 0
|
t.integer "position"
|
||||||
t.integer "user_id", default: 1
|
t.integer "user_id", default: 1
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
|
@ -34,7 +37,7 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["user_id"], name: "index_contexts_on_user_id"
|
t.index ["user_id"], name: "index_contexts_on_user_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "dependencies", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "dependencies", force: :cascade do |t|
|
||||||
t.integer "successor_id", null: false
|
t.integer "successor_id", null: false
|
||||||
t.integer "predecessor_id", null: false
|
t.integer "predecessor_id", null: false
|
||||||
t.string "relationship_type"
|
t.string "relationship_type"
|
||||||
|
@ -42,7 +45,7 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["successor_id"], name: "index_dependencies_on_successor_id"
|
t.index ["successor_id"], name: "index_dependencies_on_successor_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "notes", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "notes", force: :cascade do |t|
|
||||||
t.integer "user_id", null: false
|
t.integer "user_id", null: false
|
||||||
t.integer "project_id", null: false
|
t.integer "project_id", null: false
|
||||||
t.text "body"
|
t.text "body"
|
||||||
|
@ -52,7 +55,7 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["user_id"], name: "index_notes_on_user_id"
|
t.index ["user_id"], name: "index_notes_on_user_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "open_id_authentication_associations", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "open_id_authentication_associations", force: :cascade do |t|
|
||||||
t.integer "issued"
|
t.integer "issued"
|
||||||
t.integer "lifetime"
|
t.integer "lifetime"
|
||||||
t.string "handle"
|
t.string "handle"
|
||||||
|
@ -61,13 +64,13 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.binary "secret"
|
t.binary "secret"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "open_id_authentication_nonces", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "open_id_authentication_nonces", force: :cascade do |t|
|
||||||
t.integer "timestamp", null: false
|
t.integer "timestamp", null: false
|
||||||
t.string "server_url"
|
t.string "server_url"
|
||||||
t.string "salt", null: false
|
t.string "salt", null: false
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "preferences", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "preferences", force: :cascade do |t|
|
||||||
t.integer "user_id", null: false
|
t.integer "user_id", null: false
|
||||||
t.string "date_format", limit: 40, default: "%d/%m/%Y", null: false
|
t.string "date_format", limit: 40, default: "%d/%m/%Y", null: false
|
||||||
t.integer "week_starts", default: 0, null: false
|
t.integer "week_starts", default: 0, null: false
|
||||||
|
@ -79,9 +82,9 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.integer "refresh", default: 0, null: false
|
t.integer "refresh", default: 0, null: false
|
||||||
t.boolean "verbose_action_descriptors", default: false, null: false
|
t.boolean "verbose_action_descriptors", default: false, null: false
|
||||||
t.boolean "show_hidden_projects_in_sidebar", default: true, null: false
|
t.boolean "show_hidden_projects_in_sidebar", default: true, null: false
|
||||||
t.string "time_zone", default: "London", null: false
|
t.string "time_zone", limit: 255, default: "London", null: false
|
||||||
t.boolean "show_project_on_todo_done", default: false, null: false
|
t.boolean "show_project_on_todo_done", default: false, null: false
|
||||||
t.string "title_date_format", default: "%A, %d %B %Y", null: false
|
t.string "title_date_format", limit: 255, default: "%A, %d %B %Y", null: false
|
||||||
t.integer "mobile_todos_per_page", default: 6, null: false
|
t.integer "mobile_todos_per_page", default: 6, null: false
|
||||||
t.string "sms_email"
|
t.string "sms_email"
|
||||||
t.integer "sms_context_id"
|
t.integer "sms_context_id"
|
||||||
|
@ -91,11 +94,11 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["user_id"], name: "index_preferences_on_user_id"
|
t.index ["user_id"], name: "index_preferences_on_user_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "projects", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "projects", force: :cascade do |t|
|
||||||
t.string "name", null: false
|
t.string "name", null: false
|
||||||
t.integer "position", default: 0
|
t.integer "position"
|
||||||
t.integer "user_id", default: 1
|
t.integer "user_id", default: 1
|
||||||
t.text "description", limit: 16777215
|
t.text "description"
|
||||||
t.string "state", limit: 20, null: false
|
t.string "state", limit: 20, null: false
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
|
@ -109,12 +112,12 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["user_id"], name: "index_projects_on_user_id"
|
t.index ["user_id"], name: "index_projects_on_user_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "recurring_todos", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "recurring_todos", force: :cascade do |t|
|
||||||
t.integer "user_id", default: 1
|
t.integer "user_id", default: 1
|
||||||
t.integer "context_id", null: false
|
t.integer "context_id", null: false
|
||||||
t.integer "project_id"
|
t.integer "project_id"
|
||||||
t.string "description", null: false
|
t.string "description", null: false
|
||||||
t.text "notes", limit: 16777215
|
t.text "notes"
|
||||||
t.string "state", limit: 20, null: false
|
t.string "state", limit: 20, null: false
|
||||||
t.datetime "start_from"
|
t.datetime "start_from"
|
||||||
t.string "ends_on"
|
t.string "ends_on"
|
||||||
|
@ -133,21 +136,21 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.integer "every_count"
|
t.integer "every_count"
|
||||||
t.integer "weekday"
|
t.integer "weekday"
|
||||||
t.datetime "completed_at"
|
t.datetime "completed_at"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at", null: false
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at", null: false
|
||||||
t.boolean "show_always"
|
t.boolean "show_always"
|
||||||
t.index ["state"], name: "index_recurring_todos_on_state"
|
t.index ["state"], name: "index_recurring_todos_on_state"
|
||||||
t.index ["user_id"], name: "index_recurring_todos_on_user_id"
|
t.index ["user_id"], name: "index_recurring_todos_on_user_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "sessions", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "sessions", force: :cascade do |t|
|
||||||
t.string "session_id"
|
t.string "session_id"
|
||||||
t.text "data"
|
t.text "data"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.index ["session_id"], name: "sessions_session_id_index"
|
t.index ["session_id"], name: "index_sessions_on_session_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "taggings", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "taggings", force: :cascade do |t|
|
||||||
t.integer "taggable_id"
|
t.integer "taggable_id"
|
||||||
t.integer "tag_id"
|
t.integer "tag_id"
|
||||||
t.string "taggable_type"
|
t.string "taggable_type"
|
||||||
|
@ -156,7 +159,7 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["taggable_id", "taggable_type"], name: "index_taggings_on_taggable_id_and_taggable_type"
|
t.index ["taggable_id", "taggable_type"], name: "index_taggings_on_taggable_id_and_taggable_type"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "tags", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "tags", force: :cascade do |t|
|
||||||
t.string "name"
|
t.string "name"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
|
@ -164,11 +167,11 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["name"], name: "index_tags_on_name"
|
t.index ["name"], name: "index_tags_on_name"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "todos", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "todos", force: :cascade do |t|
|
||||||
t.integer "context_id", null: false
|
t.integer "context_id", null: false
|
||||||
t.integer "project_id"
|
t.integer "project_id"
|
||||||
t.text "description", null: false
|
t.text "description", null: false
|
||||||
t.text "notes", limit: 16777215
|
t.text "notes"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "due"
|
t.datetime "due"
|
||||||
t.datetime "completed_at"
|
t.datetime "completed_at"
|
||||||
|
@ -177,7 +180,6 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.string "state", limit: 20, null: false
|
t.string "state", limit: 20, null: false
|
||||||
t.integer "recurring_todo_id"
|
t.integer "recurring_todo_id"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.text "rendered_notes", limit: 16777215
|
|
||||||
t.index ["context_id"], name: "index_todos_on_context_id"
|
t.index ["context_id"], name: "index_todos_on_context_id"
|
||||||
t.index ["project_id"], name: "index_todos_on_project_id"
|
t.index ["project_id"], name: "index_todos_on_project_id"
|
||||||
t.index ["state"], name: "index_todos_on_state"
|
t.index ["state"], name: "index_todos_on_state"
|
||||||
|
@ -186,20 +188,20 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["user_id", "state"], name: "index_todos_on_user_id_and_state"
|
t.index ["user_id", "state"], name: "index_todos_on_user_id_and_state"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "tolk_locales", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "tolk_locales", force: :cascade do |t|
|
||||||
t.string "name"
|
t.string "name"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.index ["name"], name: "index_tolk_locales_on_name", unique: true
|
t.index ["name"], name: "index_tolk_locales_on_name", unique: true
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "tolk_phrases", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "tolk_phrases", force: :cascade do |t|
|
||||||
t.text "key"
|
t.text "key"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "tolk_translations", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "tolk_translations", force: :cascade do |t|
|
||||||
t.integer "phrase_id"
|
t.integer "phrase_id"
|
||||||
t.integer "locale_id"
|
t.integer "locale_id"
|
||||||
t.text "text"
|
t.text "text"
|
||||||
|
@ -210,9 +212,9 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["phrase_id", "locale_id"], name: "index_tolk_translations_on_phrase_id_and_locale_id", unique: true
|
t.index ["phrase_id", "locale_id"], name: "index_tolk_translations_on_phrase_id_and_locale_id", unique: true
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "users", force: :cascade do |t|
|
||||||
t.string "login", limit: 80, null: false
|
t.string "login", limit: 80, null: false
|
||||||
t.string "crypted_password", limit: 60
|
t.string "crypted_password", limit: 60, null: false
|
||||||
t.string "token"
|
t.string "token"
|
||||||
t.boolean "is_admin", default: false, null: false
|
t.boolean "is_admin", default: false, null: false
|
||||||
t.string "first_name"
|
t.string "first_name"
|
||||||
|
|
|
@ -1,5 +1,40 @@
|
||||||
See doc/upgrading.md for the upgrade documentation!
|
See doc/upgrading.md for the upgrade documentation!
|
||||||
|
|
||||||
|
## Version 2.7.1
|
||||||
|
|
||||||
|
### Security advisory CVE-2024-41805 (severity 6.1 / moderate)
|
||||||
|
|
||||||
|
This release fixes a few reflected XSS vulnerabilities which enabled execution
|
||||||
|
of malicious JavaScript in the context of a user’s browser if that user clicks
|
||||||
|
on a malicious link, possibly allowing retrieval or modification of the current
|
||||||
|
user's data. The issue is of moderate severity (score 6.1/10) with the CVSS
|
||||||
|
rating CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N.
|
||||||
|
|
||||||
|
I want to thank Alec Romano for reporting the issues.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
* The test suite now uses always the same Dockerfile as the main build.
|
||||||
|
* The Dockerfile now supports environment-specific builds via stages.
|
||||||
|
Note: This requires slight changes to docker build commands, see documentation!
|
||||||
|
|
||||||
|
### Deprecations
|
||||||
|
|
||||||
|
* This will be the last release to support Ruby 3.0, which is already end-of-life.
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
* Lots of dependencies have been updated (including security updates).
|
||||||
|
* Fixed Docker build not working on an archive version (ie. one not cloned with Git)
|
||||||
|
* An error is shown if the user being created already exists.
|
||||||
|
* The TOS error in user creation is now in template.
|
||||||
|
* Schema.rb has been updated for Postgres support.
|
||||||
|
|
||||||
|
### Updated translations
|
||||||
|
|
||||||
|
* Spanish (thanks Gallegonovato!)
|
||||||
|
* Finnish (by maintainer Jyri-Petteri ”ZeiP” Paloposki)
|
||||||
|
|
||||||
## Version 2.7
|
## Version 2.7
|
||||||
|
|
||||||
### Removed features
|
### Removed features
|
||||||
|
|
|
@ -44,7 +44,7 @@ Tracks container. In future there should be an official image in Docker Hub. You
|
||||||
1. Get the Tracks code base by either downloading the archive file for the latest releast or cloning it from GitHub.
|
1. Get the Tracks code base by either downloading the archive file for the latest releast or cloning it from GitHub.
|
||||||
2. Run the following command in the Tracks directory to build the image:
|
2. Run the following command in the Tracks directory to build the image:
|
||||||
```
|
```
|
||||||
$ docker build -t="tracks" .
|
$ docker build -t="tracks" --target=production .
|
||||||
```
|
```
|
||||||
|
|
||||||
1. Make sure you have Docker properly installed.
|
1. Make sure you have Docker properly installed.
|
||||||
|
@ -142,7 +142,7 @@ You need to create a database and database-user to use with Tracks. For this, yo
|
||||||
#### PostgreSQL
|
#### PostgreSQL
|
||||||
|
|
||||||
$ sudo -u postgres psql
|
$ sudo -u postgres psql
|
||||||
postgres=# CREATE USER tracks WITH ENCRYPTED PASSWORD 'password-goes-here';
|
postgres=# CREATE ROLE tracks WITH LOGIN NOSUPERUSER INHERIT CREATEDB CREATEROLE NOREPLICATION PASSWORD 'password-goes-here';
|
||||||
postgres=# CREATE DATABASE tracks OWNER=tracks;
|
postgres=# CREATE DATABASE tracks OWNER=tracks;
|
||||||
|
|
||||||
### Install dependencies
|
### Install dependencies
|
||||||
|
@ -153,13 +153,22 @@ Tracks is built upon a number of Ruby libraries (known as ‘gems’). The Bundl
|
||||||
* If you are using SQLite:
|
* If you are using SQLite:
|
||||||
|
|
||||||
```
|
```
|
||||||
bundle install --without "development test mysql"
|
bundle config set without mysql postgresql
|
||||||
|
bundle install
|
||||||
```
|
```
|
||||||
|
|
||||||
* If you are using MySQL:
|
* If you are using MySQL:
|
||||||
|
|
||||||
```
|
```
|
||||||
bundle install --without "development test sqlite"
|
bundle config set without sqlite postgresql
|
||||||
|
bundle install
|
||||||
|
```
|
||||||
|
|
||||||
|
* If you are using PostgreSQL:
|
||||||
|
|
||||||
|
```
|
||||||
|
bundle config set without sqlite mysql
|
||||||
|
bundle install
|
||||||
```
|
```
|
||||||
|
|
||||||
* If you are installing Tracks on Windows or Mac OS X, or if you have another JavaScript runtime such as Node.js installed, you may also append `therubyracer` as an additional "without" parameter.
|
* If you are installing Tracks on Windows or Mac OS X, or if you have another JavaScript runtime such as Node.js installed, you may also append `therubyracer` as an additional "without" parameter.
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
version: '3'
|
version: '3'
|
||||||
services:
|
services:
|
||||||
db:
|
db:
|
||||||
image: mysql:5.7
|
image: mariadb:lts
|
||||||
environment:
|
environment:
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: 1
|
MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: 1
|
||||||
MYSQL_DATABASE: ${TRACKS_DB:-tracks}
|
MARIADB_DATABASE: ${TRACKS_DB:-tracks}
|
||||||
volumes:
|
volumes:
|
||||||
- db-data:/var/lib/mysql
|
- db-data:/var/lib/mysql
|
||||||
web:
|
web:
|
||||||
build: .
|
build:
|
||||||
|
context: .
|
||||||
|
target: production # can also be development or test
|
||||||
environment:
|
environment:
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
# These are set in script/ci-build, so we need to pass-thru them.
|
||||||
RAILS_ENV: $RAILS_ENV
|
RAILS_ENV: $RAILS_ENV
|
||||||
|
|
|
@ -2,7 +2,9 @@
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
docker_compose="docker-compose --file test-envs/docker-compose-$1-$2.yml"
|
export RUBY_VERSION=$1
|
||||||
|
|
||||||
|
docker_compose="docker compose --file test-envs/docker-compose-$2.yml"
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
$docker_compose down
|
$docker_compose down
|
||||||
|
@ -20,7 +22,7 @@ export DATABASE_NAME=tracks_test
|
||||||
|
|
||||||
$docker_compose build
|
$docker_compose build
|
||||||
$docker_compose up -d
|
$docker_compose up -d
|
||||||
script/poll-for-db
|
script/poll-for-db $2
|
||||||
|
|
||||||
# Leaving this in since it will be needed for Rails 5
|
# Leaving this in since it will be needed for Rails 5
|
||||||
$docker_compose run web bin/rails db:environment:set RAILS_ENV=test || true
|
$docker_compose run web bin/rails db:environment:set RAILS_ENV=test || true
|
||||||
|
@ -32,5 +34,5 @@ else
|
||||||
$docker_compose run web bin/rake db:migrate
|
$docker_compose run web bin/rake db:migrate
|
||||||
$docker_compose run web bin/rake db:seed
|
$docker_compose run web bin/rake db:seed
|
||||||
fi
|
fi
|
||||||
$docker_compose run web bin/rake test
|
echo "==> Running the tests…"
|
||||||
|
$docker_compose run web bin/rails test
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
docker_compose="docker-compose --file docker-compose.yml"
|
docker_compose="docker compose --file docker-compose.yml"
|
||||||
|
|
||||||
# Find our app dir
|
# Find our app dir
|
||||||
appdir=$(cd $(dirname "$0")/.. && pwd)
|
appdir=$(cd $(dirname "$0")/.. && pwd)
|
||||||
|
|
|
@ -2,13 +2,16 @@
|
||||||
|
|
||||||
echo "==> Polling DB…"
|
echo "==> Polling DB…"
|
||||||
|
|
||||||
|
if [ -z "$1" ] || [ "$1" == "mysql" ]; then
|
||||||
appdir=$(cd $(dirname "$0")/.. && pwd)
|
appdir=$(cd $(dirname "$0")/.. && pwd)
|
||||||
[ -f /etc/app-env ] || exec "$appdir/script/docker-environment" $0 $@
|
[ -f /etc/app-env ] || exec "$appdir/script/docker-environment" $0 $@
|
||||||
|
|
||||||
for i in {1..60}; do
|
for i in {1..60}; do
|
||||||
|
echo "... Checking for connection"
|
||||||
nc -z -w5 db 3306 && exit
|
nc -z -w5 db 3306 && exit
|
||||||
sleep 1
|
sleep 1
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "Unable to reach database!"
|
echo "Unable to reach database!"
|
||||||
exit 1
|
exit 1
|
||||||
|
fi
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
db:
|
|
||||||
image: mysql:5.7
|
|
||||||
environment:
|
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: 1
|
|
||||||
MYSQL_DATABASE: ${TRACKS_DB:-tracks}
|
|
||||||
volumes:
|
|
||||||
- db-data:/var/lib/mysql
|
|
||||||
web:
|
|
||||||
build:
|
|
||||||
context: ..
|
|
||||||
dockerfile: Dockerfile-3.0
|
|
||||||
environment:
|
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
|
||||||
RAILS_ENV: $RAILS_ENV
|
|
||||||
DATABASE_NAME: $DATABASE_NAME
|
|
||||||
DATABASE_USERNAME: root
|
|
||||||
DATABASE_PASSWORD_EMPTY: 1
|
|
||||||
volumes:
|
|
||||||
- ${VOLUME:-..}:/app:Z
|
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
|
||||||
ports:
|
|
||||||
- 3000:3000
|
|
||||||
depends_on:
|
|
||||||
- db
|
|
||||||
volumes:
|
|
||||||
db-data:
|
|
|
@ -1,32 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
db:
|
|
||||||
image: postgres:13
|
|
||||||
environment:
|
|
||||||
POSTGRES_DB: ${DATABASE_NAME:-tracks}
|
|
||||||
POSTGRES_PASSWORD: password
|
|
||||||
volumes:
|
|
||||||
- db-data:/var/lib/postgresql/data
|
|
||||||
web:
|
|
||||||
build:
|
|
||||||
context: ..
|
|
||||||
dockerfile: Dockerfile-3.0
|
|
||||||
environment:
|
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
|
||||||
RAILS_ENV: $RAILS_ENV
|
|
||||||
DATABASE_NAME: $DATABASE_NAME
|
|
||||||
DATABASE_USERNAME: postgres
|
|
||||||
DATABASE_PASSWORD: password
|
|
||||||
DATABASE_TYPE: postgresql
|
|
||||||
DATABASE_ENCODING: unicode
|
|
||||||
DATABASE_PORT: 5432
|
|
||||||
volumes:
|
|
||||||
- ${VOLUME:-..}:/app:Z
|
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
|
||||||
ports:
|
|
||||||
- 3000:3000
|
|
||||||
depends_on:
|
|
||||||
- db
|
|
||||||
volumes:
|
|
||||||
db-data:
|
|
|
@ -1,29 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
db:
|
|
||||||
image: mysql:5.7
|
|
||||||
environment:
|
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: 1
|
|
||||||
MYSQL_DATABASE: ${TRACKS_DB:-tracks}
|
|
||||||
volumes:
|
|
||||||
- db-data:/var/lib/mysql
|
|
||||||
web:
|
|
||||||
build:
|
|
||||||
context: ..
|
|
||||||
dockerfile: Dockerfile-3.1
|
|
||||||
environment:
|
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
|
||||||
RAILS_ENV: $RAILS_ENV
|
|
||||||
DATABASE_NAME: $DATABASE_NAME
|
|
||||||
DATABASE_USERNAME: root
|
|
||||||
DATABASE_PASSWORD_EMPTY: 1
|
|
||||||
volumes:
|
|
||||||
- ${VOLUME:-..}:/app:Z
|
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
|
||||||
ports:
|
|
||||||
- 3000:3000
|
|
||||||
depends_on:
|
|
||||||
- db
|
|
||||||
volumes:
|
|
||||||
db-data:
|
|
|
@ -1,29 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
db:
|
|
||||||
image: mysql:5.7
|
|
||||||
environment:
|
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: 1
|
|
||||||
MYSQL_DATABASE: ${TRACKS_DB:-tracks}
|
|
||||||
volumes:
|
|
||||||
- db-data:/var/lib/mysql
|
|
||||||
web:
|
|
||||||
build:
|
|
||||||
context: ..
|
|
||||||
dockerfile: Dockerfile-3.2
|
|
||||||
environment:
|
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
|
||||||
RAILS_ENV: $RAILS_ENV
|
|
||||||
DATABASE_NAME: $DATABASE_NAME
|
|
||||||
DATABASE_USERNAME: root
|
|
||||||
DATABASE_PASSWORD_EMPTY: 1
|
|
||||||
volumes:
|
|
||||||
- ${VOLUME:-..}:/app:Z
|
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
|
||||||
ports:
|
|
||||||
- 3000:3000
|
|
||||||
depends_on:
|
|
||||||
- db
|
|
||||||
volumes:
|
|
||||||
db-data:
|
|
|
@ -1,17 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
web:
|
|
||||||
build:
|
|
||||||
context: ..
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
environment:
|
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
|
||||||
RAILS_ENV: $RAILS_ENV
|
|
||||||
DATABASE_NAME: "/app/db.sqlite"
|
|
||||||
DATABASE_TYPE: sqlite3
|
|
||||||
volumes:
|
|
||||||
- ${VOLUME:-..}:/app:Z
|
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
|
||||||
ports:
|
|
||||||
- 3000:3000
|
|
|
@ -1,29 +1,25 @@
|
||||||
version: '3'
|
|
||||||
services:
|
services:
|
||||||
db:
|
db:
|
||||||
image: mysql:5.7
|
image: mariadb:lts
|
||||||
environment:
|
environment:
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: 1
|
MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: 1
|
||||||
MYSQL_DATABASE: ${TRACKS_DB:-tracks}
|
MARIADB_DATABASE: ${TRACKS_DB:-tracks}
|
||||||
volumes:
|
|
||||||
- db-data:/var/lib/mysql
|
|
||||||
web:
|
web:
|
||||||
build:
|
build:
|
||||||
context: ..
|
context: ..
|
||||||
dockerfile: Dockerfile
|
target: test
|
||||||
|
args:
|
||||||
|
RUBY_VERSION: ${RUBY_VERSION}
|
||||||
environment:
|
environment:
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
# These are set in script/cibuild, so we need to pass-thru them.
|
||||||
RAILS_ENV: $RAILS_ENV
|
RAILS_ENV: $RAILS_ENV
|
||||||
DATABASE_NAME: $DATABASE_NAME
|
DATABASE_NAME: $DATABASE_NAME
|
||||||
DATABASE_USERNAME: root
|
DATABASE_USERNAME: root
|
||||||
DATABASE_PASSWORD_EMPTY: 1
|
DATABASE_PASSWORD_EMPTY: 1
|
||||||
volumes:
|
volumes:
|
||||||
- ${VOLUME:-..}:/app:Z
|
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
volumes:
|
|
||||||
db-data:
|
|
|
@ -1,18 +1,17 @@
|
||||||
version: '3'
|
|
||||||
services:
|
services:
|
||||||
db:
|
db:
|
||||||
image: postgres:13
|
image: postgres:13
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_DB: ${DATABASE_NAME:-tracks}
|
POSTGRES_DB: ${DATABASE_NAME:-tracks}
|
||||||
POSTGRES_PASSWORD: password
|
POSTGRES_PASSWORD: password
|
||||||
volumes:
|
|
||||||
- db-data:/var/lib/postgresql/data
|
|
||||||
web:
|
web:
|
||||||
build:
|
build:
|
||||||
context: ..
|
context: ..
|
||||||
dockerfile: Dockerfile
|
target: test
|
||||||
|
args:
|
||||||
|
RUBY_VERSION: ${RUBY_VERSION}
|
||||||
environment:
|
environment:
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
# These are set in script/cibuild, so we need to pass-thru them.
|
||||||
RAILS_ENV: $RAILS_ENV
|
RAILS_ENV: $RAILS_ENV
|
||||||
DATABASE_NAME: $DATABASE_NAME
|
DATABASE_NAME: $DATABASE_NAME
|
||||||
DATABASE_USERNAME: postgres
|
DATABASE_USERNAME: postgres
|
||||||
|
@ -21,12 +20,9 @@ services:
|
||||||
DATABASE_ENCODING: unicode
|
DATABASE_ENCODING: unicode
|
||||||
DATABASE_PORT: 5432
|
DATABASE_PORT: 5432
|
||||||
volumes:
|
volumes:
|
||||||
- ${VOLUME:-..}:/app:Z
|
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
volumes:
|
|
||||||
db-data:
|
|
|
@ -1,17 +1,20 @@
|
||||||
version: '3'
|
|
||||||
services:
|
services:
|
||||||
web:
|
web:
|
||||||
build:
|
build:
|
||||||
context: ..
|
context: ..
|
||||||
dockerfile: Dockerfile-3.0
|
target: test
|
||||||
|
args:
|
||||||
|
RUBY_VERSION: ${RUBY_VERSION}
|
||||||
environment:
|
environment:
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
# These are set in script/cibuild, so we need to pass-thru them.
|
||||||
RAILS_ENV: $RAILS_ENV
|
RAILS_ENV: $RAILS_ENV
|
||||||
DATABASE_NAME: "/app/db.sqlite"
|
DATABASE_NAME: "/app/db/db.sqlite"
|
||||||
DATABASE_TYPE: sqlite3
|
DATABASE_TYPE: sqlite3
|
||||||
volumes:
|
volumes:
|
||||||
- ${VOLUME:-..}:/app:Z
|
- sqlite:/app/db:Z
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
|
volumes:
|
||||||
|
sqlite: {}
|
|
@ -124,7 +124,7 @@ class ContextsControllerTest < ActionController::TestCase
|
||||||
%w(guid link).each do |node|
|
%w(guid link).each do |node|
|
||||||
assert_select node, /http:\/\/test.host\/contexts\/.+/
|
assert_select node, /http:\/\/test.host\/contexts\/.+/
|
||||||
end
|
end
|
||||||
assert_select 'pubDate', contexts(:agenda).created_at.to_s(:rfc822)
|
assert_select 'pubDate', contexts(:agenda).created_at.to_formatted_s(:rfc822)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -102,7 +102,7 @@ class ProjectsControllerTest < ActionController::TestCase
|
||||||
%w(guid link).each do |node|
|
%w(guid link).each do |node|
|
||||||
assert_select node, /http:\/\/test.host\/projects\/.+/
|
assert_select node, /http:\/\/test.host\/projects\/.+/
|
||||||
end
|
end
|
||||||
assert_select 'pubDate', projects(:timemachine).updated_at.to_s(:rfc822)
|
assert_select 'pubDate', projects(:timemachine).updated_at.to_formatted_s(:rfc822)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -403,7 +403,7 @@ class TodosControllerTest < ActionController::TestCase
|
||||||
assert_equal "bar, foo", t.tag_list
|
assert_equal "bar, foo", t.tag_list
|
||||||
expected = Date.new(2006,11,30)
|
expected = Date.new(2006,11,30)
|
||||||
actual = t.due.to_date
|
actual = t.due.to_date
|
||||||
assert_equal expected, actual, "Expected #{expected.to_s(:db)}, was #{actual.to_s(:db)}"
|
assert_equal expected, actual, "Expected #{expected.to_formatted_s(:db)}, was #{actual.to_formatted_s(:db)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_update_todos_with_blank_project_name
|
def test_update_todos_with_blank_project_name
|
||||||
|
@ -551,7 +551,7 @@ class TodosControllerTest < ActionController::TestCase
|
||||||
assert_select 'description', /.*/
|
assert_select 'description', /.*/
|
||||||
assert_select 'link', %r{http://test.host/contexts/.+}
|
assert_select 'link', %r{http://test.host/contexts/.+}
|
||||||
assert_select 'guid', %r{http://test.host/todos/.+}
|
assert_select 'guid', %r{http://test.host/todos/.+}
|
||||||
assert_select 'pubDate', todos(:call_bill_gates_every_day).created_at.to_s(:rfc822)
|
assert_select 'pubDate', todos(:call_bill_gates_every_day).created_at.to_formatted_s(:rfc822)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
2
test/fixtures/contexts.yml
vendored
2
test/fixtures/contexts.yml
vendored
|
@ -5,7 +5,7 @@
|
||||||
<%
|
<%
|
||||||
|
|
||||||
def today
|
def today
|
||||||
Time.zone.now.utc.to_s(:db)
|
Time.zone.now.utc.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
%>
|
%>
|
||||||
|
|
6
test/fixtures/notes.yml
vendored
6
test/fixtures/notes.yml
vendored
|
@ -4,15 +4,15 @@
|
||||||
# rails does automatically in models or controllers! Convert to utc manually!
|
# rails does automatically in models or controllers! Convert to utc manually!
|
||||||
<%
|
<%
|
||||||
def today
|
def today
|
||||||
Time.zone.now.utc.to_s(:db)
|
Time.zone.now.utc.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def next_week
|
def next_week
|
||||||
1.week.from_now.utc.to_s(:db)
|
1.week.from_now.utc.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def last_week
|
def last_week
|
||||||
1.week.ago.utc.to_s(:db)
|
1.week.ago.utc.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
%>
|
%>
|
||||||
|
|
||||||
|
|
6
test/fixtures/projects.yml
vendored
6
test/fixtures/projects.yml
vendored
|
@ -4,13 +4,13 @@
|
||||||
# rails does automatically in models or controllers! Convert to utc manually!
|
# rails does automatically in models or controllers! Convert to utc manually!
|
||||||
<%
|
<%
|
||||||
def today
|
def today
|
||||||
Time.zone.now.utc.beginning_of_day.to_s(:db)
|
Time.zone.now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
def yesterday
|
def yesterday
|
||||||
1.day.ago.utc.beginning_of_day.to_s(:db)
|
1.day.ago.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
def last_week
|
def last_week
|
||||||
1.week.ago.utc.beginning_of_day.to_s(:db)
|
1.week.ago.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
%>
|
%>
|
||||||
|
|
||||||
|
|
12
test/fixtures/recurring_todos.yml
vendored
12
test/fixtures/recurring_todos.yml
vendored
|
@ -3,27 +3,27 @@
|
||||||
|
|
||||||
<%
|
<%
|
||||||
def today
|
def today
|
||||||
Time.zone.now.utc.beginning_of_day.to_s(:db)
|
Time.zone.now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def next_week
|
def next_week
|
||||||
1.week.from_now.utc.beginning_of_day.to_s(:db)
|
1.week.from_now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def last_week
|
def last_week
|
||||||
1.week.ago.utc.beginning_of_day.to_s(:db)
|
1.week.ago.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def two_weeks_ago
|
def two_weeks_ago
|
||||||
2.weeks.ago.utc.beginning_of_day.to_s(:db)
|
2.weeks.ago.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def two_weeks_hence
|
def two_weeks_hence
|
||||||
2.weeks.from_now.utc.beginning_of_day.to_s(:db)
|
2.weeks.from_now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def way_back
|
def way_back
|
||||||
Time.zone.local(2008,1,1).utc.to_s(:db)
|
Time.zone.local(2008,1,1).utc.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
%>
|
%>
|
||||||
|
|
2
test/fixtures/tags.yml
vendored
2
test/fixtures/tags.yml
vendored
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
<%
|
<%
|
||||||
def today
|
def today
|
||||||
Time.zone.now.utc.beginning_of_day.to_s(:db)
|
Time.zone.now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
%>
|
%>
|
||||||
|
|
||||||
|
|
12
test/fixtures/todos.yml
vendored
12
test/fixtures/todos.yml
vendored
|
@ -8,27 +8,27 @@ def yesterday
|
||||||
Time.zone.now.utc.beginning_of_day - 1.day
|
Time.zone.now.utc.beginning_of_day - 1.day
|
||||||
end
|
end
|
||||||
def today
|
def today
|
||||||
Time.zone.now.utc.beginning_of_day.to_s(:db)
|
Time.zone.now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def tomorrow
|
def tomorrow
|
||||||
(Time.zone.now.utc.beginning_of_day + 1.day).to_s(:db)
|
(Time.zone.now.utc.beginning_of_day + 1.day).to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def next_week
|
def next_week
|
||||||
1.week.from_now.utc.beginning_of_day.to_s(:db)
|
1.week.from_now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def last_week
|
def last_week
|
||||||
1.week.ago.utc.beginning_of_day.to_s(:db)
|
1.week.ago.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def two_weeks_ago
|
def two_weeks_ago
|
||||||
2.weeks.ago.utc.beginning_of_day.to_s(:db)
|
2.weeks.ago.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def two_weeks_hence
|
def two_weeks_hence
|
||||||
2.weeks.from_now.utc.beginning_of_day.to_s(:db)
|
2.weeks.from_now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
%>
|
%>
|
||||||
|
|
|
@ -110,7 +110,7 @@ class RecurringTodoTest < ActiveSupport::TestCase
|
||||||
# every_day should return start_day if it is in the future
|
# every_day should return start_day if it is in the future
|
||||||
@every_day.start_from = @in_three_days
|
@every_day.start_from = @in_three_days
|
||||||
due_date = @every_day.get_due_date(nil)
|
due_date = @every_day.get_due_date(nil)
|
||||||
assert_equal @in_three_days.at_midnight.to_s(:db), due_date.to_s(:db)
|
assert_equal @in_three_days.at_midnight.to_formatted_s(:db), due_date.to_formatted_s(:db)
|
||||||
due_date = @every_day.get_due_date(@tomorrow)
|
due_date = @every_day.get_due_date(@tomorrow)
|
||||||
assert_equal @in_three_days.at_midnight, due_date
|
assert_equal @in_three_days.at_midnight, due_date
|
||||||
|
|
||||||
|
|
|
@ -122,8 +122,8 @@ module RecurringTodos
|
||||||
travel_to Time.zone.local(2013,1,1) do
|
travel_to Time.zone.local(2013,1,1) do
|
||||||
rt = create_recurring_todo
|
rt = create_recurring_todo
|
||||||
assert_equal Time.zone.parse("2013-01-01 00:00:00"), rt.send(:determine_start, nil), "no previous date, use today"
|
assert_equal Time.zone.parse("2013-01-01 00:00:00"), rt.send(:determine_start, nil), "no previous date, use today"
|
||||||
assert_equal Time.zone.parse("2013-01-01 00:00:00"), rt.send(:determine_start, nil, 1.day).to_s(:db), "no previous date, use today without offset"
|
assert_equal Time.zone.parse("2013-01-01 00:00:00"), rt.send(:determine_start, nil, 1.day).to_formatted_s(:db), "no previous date, use today without offset"
|
||||||
assert_equal Time.zone.parse("2013-01-02 00:00:00"), rt.send(:determine_start, Time.zone.now, 1.day).to_s(:db), "use previous date and offset"
|
assert_equal Time.zone.parse("2013-01-02 00:00:00"), rt.send(:determine_start, Time.zone.now, 1.day).to_formatted_s(:db), "use previous date and offset"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -131,14 +131,14 @@ module RecurringTodos
|
||||||
rt = create_recurring_todo
|
rt = create_recurring_todo
|
||||||
|
|
||||||
# march 2014 has 5 saturdays, the last will return the 5th
|
# march 2014 has 5 saturdays, the last will return the 5th
|
||||||
assert_equal Time.zone.parse("2014-03-01 00:00:00"), rt.send(:get_xth_day_of_month, 1, 6, 3, 2014).to_s(:db)
|
assert_equal Time.zone.parse("2014-03-01 00:00:00"), rt.send(:get_xth_day_of_month, 1, 6, 3, 2014).to_formatted_s(:db)
|
||||||
assert_equal Time.zone.parse("2014-03-22 00:00:00"), rt.send(:get_xth_day_of_month, 4, 6, 3, 2014).to_s(:db)
|
assert_equal Time.zone.parse("2014-03-22 00:00:00"), rt.send(:get_xth_day_of_month, 4, 6, 3, 2014).to_formatted_s(:db)
|
||||||
assert_equal Time.zone.parse("2014-03-29 00:00:00"), rt.send(:get_xth_day_of_month, 5, 6, 3, 2014).to_s(:db)
|
assert_equal Time.zone.parse("2014-03-29 00:00:00"), rt.send(:get_xth_day_of_month, 5, 6, 3, 2014).to_formatted_s(:db)
|
||||||
|
|
||||||
# march 2014 has 4 fridays, the last will return the 4th
|
# march 2014 has 4 fridays, the last will return the 4th
|
||||||
assert_equal Time.zone.parse("2014-03-07 00:00:00"), rt.send(:get_xth_day_of_month, 1, 5, 3, 2014).to_s(:db)
|
assert_equal Time.zone.parse("2014-03-07 00:00:00"), rt.send(:get_xth_day_of_month, 1, 5, 3, 2014).to_formatted_s(:db)
|
||||||
assert_equal Time.zone.parse("2014-03-28 00:00:00"), rt.send(:get_xth_day_of_month, 4, 5, 3, 2014).to_s(:db)
|
assert_equal Time.zone.parse("2014-03-28 00:00:00"), rt.send(:get_xth_day_of_month, 4, 5, 3, 2014).to_formatted_s(:db)
|
||||||
assert_equal Time.zone.parse("2014-03-28 00:00:00"), rt.send(:get_xth_day_of_month, 5, 5, 3, 2014).to_s(:db)
|
assert_equal Time.zone.parse("2014-03-28 00:00:00"), rt.send(:get_xth_day_of_month, 5, 5, 3, 2014).to_formatted_s(:db)
|
||||||
|
|
||||||
assert_raise(RuntimeError, "should check on valid weekdays"){ rt.send(:get_xth_day_of_month, 5, 9, 3, 2014) }
|
assert_raise(RuntimeError, "should check on valid weekdays"){ rt.send(:get_xth_day_of_month, 5, 9, 3, 2014) }
|
||||||
assert_raise(RuntimeError, "should check on valid count x"){ rt.send(:get_xth_day_of_month, 6, 5, 3, 2014) }
|
assert_raise(RuntimeError, "should check on valid count x"){ rt.send(:get_xth_day_of_month, 6, 5, 3, 2014) }
|
||||||
|
|
|
@ -10,7 +10,7 @@ class TodoTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def next_week
|
def next_week
|
||||||
1.week.from_now.beginning_of_day.to_s(:db)
|
1.week.from_now.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Test loading a todo item
|
# Test loading a todo item
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue