Compare commits

...

4 Commits

31 changed files with 529 additions and 399 deletions

View File

@ -1 +1 @@
3.2.2
3.4.3

13
Gemfile
View File

@ -1,8 +1,8 @@
source 'https://rubygems.org'
ruby '3.2.2'
gem 'rails', '~> 7.0'
# TODO Upgrade sprockets
gem 'redis', '~> 4.0'
ruby '3.4.3'
gem 'rails', '~> 8.0'
gem 'redis' #, '~> 4.0'
# gem 'bootsnap'
gem 'sprockets' #, '~> 3.7'
gem 'sass-rails' #, '~> 4.0.3'
# gem 'uglifier' #, '>= 1.3.0'
@ -17,7 +17,7 @@ gem 'devise_invitable'
gem 'haml-rails'
gem 'high_voltage'
gem 'pg'
gem 'puma', '6'
gem 'puma' #, '6'
gem 'pundit'
gem 'simple_form'
gem 'dotenv-rails'
@ -61,7 +61,8 @@ group :development do
gem 'guard-ctags-bundler'
end
group :development, :test do
gem 'factory_girl_rails'
# todo upgrade to factory_bot
# gem 'factory_girl_rails'
gem 'faker'
gem 'pry-rails'
gem 'pry-rescue'

View File

