apicasso 0.4.5 → 0.4.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +226 -223
  3. data/Rakefile +23 -23
  4. data/app/controllers/apicasso/apidocs_controller.rb +309 -299
  5. data/app/controllers/apicasso/application_controller.rb +170 -147
  6. data/app/controllers/apicasso/crud_controller.rb +246 -245
  7. data/app/controllers/concerns/orderable.rb +45 -45
  8. data/app/models/apicasso/ability.rb +38 -38
  9. data/app/models/apicasso/application_record.rb +6 -6
  10. data/app/models/apicasso/key.rb +25 -25
  11. data/app/models/apicasso/request.rb +8 -8
  12. data/config/routes.rb +14 -14
  13. data/lib/apicasso/active_record_extension.rb +0 -44
  14. data/lib/apicasso/engine.rb +13 -13
  15. data/lib/apicasso/version.rb +3 -3
  16. data/lib/apicasso.rb +15 -13
  17. data/lib/generators/apicasso/install/install_generator.rb +25 -25
  18. data/lib/generators/apicasso/install/templates/create_apicasso_tables.rb +20 -20
  19. data/spec/dummy/Gemfile +56 -0
  20. data/spec/dummy/Gemfile.lock +237 -0
  21. data/spec/dummy/app/controllers/application_controller.rb +1 -1
  22. data/spec/dummy/app/models/used_model.rb +42 -0
  23. data/spec/dummy/app/serializers/used_model_serializer.rb +3 -0
  24. data/spec/dummy/bin/rails +5 -0
  25. data/spec/dummy/bin/rake +5 -0
  26. data/spec/dummy/bin/setup +0 -3
  27. data/spec/dummy/bin/spring +17 -0
  28. data/spec/dummy/bin/update +0 -3
  29. data/spec/dummy/config/application.rb +14 -10
  30. data/spec/dummy/config/cable.yml +1 -1
  31. data/spec/dummy/config/credentials.yml.enc +1 -0
  32. data/spec/dummy/config/database.yml +5 -14
  33. data/spec/dummy/config/environments/development.rb +6 -10
  34. data/spec/dummy/config/environments/production.rb +1 -10
  35. data/spec/dummy/config/initializers/cors.rb +16 -0
  36. data/spec/dummy/config/locales/en.yml +7 -32
  37. data/spec/dummy/config/routes.rb +1 -1
  38. data/{db/migrate/20180826141433_create_apicasso_tables.rb → spec/dummy/db/migrate/20180918134607_create_apicasso_tables.rb} +1 -0
  39. data/spec/dummy/db/migrate/20180918141254_create_used_models.rb +44 -0
  40. data/spec/dummy/db/migrate/20180919130152_create_active_storage_tables.active_storage.rb +26 -0
  41. data/spec/dummy/db/migrate/20180920133933_change_used_model_to_validates.rb +7 -0
  42. data/spec/dummy/db/schema.rb +98 -0
  43. data/spec/dummy/db/seeds.rb +56 -0
  44. data/spec/factories/used_model.rb +28 -0
  45. data/spec/models/used_model_spec.rb +35 -0
  46. data/spec/rails_helper.rb +66 -0
  47. data/spec/requests/requests_spec.rb +227 -0
  48. data/spec/spec_helper.rb +7 -9
  49. data/spec/support/factory_bot.rb +3 -0
  50. metadata +83 -64
  51. data/spec/controllers/apicasso/aplication_controller_spec.rb +0 -18
  52. data/spec/controllers/apicasso/crud_controller_spec.rb +0 -107
  53. data/spec/dummy/app/assets/config/manifest.js +0 -3
  54. data/spec/dummy/app/assets/javascripts/application.js +0 -15
  55. data/spec/dummy/app/assets/javascripts/cable.js +0 -13
  56. data/spec/dummy/app/assets/stylesheets/application.css +0 -15
  57. data/spec/dummy/app/channels/application_cable/channel.rb +0 -4
  58. data/spec/dummy/app/channels/application_cable/connection.rb +0 -4
  59. data/spec/dummy/app/helpers/application_helper.rb +0 -2
  60. data/spec/dummy/app/jobs/application_job.rb +0 -2
  61. data/spec/dummy/app/mailers/application_mailer.rb +0 -4
  62. data/spec/dummy/app/views/layouts/application.html.erb +0 -15
  63. data/spec/dummy/app/views/layouts/mailer.html.erb +0 -13
  64. data/spec/dummy/app/views/layouts/mailer.text.erb +0 -1
  65. data/spec/dummy/bin/yarn +0 -11
  66. data/spec/dummy/config/initializers/assets.rb +0 -14
  67. data/spec/dummy/config/initializers/content_security_policy.rb +0 -25
  68. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -5
  69. data/spec/dummy/log/development.log +0 -0
  70. data/spec/dummy/public/404.html +0 -67
  71. data/spec/dummy/public/422.html +0 -67
  72. data/spec/dummy/public/500.html +0 -66
  73. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  74. data/spec/dummy/public/apple-touch-icon.png +0 -0
  75. data/spec/dummy/public/favicon.ico +0 -0
  76. data/spec/factories/apicasso_key.rb +0 -9
  77. data/spec/factories/object.rb +0 -5
  78. data/spec/models/apicasso/key.rb +0 -5
  79. data/spec/routing/appointments_routing_spec.rb +0 -38