@ -8,113 +8,111 @@ GIT
GEM
remote: https://rubygems.org/
specs:
actioncable (7.1.2)
actionpack (= 7.1.2)
activesupport (= 7.1.2)
actioncable (8.0.2)
actionpack (= 8.0.2)
activesupport (= 8.0.2)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
zeitwerk (~> 2.6)
actionmailbox (7.1.2)
actionpack (= 7.1.2)
activejob (= 7.1.2)
activerecord (= 7.1.2)
activestorage (= 7.1.2)
activesupport (= 7.1.2)
mail (>= 2.7.1)
net-imap
net-pop
net-smtp
actionmailer (7.1.2)
actionpack (= 7.1.2)
actionview (= 7.1.2)
activejob (= 7.1.2)
activesupport (= 7.1.2)
mail (~> 2.5, >= 2.5.4)
net-imap
net-pop
net-smtp
actionmailbox (8.0.2)
actionpack (= 8.0.2)
activejob (= 8.0.2)
activerecord (= 8.0.2)
activestorage (= 8.0.2)
activesupport (= 8.0.2)
mail (>= 2.8.0)
actionmailer (8.0.2)
actionpack (= 8.0.2)
actionview (= 8.0.2)
activejob (= 8.0.2)
activesupport (= 8.0.2)
mail (>= 2.8.0)
rails-dom-testing (~> 2.2)
actionpack (7.1.2)
actionview (= 7.1.2)
activesupport (= 7.1.2)
actionpack (8.0.2)
actionview (= 8.0.2)
activesupport (= 8.0.2)
nokogiri (>= 1.8.5)
racc
rack (>= 2.2.4)
rack-session (>= 1.0.1)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
actiontext (7.1.2)
actionpack (= 7.1.2)
activerecord (= 7.1.2)
activestorage (= 7.1.2)
activesupport (= 7.1.2)
useragent (~> 0.16)
actiontext (8.0.2)
actionpack (= 8.0.2)
activerecord (= 8.0.2)
activestorage (= 8.0.2)
activesupport (= 8.0.2)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.1.2)
activesupport (= 7.1.2)
actionview (8.0.2)
activesupport (= 8.0.2)
builder (~> 3.1)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
activejob (7.1.2)
activesupport (= 7.1.2)
activejob (8.0.2)
activesupport (= 8.0.2)
globalid (>= 0.3.6)
activemodel (7.1.2)
activesupport (= 7.1.2)
activerecord (7.1.2)
activemodel (= 7.1.2)
activesupport (= 7.1.2)
activemodel (8.0.2)
activesupport (= 8.0.2)
activerecord (8.0.2)
activemodel (= 8.0.2)
activesupport (= 8.0.2)
timeout (>= 0.4.0)
activestorage (7.1.2)
actionpack (= 7.1.2)
activejob (= 7.1.2)
activerecord (= 7.1.2)
activesupport (= 7.1.2)
activestorage (8.0.2)
actionpack (= 8.0.2)
activejob (= 8.0.2)
activerecord (= 8.0.2)
activesupport (= 8.0.2)
marcel (~> 1.0)
activesupport (7.1.2)
activesupport (8.0.2)
base64
benchmark (>= 0.3)
bigdecimal
concurrent-ruby (~> 1.0, >= 1.0.2)
concurrent-ruby (~> 1.0, >= 1.3.1)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
logger (>= 1.4.2)
minitest (>= 5.1)
mutex_m
tzinfo (~> 2.0)
addressable (2.8.5)
public_suffix (>= 2.0.2, < 6.0)
airbrussh (1.5.0)
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
uri (>= 0.13.1)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
airbrussh (1.5.3)
sshkit (>= 1.6.1, != 1.7.0)
ast (2.4.2)
ast (2.4.3)
babel-source (5.8.35)
babel-transpiler (0.7.0)
babel-source (>= 4.0, < 6)
execjs (~> 2.0)
base64 (0.2.0)
bcrypt (3.1.20)
bcrypt_pbkdf (1.1.0)
bcrypt_pbkdf (1.1.1)
benchmark (0.4.0)
better_errors (2.10.1)
erubi (>= 1.0.0)
rack (>= 0.9.0)
rouge (>= 1.0.0)
bigdecimal (3.1.4)
binding_of_caller (1.0.0)
debug_inspector (>= 0.0.1)
builder (3.2.4)
capistrano (3.18.0)
bigdecimal (3.1.9)
binding_of_caller (1.0.1)
debug_inspector (>= 1.2.0)
builder (3.3.0)
capistrano (3.19.2)
airbrussh (>= 1.0.0)
i18n
rake (>= 10.0.0)
sshkit (>= 1.9.0)
capistrano-bundler (2.1.0)
capistrano-bundler (2.1.1)
capistrano (~> 3.1)
capistrano-db-tasks (0.6)
capistrano (>= 3.0.0)
capistrano-postgresql (6.2.0)
capistrano (>= 3.0)
sshkit (>= 1.17.0)
capistrano-rails (1.6.3)
capistrano-rails (1.7.0)
capistrano (~> 3.1)
capistrano-bundler (>= 1.1, < 3)
capistrano-rails-console (2.3.0)
@ -123,15 +121,15 @@ GEM
capistrano-rbenv (2.2.0)
capistrano (~> 3.1)
sshkit (~> 1.3)
capistrano3-puma (6.0.0.beta.1)
capistrano3-puma (6.0.0)
capistrano (~> 3.7)
capistrano-bundler
puma (>= 5.1, < 7.0)
capybara (3.39.2)
capybara (3.40.0)
addressable
matrix
mini_mime (>= 0.1.3)
nokogiri (~> 1.8)
nokogiri (~> 1.11)
rack (>= 1.6.0)
rack-test (>= 0.6.3)
regexp_parser (>= 1.5, < 3.0)
@ -139,6 +137,8 @@ GEM
capybara-screenshot (1.0.26)
capybara (>= 1.0, < 4)
launchy
childprocess (5.1.0)
logger (~> 1.5)
ci_reporter (2.1.0)
builder (>= 2.1.2)
rexml
@ -153,61 +153,58 @@ GEM
coffee-script-source
execjs
coffee-script-source (1.12.2)
concurrent-ruby (1.2.2)
connection_pool (2.4.1)
concurrent-ruby (1.3.5)
connection_pool (2.5.1)
crass (1.0.6)
database_cleaner (2.0.2)
database_cleaner (2.1.0)
database_cleaner-active_record (>= 2, < 3)
database_cleaner-active_record (2.1.0)
database_cleaner-active_record (2.2.0)
activerecord (>= 5.a)
database_cleaner-core (~> 2.0.0)
database_cleaner-core (2.0.1)
date (3.3.4)
debug_inspector (1.1.0)
devise (4.9.3)
date (3.4.1)
debug_inspector (1.2.0)
devise (4.9.4)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 4.1.0)
responders
warden (~> 1.2.3)
devise_invitable (2.0.9)
devise_invitable (2.0.10)
actionmailer (>= 5.0)
devise (>= 4.6)
diff-lcs (1.5.0)
docile (1.4.0)
dotenv (2.8.1)
dotenv-rails (2.8.1)
dotenv (= 2.8.1)
railties (>= 3.2)
drb (2.2.0)
ruby2_keywords
diff-lcs (1.6.1)
docile (1.4.1)
dotenv (3.1.8)
dotenv-rails (3.1.8)
dotenv (= 3.1.8)
railties (>= 6.1)
drb (2.2.1)
ed25519 (1.3.0)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
erubi (1.12.0)
erubi (1.13.1)
erubis (2.7.0)
eventmachine (1.2.7)
execjs (2.9.1)
factory_girl (4.9.0)
activesupport (>= 3.0.0)
factory_girl_rails (4.9.0)
factory_girl (~> 4.9.0)
railties (>= 3.0.0)
faker (3.2.2)
execjs (2.10.0)
faker (3.5.1)
i18n (>= 1.8.11, < 2)
ffi (1.16.3)
ffi (1.17.2)
ffi (1.17.2-x86_64-linux-gnu)
formatador (1.1.0)
friendly_id (5.4.2)
activerecord (>= 4.0.0)
globalid (1.2.1)
activesupport (>= 6.1)
guard (2.18.1)
guard (2.19.1)
formatador (>= 0.2.4)
listen (>= 2.7, < 4.0)
logger (~> 1.6)
lumberjack (>= 1.0.12, < 2.0)
nenv (~> 0.1)
notiffany (~> 0.0)
ostruct (~> 0.6)
pry (>= 0.13.0)
shellany (~> 0.0)
thor (>= 0.18.1)
@ -231,7 +228,7 @@ GEM
guard (~> 2.1)
guard-compat (~> 1.1)
rspec (>= 2.99.0, < 4.0)
haml (6.2.3)
haml (6.3.0)
temple (>= 0.8.2)
thor
tilt
@ -240,7 +237,7 @@ GEM
activesupport (>= 5.1)
haml (>= 4.0.6)
railties (>= 5.1)
high_voltage (3.1.2)
high_voltage (4.0.0)
html2haml (2.3.0)
erubis (~> 2.7.0)
haml (>= 4.0)
@ -248,37 +245,42 @@ GEM
ruby_parser (~> 3.5)
http_parser.rb (0.8.0)
hub (1.12.4)
i18n (1.14.1)
i18n (1.14.7)
concurrent-ruby (~> 1.0)
importmap-rails (1.2.3)
importmap-rails (2.1.0)
actionpack (>= 6.0.0)
activesupport (>= 6.0.0)
railties (>= 6.0.0)
inline_svg (1.9.0)
inline_svg (1.10.0)
activesupport (>= 3.0)
nokogiri (>= 1.6)
interception (0.5)
io-console (0.6.0)
irb (1.10.0)
rdoc
reline (>= 0.3.8)
jbuilder (2.11.5)
io-console (0.8.0)
irb (1.15.2)
pp (>= 0.6.0)
rdoc (>= 4.0.0)
reline (>= 0.4.2)
jbuilder (2.13.0)
actionview (>= 5.0.0)
activesupport (>= 5.0.0)
jquery-rails (4.6.0)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
jquery-ui-rails (6.0.1)
jquery-ui-rails (7.0.0)
railties (>= 3.2.16)
json (2.7.0)
language_server-protocol (3.17.0.3)
launchy (2.5.2)
json (2.10.2)
language_server-protocol (3.17.0.4)
launchy (3.1.1)
addressable (~> 2.8)
listen (3.8.0)
childprocess (~> 5.0)
logger (~> 1.6)
lint_roller (1.1.0)
listen (3.9.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
loofah (2.22.0)
logger (1.7.0)
loofah (2.24.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
lumberjack (1.2.10)
@ -287,167 +289,178 @@ GEM
net-imap
net-pop
net-smtp
marcel (1.0.2)
marcel (1.0.4)
matrix (0.4.2)
method_source (1.0.0)
method_source (1.1.0)
mini_mime (1.1.5)
mini_portile2 (2.8.5)
minitest (5.20.0)
mini_portile2 (2.8.8)
minitest (5.25.5)
multi_json (1.15.0)
mutex_m (0.2.0)
nenv (0.3.0)
net-imap (0.4.7)
net-imap (0.5.7)
date
net-protocol
net-pop (0.1.2)
net-protocol
net-protocol (0.2.2)
timeout
net-scp (4.0.0)
net-scp (4.1.0)
net-ssh (>= 2.6.5, < 8.0.0)
net-smtp (0.4.0)
net-sftp (4.0.0)
net-ssh (>= 5.0.0, < 8.0.0)
net-smtp (0.5.1)
net-protocol
net-ssh (7.2.0)
nio4r (2.7.0)
nokogiri (1.15.5)
net-ssh (7.3.0)
nio4r (2.7.4)
nokogiri (1.18.8)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
nokogiri (1.15.5-x86_64-linux)
nokogiri (1.18.8-x86_64-linux-gnu)
racc (~> 1.4)
notiffany (0.1.3)
nenv (~> 0.1)
shellany (~> 0.0)
orm_adapter (0.5.0)
parallel (1.23.0)
parallel_tests (4.3.0)
ostruct (0.6.1)
parallel (1.27.0)
parallel_tests (5.1.0)
parallel
parser (3.2.2.4)
parser (3.3.8.0)
ast (~> 2.4.1)
racc
pg (1.5.4)
pry (0.14.2)
pg (1.5.9)
pp (0.6.2)
prettyprint
prettyprint (0.2.0)
prism (1.4.0)
pry (0.15.2)
coderay (~> 1.1)
method_source (~> 1.0)
pry-rails (0.3.9)
pry (>= 0.10.4)
pry-rescue (1.5.2)
pry-rails (0.3.11)
pry (>= 0.13.0)
pry-rescue (1.6.0)
interception (>= 0.5)
pry (>= 0.12.0)
psych (5.1.1.1)
psych (5.2.3)
date
stringio
public_suffix (5.0.4)
puma (6.0.0)
public_suffix (6.0.1)
puma (6.6.0)
nio4r (~> 2.0)
pundit (2.3.1)
pundit (2.5.0)
activesupport (>= 3.0.0)
racc (1.7.3)
rack (3.0.8)
rack-livereload (0.5.1)
rack
rack-session (2.0.0)
racc (1.8.1)
rack (3.1.13)
rack-livereload (0.6.1)
rack (>= 3.0, < 3.2)
rack-session (2.1.0)
base64 (>= 0.1.0)
rack (>= 3.0.0)
rack-test (2.1.0)
rack-test (2.2.0)
rack (>= 1.3)
rackup (2.1.0)
rackup (2.2.1)
rack (>= 3)
webrick (~> 1.8)
rails (7.1.2)
actioncable (= 7.1.2)
actionmailbox (= 7.1.2)
actionmailer (= 7.1.2)
actionpack (= 7.1.2)
actiontext (= 7.1.2)
actionview (= 7.1.2)
activejob (= 7.1.2)
activemodel (= 7.1.2)
activerecord (= 7.1.2)
activestorage (= 7.1.2)
activesupport (= 7.1.2)
rails (8.0.2)
actioncable (= 8.0.2)
actionmailbox (= 8.0.2)
actionmailer (= 8.0.2)
actionpack (= 8.0.2)
actiontext (= 8.0.2)
actionview (= 8.0.2)
activejob (= 8.0.2)
activemodel (= 8.0.2)
activerecord (= 8.0.2)
activestorage (= 8.0.2)
activesupport (= 8.0.2)
bundler (>= 1.15.0)
railties (= 7.1.2)
railties (= 8.0.2)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
rails-html-sanitizer (1.6.0)
rails-html-sanitizer (1.6.2)
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_layout (1.0.42)
railties (7.1.2)
actionpack (= 7.1.2)
activesupport (= 7.1.2)
irb
railties (8.0.2)
actionpack (= 8.0.2)
activesupport (= 8.0.2)
irb (~> 1.13)
rackup (>= 1.0.0)
rake (>= 12.2)
thor (~> 1.0, >= 1.2.2)
zeitwerk (~> 2.6)
rainbow (3.1.1)
rake (13.1.0)
rake (13.2.1)
rb-fchange (0.0.6)
ffi
rb-fsevent (0.11.2)
rb-inotify (0.10.1)
rb-inotify (0.11.1)
ffi (~> 1.0)
rbnacl (3.4.0)
ffi
rbnacl-libsodium (1.0.16)
rbnacl (>= 3.0.1)
rdoc (6.6.0)
rdoc (6.13.1)
psych (>= 4.0.0)
react-rails (3.1.1)
react-rails (3.2.1)
babel-transpiler (>= 0.7.0)
connection_pool
execjs
railties (>= 3.2)
tilt
redis (4.8.1)
regexp_parser (2.8.3)
reline (0.4.1)
redis (5.4.0)
redis-client (>= 0.22.0)
redis-client (0.24.0)
connection_pool
regexp_parser (2.10.0)
reline (0.6.1)
io-console (~> 0.5)
responders (3.1.1)
actionpack (>= 5.2)
railties (>= 5.2)
rexml (3.2.6)
rouge (4.2.0)
rspec (3.12.0)
rspec-core (~> 3.12.0)
rspec-expectations (~> 3.12.0)
rspec-mocks (~> 3.12.0)
rspec-core (3.12.2)
rspec-support (~> 3.12.0)
rspec-expectations (3.12.3)
rexml (3.4.1)
rouge (4.5.1)
rspec (3.13.0)
rspec-core (~> 3.13.0)
rspec-expectations (~> 3.13.0)
rspec-mocks (~> 3.13.0)
rspec-core (3.13.3)
rspec-support (~> 3.13.0)
rspec-expectations (3.13.3)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.12.0)
rspec-mocks (3.12.6)
rspec-support (~> 3.13.0)
rspec-mocks (3.13.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.12.0)
rspec-rails (6.1.0)
actionpack (>= 6.1)
activesupport (>= 6.1)
railties (>= 6.1)
rspec-core (~> 3.12)
rspec-expectations (~> 3.12)
rspec-mocks (~> 3.12)
rspec-support (~> 3.12)
rspec-support (3.12.1)
rubocop (1.58.0)
rspec-support (~> 3.13.0)
rspec-rails (7.1.1)
actionpack (>= 7.0)
activesupport (>= 7.0)
railties (>= 7.0)
rspec-core (~> 3.13)
rspec-expectations (~> 3.13)
rspec-mocks (~> 3.13)
rspec-support (~> 3.13)
rspec-support (3.13.2)
rubocop (1.75.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)
parser (>= 3.2.2.4)
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0)
rubocop-ast (>= 1.30.0, < 2.0)
regexp_parser (>= 2.9.3, < 3.0)
rubocop-ast (>= 1.44.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.30.0)
parser (>= 3.2.1.0)
unicode-display_width (>= 2.4.0, < 4.0)
rubocop-ast (1.44.1)
parser (>= 3.3.7.2)
prism (~> 1.4)
ruby-progressbar (1.13.0)
ruby2_keywords (0.0.5)
ruby_parser (3.20.3)
ruby_parser (3.21.1)
racc (~> 1.5)
sexp_processor (~> 4.16)
rubyzip (2.3.2)
rubyzip (2.4.1)
sass-rails (6.0.0)
sassc-rails (~> 2.1, >= 2.1.1)
sassc (2.4.0)
@ -460,65 +473,74 @@ GEM
tilt
sdoc (2.6.1)
rdoc (>= 5.0)
securerandom (0.4.1)
selenium-webdriver (4.10.0)
rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2, < 3.0)
websocket (~> 1.0)
sexp_processor (4.17.0)
sexp_processor (4.17.3)
shellany (0.0.1)
simple_form (5.3.0)
simple_form (5.3.1)
actionpack (>= 5.2)
activemodel (>= 5.2)
simplecov (0.22.0)
docile (~> 1.1)
simplecov-html (~> 0.11)
simplecov_json_formatter (~> 0.1)
simplecov-html (0.12.3)
simplecov-html (0.13.1)
simplecov_json_formatter (0.1.4)
spring (4.1.3)
spring (4.3.0)
spring-commands-rspec (1.0.4)
spring (>= 0.9.1)
sprockets (4.2.1)
sprockets (4.2.2)
concurrent-ruby (~> 1.0)
logger
rack (>= 2.2.4, < 4)
sprockets-rails (3.4.2)
actionpack (>= 5.2)
activesupport (>= 5.2)
sprockets-rails (3.5.2)
actionpack (>= 6.1)
activesupport (>= 6.1)
sprockets (>= 3.0.0)
sshkit (1.21.6)
sshkit (1.24.0)
base64
logger
net-scp (>= 1.1.2)
net-sftp (>= 2.1.2)
net-ssh (>= 2.8.0)
ostruct
sshkit-interactive (0.3.0)
sshkit (~> 1.12)
stimulus-rails (1.3.0)
stimulus-rails (1.3.4)
railties (>= 6.0.0)
stringio (3.1.0)
stringio (3.1.7)
temple (0.10.3)
thor (1.3.0)
tilt (2.3.0)
timeout (0.4.1)
turbo-rails (1.5.0)
actionpack (>= 6.0.0)
activejob (>= 6.0.0)
railties (>= 6.0.0)
thor (1.3.2)
tilt (2.6.0)
timeout (0.4.3)
turbo-rails (2.0.13)
actionpack (>= 7.1.0)
railties (>= 7.1.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
unicode-display_width (2.5.0)
unicode-display_width (3.1.4)
unicode-emoji (~> 4.0, >= 4.0.4)
unicode-emoji (4.0.4)
uri (1.0.3)
useragent (0.16.11)
warden (1.2.9)
rack (>= 2.0.9)
webdrivers (5.3.1)
nokogiri (~> 1.6)
rubyzip (>= 1.3.0)
selenium-webdriver (~> 4.0, < 4.11)
webrick (1.8.1)
websocket (1.2.10)
websocket-driver (0.7.6)
websocket (1.2.11)
websocket-driver (0.7.7)
base64
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
will_paginate (4.0.0)
will_paginate (4.0.1)
xpath (3.2.0)
nokogiri (~> 1.8)
zeitwerk (2.6.12)
zeitwerk (2.7.2)
PLATFORMS
ruby
@ -546,7 +568,6 @@ DEPENDENCIES
devise_invitable
dotenv-rails
ed25519
factory_girl_rails
faker
friendly_id (~> 5.4.0)
guard-bundler
@ -569,10 +590,10 @@ DEPENDENCIES
pg
pry-rails
pry-rescue
puma (= 6)
puma
pundit
rack-livereload
rails (~> 7.0)
rails (~> 8.0)
rails_layout
rb-fchange
rb-fsevent
@ -580,7 +601,7 @@ DEPENDENCIES
rbnacl (~> 3.4)
rbnacl-libsodium
react-rails
redis (~> 4.0)
redis
rspec-rails
rubocop
sass-rails
@ -597,7 +618,7 @@ DEPENDENCIES
will_paginate
RUBY VERSION
ruby 3.2.2p53
ruby 3.4.3p32
BUNDLED WITH
2.4.22

View File

@ -0,0 +1,5 @@
class PagesController < ApplicationController
before_action :skip_authorization
def czechers
end
end

View File

@ -0,0 +1,2 @@
module PagesHelper
end

View File

@ -1,13 +1,13 @@
# The game class
class Game < ActiveRecord::Base
belongs_to :table
belongs_to :table, optional: true
has_many :seats
has_many :players, dependent: :destroy
has_many :users, through: :players
has_many :player_cards, through: :players
has_many :plays, through: :players
belongs_to :play_to_beat
belongs_to :controlling_player, class_name: "Player", foreign_key: "controlling_player_id"
belongs_to :play_to_beat, optional: true
belongs_to :controlling_player, class_name: "Player", foreign_key: "controlling_player_id", optional: true
accepts_nested_attributes_for :players
#validates :title, presence: true
after_create :add_table
@ -177,7 +177,7 @@ class Game < ActiveRecord::Base
@inventory_counts.include? 0
end
private
# private
def add_table
self.table ||= Table.create current_game_id: self.id

View File

@ -1,7 +1,7 @@
# Associates users to games
class Player < ActiveRecord::Base
belongs_to :game
belongs_to :user
belongs_to :user, optional: true
has_many :player_cards
has_many :plays
@ -32,7 +32,7 @@ class Player < ActiveRecord::Base
def display_name
return user.email.split("@")[0] if self.user
return "BotPlayer" if self.is_bot?
return "BotPlayer #{self.id}" if self.is_bot?
return ("Guest" + self.soft_token)[0..9] if self.soft_token
return "Empty"
end

View File

@ -1,6 +1,6 @@
class PlayerCard < ActiveRecord::Base
belongs_to :player
belongs_to :play
belongs_to :play, optional: true
def to_s
# TODO: Shouldn't hard code face cards here

View File

@ -14,12 +14,12 @@ class Seat < ActiveRecord::Base
self.reload
if self.player == nil
# TODO: Decouple seat from game
# self.player_id = self.table.current_game.add_player_from_user(current_user).id
self.player_id = self.table.current_game.add_player_from_user(current_user).id
end
# self.player.user_id = current_user.id
# self.player.soft_token = current_user.soft_token
# self.player.save
self.player.user_id = current_user.id
self.player.soft_token = current_user.soft_token
self.player.save
self.user_id = current_user.id
self.user_soft_token = current_user.soft_token

View File

@ -6,7 +6,7 @@ class Table < ActiveRecord::Base
has_many :users, through: :seats
has_many :games
has_many :players, through: :games
belongs_to :token
# belongs_to :token
#TODO: Deprecated current_game_id from database.
# Instead calculate with self.current_game
#
@ -14,7 +14,7 @@ class Table < ActiveRecord::Base
#TODO: Should these be part of Game initialize instead of callback?
after_create :add_seats
# after_create :add_game
after_create :add_game # TODO decouple game from table
# Returns the newest joinable table or creates a new table if none are found
# scope :play_now, lambda { |user|
@ -36,6 +36,8 @@ class Table < ActiveRecord::Base
def add_game
self.games.create
# game = self.games.new
# game.
end
# private

View File

@ -1,5 +1,5 @@
class Token < ActiveRecord::Base
enum standard: [:dip20, :icrc1, :unknown]
enum :standard, [:dip20, :icrc1, :unknown]
validates :canister_id, uniqueness: true, allow_nil: true
before_create :refresh

View File

@ -1,5 +1,5 @@
class User < ActiveRecord::Base
enum role: [:user, :vip, :admin]
enum :role, [:user, :vip, :admin]
after_initialize :set_default_role, if: :new_record?
validates :email, presence: true, uniqueness: true
validates :soft_token, presence: true, uniqueness: true

View File

@ -15,11 +15,11 @@ class TablePolicy
end
def create?
@current_user.admin?
@current_user.admin? || true
end
def new?
@current_user.admin?
@current_user.admin? || true
end
def edit?
@ -36,7 +36,8 @@ class TablePolicy
end
def play_now?
@current_user.admin? || @current_user.email == "bort@13.24x7.hk"
return true
# @current_user.admin? || @current_user.email == "bort@13.24x7.hk"
end
def new_game?

View File

@ -1,37 +0,0 @@
<nav>
<ul>
<% if current_user.signed_in? %>
<li><%= link_to 'My Tendy Zone', root_path, class: "home-link", data: { turbo: false } %></li>
<% end %>
<li><%= link_to 'Public', '/public', data: { turbo: false } %></li>
<li><%= link_to 'Tokens', tokens_path %></li>
<li><%= link_to 'Profiles', profiles_path %></li>
<li><%= link_to 'Projects', projects_path %></li>
<li><%= link_to 'MetaPurse', metapurses_path %></li>
<% if policy(:canister).index? %>
<li><%= link_to 'Canisters', canisters_path %></li>
<% end %>
<li><%= link_to 'Doodads', doodads_path, data: { turbo: false } %></li>
<% if policy(:bot).index? %>
<li><%= link_to 'Bots', bots_path %></li>
<% end %>
<% if policy(:table).index? %>
<li><%= link_to 'Tables', tables_path %></li>
<% end %>
<% if policy(:room).index? %>
<li><%= link_to 'Chat', rooms_path %></li>
<% end %>
<% if current_user.signed_in? %>
<% if current_user.admin? %>
<li><%= link_to 'Users', users_path %></li>
<% end %>
<% end %>
<% if current_user.signed_in? %>
<li><%= link_to 'My account', edit_user_registration_path %></li>
<li><%= link_to 'Sign out', destroy_user_session_path, :method=>'delete' %></li>
<% else %>
<li><%= link_to 'Sign in', new_user_session_path %></li>
<li><%= link_to 'Sign up', new_user_registration_path %></li>
<% end %>
</ul>
</nav>

View File

@ -0,0 +1,28 @@
%nav
%ul
%li= link_to 'Home', root_path, class: "home-link", data: { turbo: false }
-# - if current_user.signed_in?
-# %li= link_to 'My Tendy Zone', root_path, class: "home-link", data: { turbo: false }
-# %li= link_to 'Public', '/public', data: { turbo: false }
-# %li= link_to 'Tokens', tokens_path
-# %li= link_to 'Profiles', profiles_path
-# %li= link_to 'Projects', projects_path
-# %li= link_to 'MetaPurse', metapurses_path
-# - if policy(:canister).index?
-# %li= link_to 'Canisters', canisters_path
-# %li= link_to 'Doodads', doodads_path, data: { turbo: false }
-# - if policy(:bot).index?
-# %li= link_to 'Bots', bots_path
- if policy(:table).index?
%li= link_to 'Tables', tables_path
-# - if policy(:room).index?
-# %li= link_to 'Chat', rooms_path
- if current_user.signed_in?
- if current_user.admin?
%li= link_to 'Users', users_path
- if current_user.signed_in?
%li= link_to 'My account', edit_user_registration_path
%li= link_to 'Sign out', destroy_user_session_path, :method=>'delete'
- else
%li= link_to 'Sign in', new_user_session_path
%li= link_to 'Sign up', new_user_registration_path

View File

@ -26,7 +26,7 @@
<header>
<%= render "layouts/navigation_links" %>
<%= render "layouts/navigation_wallet" %>
<%# <%= render "layouts/navigation_wallet" %1> %>
</header>
<%= render "layouts/flashmessages" %>
@ -35,9 +35,9 @@
<%= yield %>
</div>
<footer>
<%= render "layouts/footer" %>
</footer>
<%# <footer> %>
<%# <%= render "layouts/footer" %1> %>
<%# </footer> %>
</body>
</html>

View File

@ -0,0 +1,142 @@
%h1{style: "padding-left: 0.5em;"} Czechers
:css
.board {
position: relative;
margin-top: 1em;
margin-bottom: 1em;
display: grid;
grid-template-columns: repeat(8, 80px);
grid-template-rows: repeat(8, 80px);
gap: 1px;
}
.cell {
width: 80px;
height: 80px;
background-color: white;
}
.cell:nth-child(2n+1):nth-child(-n+8),
.cell:nth-child(2n):nth-child(n+9):nth-child(-n+16),
.cell:nth-child(2n+1):nth-child(n+17):nth-child(-n+24),
.cell:nth-child(2n):nth-child(n+25):nth-child(-n+32),
.cell:nth-child(2n+1):nth-child(n+33):nth-child(-n+40),
.cell:nth-child(2n):nth-child(n+41):nth-child(-n+48),
.cell:nth-child(2n+1):nth-child(n+49):nth-child(-n+56),
.cell:nth-child(2n):nth-child(n+57):nth-child(-n+64) {
background-color: black;
}
.czecher-piece {
border-radius: 5em;
width: 50px;
outline: 2px #cccccc solid;
position: absolute;
z-index: 100;
}
.czecher-piece:active {
outline: 2px #00ffff solid;
}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 182px; top: 912px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 262px; top: 912px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 343px; top: 912px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 424px; top: 912px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 505px; top: 912px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 586px; top: 912px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 667px; top: 912px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 748px; top: 912px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 182px; top: 993px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 262px; top: 993px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 343px; top: 993px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 424px; top: 993px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 505px; top: 993px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 586px; top: 993px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 667px; top: 993px;"}
%img.czecher-piece{src:"/czech-logo-dip20.png", style: "left: 748px; top: 993px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 181px; top: 1480px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 261px; top: 1480px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 342px; top: 1480px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 423px; top: 1480px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 504px; top: 1480px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 585px; top: 1480px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 666px; top: 1480px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 747px; top: 1480px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 181px; top: 1399px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 261px; top: 1399px; outline: 2px #00ffff solid;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 342px; top: 1399px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 423px; top: 1399px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 504px; top: 1399px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 585px; top: 1399px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 666px; top: 1399px;"}
%img.czecher-piece{src:"/tendy-logo-icrc1.jpg", style: "left: 747px; top: 1399px;"}
.board
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell{style: "background: #EFFA8D;"}
.cell
.cell{style: "background: #EFFA8D;"}
.cell
.cell
.cell
.cell
.cell
.cell
.cell{style: "background: #B5FFFF;"}
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell
.cell

View File

@ -2,14 +2,15 @@
- @game = seat.game
.seat{class: "position-#{@seats.index(seat) + 1}"}
- if seat.user_soft_token
-# - if seat.user_soft_token
- if seat.player
-# = button_to remove_player_seat_path(seat), :data => { :confirm => 'Are you sure you want to remove this player?' } do
-# TODO: Remove Player button
-# = button_to remove_player_seat_path(seat) do
- "Remove Player"
.user{id: "user-#{seat.user_soft_token}", class: @game.try("controlling_player") == seat.player ? "taking-turn" : "",
data: {soft_token: seat.user_soft_token} }
.user-name= seat.user_soft_token[0..3]
.user-name= seat.player.display_name
-# .user-soft-token= seat.user.soft_token
-# TODO user principal
-# .user-principal= seat.user_soft_token[0..3]
@ -19,14 +20,14 @@
= seat.player.inventory.count
-# Show player controls if player is owned by current_user
- if seat.user.soft_token == current_user.soft_token
- if seat.player.soft_token == current_user.soft_token
= form_for(@game,
url: play_hand_game_path(@game),
method: "post",
name: "player_controls_" + seat.user_id.to_s,
id: "player_controls_" + seat.user_id.to_s) do |f|
name: "player_controls_" + seat.player_id.to_s,
id: "player_controls_" + seat.player_id.to_s) do |f|
%ul#inventory
-# - seat.player.inventory.each do |card|
- seat.player.inventory.each do |card|
%li
%label
= check_box_tag 'player_card_ids[]',
@ -34,7 +35,7 @@
false,
data: {value: card.id, card_name: card.rank.gsub('11','J') .gsub('12','Q') .gsub('13','K') .gsub('14','A') .gsub('15','2') + ' ' + card.suit}
-# %input{form: "player_controls_" + card.player_id.to_s,
%input{form: "player_controls_" + card.player_id.to_s,
type: "checkbox",
name: "player_card_ids[]",
data: {value: card.id, card_name: card.rank.gsub('11','J') .gsub('12','Q') .gsub('13','K') .gsub('14','A') .gsub('15','2') + ' ' + card.suit}}
@ -52,7 +53,7 @@
.seat-controls
- if seat.occupied?
- if seat.player.try("is_bot?")
-# = button_to remove_bot_seat_path(seat) do
= button_to remove_bot_seat_path(seat) do
- "- Bot"
- if seat.occupied_by? current_user
-# = button_to stand_seat_path(seat), :data => { :confirm => 'Are you sure you want to leave this seat?' } do
@ -66,6 +67,6 @@
- else
= button_to sit_seat_path(seat) do
- "Sit"
-# = button_to add_bot_seat_path(seat) do
= button_to add_bot_seat_path(seat) do
- "+ Bot"