@@ -1,6 +1,6 @@
1
- module Apicasso
2
- class ApplicationRecord < ActiveRecord::Base
3
- self.abstract_class = true
4
- self.table_name_prefix = 'apicasso_'
5
- end
6
- end
1
+ module Apicasso
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ self.table_name_prefix = 'apicasso_'
5
+ end
6
+ end
@@ -1,25 +1,25 @@
1
- # frozen_string_literal: true
2
-
3
- require 'securerandom'
4
- module Apicasso
5
- # A model to abstract API access, with scope options, token generation, request limiting
6
- class Key < Apicasso::ApplicationRecord
7
- before_create :set_auth_token
8
-
9
- private
10
-
11
- # Method that generates `SecureRandom.uuid` as token until
12
- # an unique one has been acquired
13
- def set_auth_token
14
- loop do
15
- self.token = generate_auth_token
16
- break unless self.class.exists?(token: token)
17
- end
18
- end
19
-
20
- # RFC4122 style token
21
- def generate_auth_token
22
- SecureRandom.uuid.delete('-')
23
- end
24
- end
25
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+ module Apicasso
5
+ # A model to abstract API access, with scope options, token generation, request limiting
6
+ class Key < Apicasso::ApplicationRecord
7
+ before_create :set_auth_token
8
+
9
+ private
10
+
11
+ # Method that generates `SecureRandom.uuid` as token until
12
+ # an unique one has been acquired
13
+ def set_auth_token
14
+ loop do
15
+ self.token = generate_auth_token
16
+ break unless self.class.exists?(token: token)
17
+ end
18
+ end
19
+
20
+ # RFC4122 style token
21
+ def generate_auth_token
22
+ SecureRandom.uuid.delete('-')
23
+ end
24
+ end
25
+ end
@@ -1,8 +1,8 @@
1
- # frozen_string_literal: true
2
-
3
- module Apicasso
4
- # A model to abstract API access, with scope options, token generation, request limiting
5
- class Request < Apicasso::ApplicationRecord
6
- belongs_to :api_key, class_name: 'Apicasso::Key'
7
- end
8
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Apicasso
4
+ # A model to abstract API access, with scope options, token generation, request limiting
5
+ class Request < Apicasso::ApplicationRecord
6
+ belongs_to :api_key, class_name: 'Apicasso::Key'
7
+ end
8
+ end
data/config/routes.rb CHANGED
@@ -1,14 +1,14 @@
1
- Apicasso::Engine.routes.draw do
2
- scope module: :apicasso do
3
- resources :apidocs, only: [:index]
4
- get '/:resource/', to: 'crud#index', via: :get
5
- match '/:resource/', to: 'crud#create', via: :post
6
- get '/:resource/:id', to: 'crud#show', via: :get
7
- match '/:resource/:id', to: 'crud#update', via: :patch
8
- match '/:resource/:id', to: 'crud#destroy', via: :delete
9
- match '/:resource/:id/:nested/', to: 'crud#nested_index', via: :get
10
- match '/:resource/', to: 'crud#schema', via: :options
11
- match '/:resource/:id', to: 'crud#schema', via: :options
12
- match '/:resource/:id/:nested/', to: 'crud#schema', via: :options
13
- end
14
- end
1
+ Apicasso::Engine.routes.draw do
2
+ scope module: :apicasso do
3
+ resources :apidocs, only: [:index]
4
+ get '/:resource/', to: 'crud#index', via: :get
5
+ match '/:resource/', to: 'crud#create', via: :post
6
+ get '/:resource/:id', to: 'crud#show', via: :get
7
+ match '/:resource/:id', to: 'crud#update', via: :patch
8
+ match '/:resource/:id', to: 'crud#destroy', via: :delete
9
+ match '/:resource/:id/:nested/', to: 'crud#nested_index', via: :get
10
+ match '/:resource/', to: 'crud#schema', via: :options
11
+ match '/:resource/:id', to: 'crud#schema', via: :options
12
+ match '/:resource/:id/:nested/', to: 'crud#schema', via: :options
13
+ end
14
+ end
@@ -29,50 +29,6 @@ module Apicasso
29
29
  validated_attrs_for(:presence)
30
30
  end
31
31
  end
32
- included do
33
- include ::Swagger::Blocks
34
- @@klass = self
35
- swagger_schema @@klass.name.to_sym do
36
- key :required, %i[*presence_validators] if @@klass.presence_validators?
37
- @@klass.columns_hash.each do |name, type|
38
- property name.to_sym do
39
- key :type, type.type
40
- end
41
- end
42
- end
43
- swagger_schema "#{@@klass.name}Input".to_sym do
44
- allOf do
45
- schema do
46
- key :'$ref', "#{@@klass.name}Input".to_sym
47
- end
48
- schema do
49
- key :required, %i[*presence_validators] if @@klass.presence_validators?
50
- @@klass.columns_hash.each do |name, type|
51
- property name.to_sym do
52
- key :type, type.type
53
- end
54
- end
55
- end
56
- end
57
- end
58
- swagger_schema "#{@@klass.name}Metadata".to_sym do
59
- allOf do
60
- schema do
61
- key :'$ref', "#{@@klass.name}Metadata".to_sym
62
- end
63
- schema do
64
- @@klass.columns_hash.each do |name, type|
65
- property name.to_sym do
66
- key :description, type.type
67
- key :type, :string
68
- end
69
- end
70
- end
71
- end
72
- end
73
- rescue ActiveRecord::ConnectionNotEstablished
74
- puts "No database connection to setup APIcasso routes in documentation"
75
- end
76
32
  end
77
33
  end
78
34
 