View File

@ -17,7 +17,7 @@
-# - if @game.winner_player_id || @game.nil?
-# = button_to 'New Game', new_game_table_path(@table)
- if @game && !@game.startable?
- if (@game && !@game.startable?) || !@game
#table-controls
#newgame= button_to 'New Game', new_game_table_path(@table)

View File

@ -1,85 +1,12 @@
#home-headline.home-headline
- if request.base_url.match(/pin|my|fireside/)
%h1 Your own public tendy zone 🍗
- else
%h1 Web3 Social Gaming <br/>Crypto Rewards
- if @feed_items.any?
.contain
%h2 Post feed
= render 'shared/feed'
.contain
#doodads
%h2 Doodads
- if current_user.signed_in?
%p= link_to '+ New Doodad', new_doodad_path
= render @doodads
:javascript
function destroyDoodad(doodad_id) {
return fetch("/doodads/" + doodad_id, {
method: 'DELETE',
headers: {
"Content-Type": "application/json",
"Accept": "application/json"
}
})
.then(response => response)
};
// var s2 = Swiped.init({ query: '.bar li', list: true, left: 200, right: 200 });
var index_doodad_swiped = Swiped.init({ query: '#doodads .doodad',
list: true,
left: 200,
right: 200,
onOpen: function() {
var doodad_id = this.elem.className.split("-")[1];
destroyDoodad(doodad_id)
.then(results => console.log(results));
this.destroy(true)
}
});
-# #canisters
= render @canisters
- if current_user.signed_in?
= link_to '+ Add Existing Canister', new_canister_path
#home-headline
%h1 Thirteen <br/>Tien Len
#main-menu
-# - if policy(:table).play_now?
= link_to 'Play 13 Now', play_now_path
-# - else
- if policy(:table).play_now?
= link_to 'Play Now', play_now_path
- else
Soon
-# = link_to 'Browse Tables', tables_path
-# = link_to 'Tutorial', tutorial_path
-# = link_to 'About', page_path('about')
= link_to 'Browse Tables', tables_path
= link_to 'Tutorial', tutorial_path
= link_to 'About', page_path('about')
-# - if !request.base_url.match(/pin|my|fireside/)
- unless current_user.signed_in?
.eyecandy.icypepe
= image_tag "icy pepe.png", style: 'width: 800px'
-# = inline_svg_tag "Icy Pepe.svg"
- 5.times do |i|
.eyecandy
= image_tag "gongo-logo.png"
- 10.times do |i|
.eyecandy
= image_tag "ICYPEES-glass.png"
- 20.times do |i|
.eyecandy
= image_tag "chicken-tenders.png"
-# - 10.times do |i|
.eyecandy.roundcandy
= image_tag "tendy-logo.jpg"
- 10.times do |i|
.eyecandy
= image_tag "ICYPEES-coin.png"
-# - Dir.glob("app/assets/images/cards/png/**").each do |card_img|
- puts card_img
= image_tag
-# %iframe#videoplayer{:allowfullscreen => "", :frameborder => "0", :height => "480", :mozallowfullscreen => "true", :src => "https://archive.org/embed/my-dinner-with-andre-conspiracy-theory-scene-hd", :webkitallowfullscreen => "true", :width => "640", :autostart => "true"}
-# %iframe{:allow => "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share", :allowfullscreen => "", :frameborder => "0", :height => "315", :src => "https://www.youtube.com/embed/kK-1axSGkXc", :title => "YouTube video player", :width => "560"}
-# %iframe#videoplayer{:allow => "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share", :allowfullscreen => "", :frameborder => "0", :height => "315", :src => "https://www.youtube.com/embed/PhIM5k_m_hs", :title => "YouTube video player", :width => "560"}
-# .video-cover
-# = video_tag "video.mp4", autoplay: true, id: "videoplayer", loop: true