@@ -1,13 +1,13 @@
1
- # frozen_string_literal: true
2
-
3
- module Apicasso
4
- # Behavior control for the Apicasso::Engine
5
- class Engine < ::Rails::Engine
6
- config.generators do |g|
7
- g.test_framework :rspec, fixture: false
8
- g.fixture_replacement :factory_girl, dir: 'spec/factories'
9
- g.assets false
10
- g.helper false
11
- end
12
- end
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Apicasso
4
+ # Behavior control for the Apicasso::Engine
5
+ class Engine < ::Rails::Engine
6
+ config.generators do |g|
7
+ g.test_framework :rspec, fixture: false
8
+ g.fixture_replacement :factory_girl, dir: 'spec/factories'
9
+ g.assets false
10
+ g.helper false
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
- module Apicasso
2
- VERSION = '0.4.5'.freeze
3
- end
1
+ module Apicasso
2
+ VERSION = '0.4.6'.freeze
3
+ end
data/lib/apicasso.rb CHANGED
@@ -1,13 +1,15 @@
1
- # frozen_string_literal: true
2
-
3
- require 'cancancan'
4
- require 'swagger/blocks'
5
- require 'ransack'
6
- require 'will_paginate'
7
- require 'apicasso/version'
8
- require 'apicasso/engine'
9
- require 'apicasso/active_record_extension'
10
-
11
- module Apicasso
12
- # Your code goes here...
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'cancancan'
4
+ require 'swagger/blocks'
5
+ require 'ransack'
6
+ require 'will_paginate/array'
7
+ require 'will_paginate'
8
+ require 'apicasso/version'
9
+ require 'apicasso/engine'
10
+ require 'apicasso/active_record_extension'
11
+ require 'friendly_id'
12
+
13
+ module Apicasso
14
+ # Your code goes here...
15
+ end
@@ -1,25 +1,25 @@
1
- require 'rails/generators/migration'
2
-
3
- module Apicasso
4
- module Generators
5
- class InstallGenerator < ::Rails::Generators::Base
6
- include Rails::Generators::Migration
7
- source_root File.expand_path('../templates', __FILE__)
8
- desc 'Add the required migrations to run APIcasso'
9
-
10
- def self.next_migration_number(path)
11
- if @prev_migration_nr
12
- @prev_migration_nr += 1
13
- else
14
- @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
15
- end
16
- @prev_migration_nr.to_s
17
- end
18
-
19
- def copy_migrations
20
- migration_template 'create_apicasso_tables.rb',
21
- 'db/migrate/create_apicasso_tables.rb'
22
- end
23
- end
24
- end
25
- end
1
+ require 'rails/generators/migration'
2
+
3
+ module Apicasso
4
+ module Generators
5
+ class InstallGenerator < ::Rails::Generators::Base
6
+ include Rails::Generators::Migration
7
+ source_root File.expand_path('../templates', __FILE__)
8
+ desc 'Add the required migrations to run APIcasso'
9
+
10
+ def self.next_migration_number(path)
11
+ if @prev_migration_nr
12
+ @prev_migration_nr += 1
13
+ else
14
+ @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
15
+ end
16
+ @prev_migration_nr.to_s
17
+ end
18
+
19
+ def copy_migrations
20
+ migration_template 'create_apicasso_tables.rb',
21
+ 'db/migrate/create_apicasso_tables.rb'
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,20 +1,20 @@
1
- class CreateApicassoTables < ActiveRecord::Migration[5.0]
2
- def change
3
- execute <<-SQL
4
- CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
5
- SQL
6
- create_table :apicasso_keys, id: :uuid do |t|
7
- t.json :scope
8
- t.integer :scope_type
9
- t.json :request_limiting
10
- t.text :token
11
- t.datetime :deleted_at
12
- t.timestamps null: false
13
- end
14
- create_table :apicasso_requests, id: :uuid do |t|
15
- t.text :api_key_id
16
- t.json :object
17
- t.timestamps null: false
18
- end
19
- end
20
- end
1
+ class CreateApicassoTables < ActiveRecord::Migration[5.0]
2
+ def change
3
+ execute <<-SQL
4
+ CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
5
+ SQL
6
+ create_table :apicasso_keys, id: :uuid do |t|
7
+ t.json :scope
8
+ t.integer :scope_type
9
+ t.json :request_limiting
10
+ t.text :token
11
+ t.datetime :deleted_at
12
+ t.timestamps null: false
13
+ end
14
+ create_table :apicasso_requests, id: :uuid do |t|
15
+ t.text :api_key_id
16
+ t.json :object
17
+ t.timestamps null: false
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,56 @@
1
+ source 'https://rubygems.org'
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ ruby '2.5.1'
5
+
6
+ # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
7
+ gem 'rails', '~> 5.2.0'
8
+ # Use postgresql as the database for Active Record
9
+ gem 'pg', '>= 0.18', '< 2.0'
10
+ # Use Puma as the app server
11
+ gem 'puma', '~> 3.11'
12
+ # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
13
+ # gem 'jbuilder', '~> 2.5'
14
+ # Use Redis adapter to run Action Cable in production
15
+ gem 'redis', '~> 4.0'
16
+ # Use ActiveModel has_secure_password
17
+ # gem 'bcrypt', '~> 3.1.7'
18
+
19
+ # Use ActiveStorage variant
20
+ # gem 'mini_magick', '~> 4.8'
21
+
22
+ # Use Capistrano for deployment
23
+ # gem 'capistrano-rails', group: :development
24
+
25
+ # Reduces boot times through caching; required in config/boot.rb
26
+ gem 'bootsnap', '>= 1.1.0', require: false
27
+
28
+ # Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
29
+ # gem 'rack-cors'
30
+
31
+ # gem 'cancancan'
32
+ # gem 'ransack'
33
+ # gem 'will_paginate'
34
+ gem 'apicasso'
35
+ gem 'redis-rails'
36
+ gem 'redis-namespace'
37
+ gem 'active_model_serializers'
38
+
39
+ group :development, :test do
40
+ # Call 'byebug' anywhere in the code to stop execution and get a debugger console
41
+ gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
42
+ gem 'rspec-rails'
43
+ gem 'factory_bot_rails'
44
+ gem 'faker', :git => 'https://github.com/stympy/faker.git', :branch => 'master'
45
+ end
46
+
47
+ group :development do
48
+ gem 'listen', '>= 3.0.5', '< 3.2'
49
+ # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
50
+ gem 'spring'
51
+ gem 'spring-watcher-listen', '~> 2.0.0'
52
+ end
53
+
54
+
55
+ # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
56
+ gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
@@ -0,0 +1,237 @@
1
+ GIT
2
+ remote: https://github.com/stympy/faker.git
3
+ revision: 62b5857970218fc7615deb12d844fc4645c4c69f
4
+ branch: master
5
+ specs:
6
+ faker (1.9.1)
7
+ i18n (>= 0.7)
8
+
9
+ PATH
10
+ remote: ../APIcasso
11
+ specs:
12
+ apicasso (0.4.4)
13
+ cancancan (~> 2.0)
14
+ friendly_id (~> 5.2.0)
15
+ rails (> 5)
16
+ ransack
17
+ swagger-blocks
18
+ will_paginate (~> 3.1.0)
19
+
20
+ GEM
21
+ remote: https://rubygems.org/
22
+ specs:
23
+ actioncable (5.2.1)
24
+ actionpack (= 5.2.1)
25
+ nio4r (~> 2.0)
26
+ websocket-driver (>= 0.6.1)
27
+ actionmailer (5.2.1)
28
+ actionpack (= 5.2.1)
29
+ actionview (= 5.2.1)
30
+ activejob (= 5.2.1)
31
+ mail (~> 2.5, >= 2.5.4)
32
+ rails-dom-testing (~> 2.0)
33
+ actionpack (5.2.1)
34
+ actionview (= 5.2.1)
35
+ activesupport (= 5.2.1)
36
+ rack (~> 2.0)
37
+ rack-test (>= 0.6.3)
38
+ rails-dom-testing (~> 2.0)
39
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
40
+ actionview (5.2.1)
41
+ activesupport (= 5.2.1)
42
+ builder (~> 3.1)
43
+ erubi (~> 1.4)
44
+ rails-dom-testing (~> 2.0)
45
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
46
+ active_model_serializers (0.10.8)
47
+ actionpack (>= 4.1, < 6)
48
+ activemodel (>= 4.1, < 6)
49
+ case_transform (>= 0.2)
50
+ jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
51
+ activejob (5.2.1)
52
+ activesupport (= 5.2.1)
53
+ globalid (>= 0.3.6)
54
+ activemodel (5.2.1)
55
+ activesupport (= 5.2.1)
56
+ activerecord (5.2.1)
57
+ activemodel (= 5.2.1)
58
+ activesupport (= 5.2.1)
59
+ arel (>= 9.0)
60
+ activestorage (5.2.1)
61
+ actionpack (= 5.2.1)
62
+ activerecord (= 5.2.1)
63
+ marcel (~> 0.3.1)
64
+ activesupport (5.2.1)
65
+ concurrent-ruby (~> 1.0, >= 1.0.2)
66
+ i18n (>= 0.7, < 2)
67
+ minitest (~> 5.1)
68
+ tzinfo (~> 1.1)
69
+ arel (9.0.0)
70
+ bootsnap (1.3.2)
71
+ msgpack (~> 1.0)
72
+ builder (3.2.3)
73
+ byebug (10.0.2)
74
+ cancancan (2.3.0)
75
+ case_transform (0.2)
76
+ activesupport
77
+ concurrent-ruby (1.1.1)
78
+ crass (1.0.4)
79
+ diff-lcs (1.3)
80
+ erubi (1.7.1)
81
+ factory_bot (4.11.1)
82
+ activesupport (>= 3.0.0)
83
+ factory_bot_rails (4.11.1)
84
+ factory_bot (~> 4.11.1)
85
+ railties (>= 3.0.0)
86
+ ffi (1.9.25)
87
+ friendly_id (5.2.4)
88
+ activerecord (>= 4.0.0)
89
+ globalid (0.4.1)
90
+ activesupport (>= 4.2.0)
91
+ i18n (1.1.1)
92
+ concurrent-ruby (~> 1.0)
93
+ jsonapi-renderer (0.2.0)
94
+ listen (3.1.5)
95
+ rb-fsevent (~> 0.9, >= 0.9.4)
96
+ rb-inotify (~> 0.9, >= 0.9.7)
97
+ ruby_dep (~> 1.2)
98
+ loofah (2.2.3)
99
+ crass (~> 1.0.2)
100
+ nokogiri (>= 1.5.9)
101
+ mail (2.7.1)
102
+ mini_mime (>= 0.1.1)
103
+ marcel (0.3.3)
104
+ mimemagic (~> 0.3.2)
105
+ method_source (0.9.1)
106
+ mimemagic (0.3.2)
107
+ mini_mime (1.0.1)
108
+ mini_portile2 (2.3.0)
109
+ minitest (5.11.3)
110
+ msgpack (1.2.4)
111
+ nio4r (2.3.1)
112
+ nokogiri (1.8.5)
113
+ mini_portile2 (~> 2.3.0)
114
+ pg (1.1.3)
115
+ puma (3.12.0)
116
+ rack (2.0.5)
117
+ rack-test (1.1.0)
118
+ rack (>= 1.0, < 3)
119
+ rails (5.2.1)
120
+ actioncable (= 5.2.1)
121
+ actionmailer (= 5.2.1)
122
+ actionpack (= 5.2.1)
123
+ actionview (= 5.2.1)
124
+ activejob (= 5.2.1)
125
+ activemodel (= 5.2.1)
126
+ activerecord (= 5.2.1)
127
+ activestorage (= 5.2.1)
128
+ activesupport (= 5.2.1)
129
+ bundler (>= 1.3.0)
130
+ railties (= 5.2.1)
131
+ sprockets-rails (>= 2.0.0)
132
+ rails-dom-testing (2.0.3)
133
+ activesupport (>= 4.2.0)
134
+ nokogiri (>= 1.6)
135
+ rails-html-sanitizer (1.0.4)
136
+ loofah (~> 2.2, >= 2.2.2)
137
+ railties (5.2.1)
138
+ actionpack (= 5.2.1)
139
+ activesupport (= 5.2.1)
140
+ method_source
141
+ rake (>= 0.8.7)
142
+ thor (>= 0.19.0, < 2.0)
143
+ rake (12.3.1)
144
+ ransack (2.1.0)
145
+ actionpack (>= 5.0)
146
+ activerecord (>= 5.0)
147
+ activesupport (>= 5.0)
148
+ i18n
149
+ rb-fsevent (0.10.3)
150
+ rb-inotify (0.9.10)
151
+ ffi (>= 0.5.0, < 2)
152
+ redis (4.0.3)
153
+ redis-actionpack (5.0.2)
154
+ actionpack (>= 4.0, < 6)
155
+ redis-rack (>= 1, < 3)
156
+ redis-store (>= 1.1.0, < 2)
157
+ redis-activesupport (5.0.7)
158
+ activesupport (>= 3, < 6)
159
+ redis-store (>= 1.3, < 2)
160
+ redis-namespace (1.6.0)
161
+ redis (>= 3.0.4)
162
+ redis-rack (2.0.4)
163
+ rack (>= 1.5, < 3)
164
+ redis-store (>= 1.2, < 2)
165
+ redis-rails (5.0.2)
166
+ redis-actionpack (>= 5.0, < 6)
167
+ redis-activesupport (>= 5.0, < 6)
168
+ redis-store (>= 1.2, < 2)
169
+ redis-store (1.6.0)
170
+ redis (>= 2.2, < 5)
171
+ rspec-core (3.8.0)
172
+ rspec-support (~> 3.8.0)
173
+ rspec-expectations (3.8.2)
174
+ diff-lcs (>= 1.2.0, < 2.0)
175
+ rspec-support (~> 3.8.0)
176
+ rspec-mocks (3.8.0)
177
+ diff-lcs (>= 1.2.0, < 2.0)
178
+ rspec-support (~> 3.8.0)
179
+ rspec-rails (3.8.1)
180
+ actionpack (>= 3.0)
181
+ activesupport (>= 3.0)
182
+ railties (>= 3.0)
183
+ rspec-core (~> 3.8.0)
184
+ rspec-expectations (~> 3.8.0)
185
+ rspec-mocks (~> 3.8.0)
186
+ rspec-support (~> 3.8.0)
187
+ rspec-support (3.8.0)
188
+ ruby_dep (1.5.0)
189
+ spring (2.0.2)
190
+ activesupport (>= 4.2)
191
+ spring-watcher-listen (2.0.1)
192
+ listen (>= 2.7, < 4.0)
193
+ spring (>= 1.2, < 3.0)
194
+ sprockets (3.7.2)
195
+ concurrent-ruby (~> 1.0)
196
+ rack (> 1, < 3)
197
+ sprockets-rails (3.2.1)
198
+ actionpack (>= 4.0)
199
+ activesupport (>= 4.0)
200
+ sprockets (>= 3.0.0)
201
+ swagger-blocks (2.0.2)
202
+ thor (0.20.0)
203
+ thread_safe (0.3.6)
204
+ tzinfo (1.2.5)
205
+ thread_safe (~> 0.1)
206
+ websocket-driver (0.7.0)
207
+ websocket-extensions (>= 0.1.0)
208
+ websocket-extensions (0.1.3)
209
+ will_paginate (3.1.6)
210
+
211
+ PLATFORMS
212
+ ruby
213
+
214
+ DEPENDENCIES
215
+ active_model_serializers
216
+ apicasso!
217
+ bootsnap (>= 1.1.0)
218
+ byebug
219
+ factory_bot_rails
220
+ faker!
221
+ listen (>= 3.0.5, < 3.2)
222
+ pg (>= 0.18, < 2.0)
223
+ puma (~> 3.11)
224
+ rails (~> 5.2.0)
225
+ redis (~> 4.0)
226
+ redis-namespace
227
+ redis-rails
228
+ rspec-rails
229
+ spring
230
+ spring-watcher-listen (~> 2.0.0)
231
+ tzinfo-data
232
+
233
+ RUBY VERSION
234
+ ruby 2.5.1p57
235
+
236
+ BUNDLED WITH
237
+ 1.16.6
@@ -1,2 +1,2 @@
1
- class ApplicationController < ActionController::Base
1
+ class ApplicationController < ActionController::API
2
2
  end
@@ -0,0 +1,42 @@
1
+ class UsedModel < ApplicationRecord
2
+ include Rails.application.routes.url_helpers
3
+
4
+ validates :account_id, presence: true
5
+ validates :unit_id, presence: true
6
+ validates :slug, presence: true, uniqueness: true
7
+
8
+ has_one_attached :file_highlighted
9
+ has_many_attached :files
10
+
11
+ extend FriendlyId
12
+ friendly_id :name, use: :slugged
13
+
14
+ def file_highlighted_url
15
+ rails_blob_path(file_highlighted, only_path: true) if nil? { file_highlighted_url = nil }
16
+ end
17
+
18
+ def files_url
19
+ used_model_attachments = self.files.attachments
20
+ urls = []
21
+ used_model_attachments.each do |attachment|
22
+ urls << rails_blob_path(attachment, only_path: true)
23
+ end
24
+ urls
25
+ end
26
+
27
+ def cache_key(*timestamp_names)
28
+ case
29
+ when new_record?
30
+ "#{model_name.cache_key}/new"
31
+ when timestamp_names.any?
32
+ timestamp = max_updated_column_timestamp(timestamp_names = timestamp_attributes_for_update_in_model)
33
+ timestamp = timestamp.utc.to_s(cache_timestamp_format)
34
+ "#{model_name.cache_key}/#{id}-#{timestamp}"
35
+ when timestamp = max_updated_column_timestamp
36
+ timestamp = timestamp.utc.to_s(cache_timestamp_format)
37
+ "#{model_name.cache_key}/#{id}-#{timestamp}"
38
+ else
39
+ "#{model_name.cache_key}/#{id}"
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,3 @@
1
+ class UsedModelSerializer < ActiveModel::Serializer
2
+ cache key: 'cache_key', expires_in: 24.hours
3
+ end
data/spec/dummy/bin/rails CHANGED
@@ -1,4 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
+ begin
3
+ load File.expand_path('../spring', __FILE__)
4
+ rescue LoadError => e
5
+ raise unless e.message.include?('spring')
6
+ end
2
7
  APP_PATH = File.expand_path('../config/application', __dir__)
3
8
  require_relative '../config/boot'
4
9
  require 'rails/commands'