View File

@ -13,6 +13,9 @@ module MyTendyZone
config.load_defaults 7.0
# config.active_support.cache_format_version = 7.0
# TODO move secrets to credentials
config.secrets = config_for(:secrets)
# Configuration for the application, engines, and railties goes here.
#
# These settings can be overridden in specific environments using the files

View File

@ -1,5 +1,5 @@
set :application, "thirteen_tien_len_#{fetch(:stage)}"
set :repo_url, 'git@pineapple.punked.us:Bort/thirteen-tien-len.git'
set :repo_url, 'git@git.tendy.zone:Bort/thirteen-tien-len.git'
# If you want to import assets, you can change default asset dir (default = system)
# This directory must be in your shared directory on the server

View File

@ -10,7 +10,9 @@ Devise.setup do |config|
# Configure the e-mail address which will be shown in Devise::Mailer,
# note that it will be overwritten if you use your own mailer class
# with default "from" parameter.
config.mailer_sender = 'no-reply@' + Rails.application.secrets.domain_name
# TODO move secrets to credentials
# config.mailer_sender = 'no-reply@' + Rails.application.secrets.domain_name
config.mailer_sender = 'no-reply@' + Rails.configuration.secrets.domain_name
# Configure the class responsible to send e-mails.
# config.mailer = 'Devise::Mailer'

View File

@ -1,4 +1,5 @@
Rails.application.routes.draw do
get 'pages/czechers'
resources :metapurses do
member do
get 'data'

View File

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.1].define(version: 2024_03_25_142502) do
ActiveRecord::Schema[7.2].define(version: 2024_03_25_142502) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@ -79,7 +79,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_25_142502) do
t.integer "sluggable_id", null: false
t.string "sluggable_type", limit: 50
t.string "scope"
t.datetime "created_at", precision: nil
t.datetime "created_at"
t.index ["slug", "sluggable_type", "scope"], name: "index_friendly_id_slugs_on_slug_and_sluggable_type_and_scope", unique: true
t.index ["slug", "sluggable_type"], name: "index_friendly_id_slugs_on_slug_and_sluggable_type"
t.index ["sluggable_type", "sluggable_id"], name: "index_friendly_id_slugs_on_sluggable_type_and_sluggable_id"

BIN
public/czech-logo-dip20.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
public/tendy-logo-icrc1.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

View File

@ -0,0 +1,15 @@
require 'rails_helper'
# Specs in this file have access to a helper object that includes
# the PagesHelper. For example:
#
# describe PagesHelper do
# describe "string concat" do
# it "concats two strings with spaces" do
# expect(helper.concat_strings("this","that")).to eq("this that")
# end
# end
# end
RSpec.describe PagesHelper, type: :helper do
pending "add some examples to (or delete) #{__FILE__}"
end

View File

@ -0,0 +1,11 @@
require 'rails_helper'
RSpec.describe "Pages", type: :request do
describe "GET /czechers" do
it "returns http success" do
get "/pages/czechers"
expect(response).to have_http_status(:success)
end
end
end

View File

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe "pages/czechers.html.haml", type: :view do
pending "add some examples to (or delete) #{__FILE__}"
end