tramway-api 1.4.4 → 1.6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/README.md +69 -1
 - data/app/controllers/tramway/api/application_controller.rb +13 -5
 - data/app/controllers/tramway/api/v1/application_controller.rb +8 -0
 - data/app/controllers/tramway/api/v1/records_controller.rb +3 -3
 - data/app/controllers/tramway/api/v1/user_tokens_controller.rb +2 -1
 - data/app/controllers/tramway/api/v1/users_controller.rb +6 -2
 - data/config/initializers/json_param_key_transform.rb +6 -0
 - data/lib/tramway/api.rb +14 -6
 - data/lib/tramway/api/version.rb +1 -1
 - metadata +3 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 0f21707e10ef82a1c378250e9c82339400ee41739d7a6009001ecd1c8a17c4e0
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 22732d5ad75036e1bf59831171f4d82af30f95805432900df283566b2b24619c
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 313b31746731d79afe528f6100daa910260707e03c4d68d5c0961b6a046591d485006a58e3438b9b3bf4c1dcb7b79009511834b7a58905e293834d679c47bb66
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 6b9a2570cd6b8e68d039de8706d9923651081c010f0a4cebce5347a06f442033b2c3833b7c07194bd4eea3b9bb3a2b7b81d629078d18380df4488f35b90ba63f
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -43,6 +43,7 @@ coming soon... 
     | 
|
| 
       43 
43 
     | 
    
         
             
              gem 'tramway-core'
         
     | 
| 
       44 
44 
     | 
    
         
             
              gem 'state_machine', github: 'seuros/state_machine'
         
     | 
| 
       45 
45 
     | 
    
         
             
              gem 'knock'
         
     | 
| 
      
 46 
     | 
    
         
            +
              gem 'audited'
         
     | 
| 
       46 
47 
     | 
    
         
             
              ```
         
     | 
| 
       47 
48 
     | 
    
         | 
| 
       48 
49 
     | 
    
         
             
            ## Usage
         
     | 
| 
         @@ -82,6 +83,10 @@ t.uuid :uid, default: 'uuid_generate_v4()' 
     | 
|
| 
       82 
83 
     | 
    
         
             
            ```ruby
         
     | 
| 
       83 
84 
     | 
    
         
             
            class User < Tramway::Core::ApplicationRecord
         
     | 
| 
       84 
85 
     | 
    
         
             
              has_secure_password
         
     | 
| 
      
 86 
     | 
    
         
            +
              
         
     | 
| 
      
 87 
     | 
    
         
            +
              def self.from_token_payload(payload)
         
     | 
| 
      
 88 
     | 
    
         
            +
                find_by uid: payload['sub']
         
     | 
| 
      
 89 
     | 
    
         
            +
              end
         
     | 
| 
       85 
90 
     | 
    
         
             
            end
         
     | 
| 
       86 
91 
     | 
    
         
             
            ```
         
     | 
| 
       87 
92 
     | 
    
         | 
| 
         @@ -185,7 +190,9 @@ require 'rails_helper' 
     | 
|
| 
       185 
190 
     | 
    
         | 
| 
       186 
191 
     | 
    
         
             
            RSpec.describe 'Post creating user', type: :feature do
         
     | 
| 
       187 
192 
     | 
    
         
             
              describe 'POST /api/v1/user with model User' do
         
     | 
| 
       188 
     | 
    
         
            -
                let(:attributes)  
     | 
| 
      
 193 
     | 
    
         
            +
                let(:attributes) do
         
     | 
| 
      
 194 
     | 
    
         
            +
                  kebab_case_converter attributes_for :user
         
     | 
| 
      
 195 
     | 
    
         
            +
                end
         
     | 
| 
       189 
196 
     | 
    
         | 
| 
       190 
197 
     | 
    
         
             
                it 'returns created status' do
         
     | 
| 
       191 
198 
     | 
    
         
             
                  post '/api/v1/user', params: { user: attributes }
         
     | 
| 
         @@ -284,6 +291,67 @@ Enabled methods: 
     | 
|
| 
       284 
291 
     | 
    
         
             
            * index
         
     | 
| 
       285 
292 
     | 
    
         
             
            * destroy
         
     | 
| 
       286 
293 
     | 
    
         | 
| 
      
 294 
     | 
    
         
            +
            ### Index
         
     | 
| 
      
 295 
     | 
    
         
            +
             
     | 
| 
      
 296 
     | 
    
         
            +
            Every model you've added in initializer will be able by URL `api/v1/records?model=#{model_class}`.
         
     | 
| 
      
 297 
     | 
    
         
            +
             
     | 
| 
      
 298 
     | 
    
         
            +
            Just update your initializer:
         
     | 
| 
      
 299 
     | 
    
         
            +
             
     | 
| 
      
 300 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 301 
     | 
    
         
            +
            ::Tramway::Api.set_available_models user: { open: %i[create], closed: %i[update index] } # we've added index method
         
     | 
| 
      
 302 
     | 
    
         
            +
            ```
         
     | 
| 
      
 303 
     | 
    
         
            +
             
     | 
| 
      
 304 
     | 
    
         
            +
            Create serializer
         
     | 
| 
      
 305 
     | 
    
         
            +
             
     | 
| 
      
 306 
     | 
    
         
            +
            *app/serializers/user_serializer.rb*
         
     | 
| 
      
 307 
     | 
    
         
            +
             
     | 
| 
      
 308 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 309 
     | 
    
         
            +
            class UserSerializer < Tramway::Core::ApplicationSerializer
         
     | 
| 
      
 310 
     | 
    
         
            +
              attributes :username, :email
         
     | 
| 
      
 311 
     | 
    
         
            +
            end
         
     | 
| 
      
 312 
     | 
    
         
            +
            ```
         
     | 
| 
      
 313 
     | 
    
         
            +
             
     | 
| 
      
 314 
     | 
    
         
            +
            Then write test:
         
     | 
| 
      
 315 
     | 
    
         
            +
             
     | 
| 
      
 316 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 317 
     | 
    
         
            +
            it 'returns status' do
         
     | 
| 
      
 318 
     | 
    
         
            +
              get '/api/v1/records', params: { model: 'User' }, headers: headers
         
     | 
| 
      
 319 
     | 
    
         
            +
             
     | 
| 
      
 320 
     | 
    
         
            +
              expect(response.status).to eq 200
         
     | 
| 
      
 321 
     | 
    
         
            +
            end
         
     | 
| 
      
 322 
     | 
    
         
            +
             
     | 
| 
      
 323 
     | 
    
         
            +
            it 'returns needed count' do
         
     | 
| 
      
 324 
     | 
    
         
            +
              get '/api/v1/records', params: { model: 'User' }, headers: headers
         
     | 
| 
      
 325 
     | 
    
         
            +
             
     | 
| 
      
 326 
     | 
    
         
            +
              expect(json_response[:data].size).to eq User.active.count
         
     | 
| 
      
 327 
     | 
    
         
            +
            end
         
     | 
| 
      
 328 
     | 
    
         
            +
            ```
         
     | 
| 
      
 329 
     | 
    
         
            +
             
     | 
| 
      
 330 
     | 
    
         
            +
            You have your records in JSON API spec.
         
     | 
| 
      
 331 
     | 
    
         
            +
             
     | 
| 
      
 332 
     | 
    
         
            +
            ### Create
         
     | 
| 
      
 333 
     | 
    
         
            +
             
     | 
| 
      
 334 
     | 
    
         
            +
            Production ready
         
     | 
| 
      
 335 
     | 
    
         
            +
             
     | 
| 
      
 336 
     | 
    
         
            +
            Docs coming soon
         
     | 
| 
      
 337 
     | 
    
         
            +
             
     | 
| 
      
 338 
     | 
    
         
            +
            ### Update
         
     | 
| 
      
 339 
     | 
    
         
            +
             
     | 
| 
      
 340 
     | 
    
         
            +
            Production ready
         
     | 
| 
      
 341 
     | 
    
         
            +
             
     | 
| 
      
 342 
     | 
    
         
            +
            Docs coming soon
         
     | 
| 
      
 343 
     | 
    
         
            +
             
     | 
| 
      
 344 
     | 
    
         
            +
            ### Show
         
     | 
| 
      
 345 
     | 
    
         
            +
             
     | 
| 
      
 346 
     | 
    
         
            +
            Production ready
         
     | 
| 
      
 347 
     | 
    
         
            +
             
     | 
| 
      
 348 
     | 
    
         
            +
            Docs coming soon
         
     | 
| 
      
 349 
     | 
    
         
            +
             
     | 
| 
      
 350 
     | 
    
         
            +
            ### Destroy
         
     | 
| 
      
 351 
     | 
    
         
            +
             
     | 
| 
      
 352 
     | 
    
         
            +
            Production ready
         
     | 
| 
      
 353 
     | 
    
         
            +
             
     | 
| 
      
 354 
     | 
    
         
            +
            Docs coming soon
         
     | 
| 
       287 
355 
     | 
    
         | 
| 
       288 
356 
     | 
    
         
             
            ## Contributing
         
     | 
| 
       289 
357 
     | 
    
         
             
            Contribution directions go here.
         
     | 
| 
         @@ -18,7 +18,7 @@ module Tramway 
     | 
|
| 
       18 
18 
     | 
    
         
             
                  protected
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
                  def authenticate
         
     | 
| 
       21 
     | 
    
         
            -
                    return unauthorized  
     | 
| 
      
 21 
     | 
    
         
            +
                    return unauthorized if current_user.nil? || !params[:user_based_model].in?(Tramway::Api.user_based_models)
         
     | 
| 
       22 
22 
     | 
    
         
             
                  end
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
24 
     | 
    
         
             
                  def auth_token
         
     | 
| 
         @@ -30,17 +30,19 @@ module Tramway 
     | 
|
| 
       30 
30 
     | 
    
         
             
                  end
         
     | 
| 
       31 
31 
     | 
    
         | 
| 
       32 
32 
     | 
    
         
             
                  def entity
         
     | 
| 
      
 33 
     | 
    
         
            +
                    user_based_model = params[:user_based_model].constantize
         
     | 
| 
       33 
34 
     | 
    
         
             
                    @entity ||=
         
     | 
| 
       34 
     | 
    
         
            -
                      if  
     | 
| 
       35 
     | 
    
         
            -
                         
     | 
| 
      
 35 
     | 
    
         
            +
                      if user_based_model.respond_to? :from_token_request
         
     | 
| 
      
 36 
     | 
    
         
            +
                        user_based_model.active.from_token_request request
         
     | 
| 
       36 
37 
     | 
    
         
             
                      else
         
     | 
| 
       37 
38 
     | 
    
         
             
                        params[:auth] && find_user_by_auth_attributes
         
     | 
| 
       38 
39 
     | 
    
         
             
                      end
         
     | 
| 
       39 
40 
     | 
    
         
             
                  end
         
     | 
| 
       40 
41 
     | 
    
         | 
| 
       41 
42 
     | 
    
         
             
                  def find_user_by_auth_attributes
         
     | 
| 
       42 
     | 
    
         
            -
                     
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
      
 43 
     | 
    
         
            +
                    user_based_model = params[:user_based_model].constantize
         
     | 
| 
      
 44 
     | 
    
         
            +
                    Tramway::Api.auth_attributes[user_based_model].each do |attribute|
         
     | 
| 
      
 45 
     | 
    
         
            +
                      object = user_based_model.active.where.not(attribute => nil).find_by(attribute => auth_params[:login])
         
     | 
| 
       44 
46 
     | 
    
         
             
                      return object if object
         
     | 
| 
       45 
47 
     | 
    
         
             
                    end
         
     | 
| 
       46 
48 
     | 
    
         
             
                    nil
         
     | 
| 
         @@ -49,6 +51,12 @@ module Tramway 
     | 
|
| 
       49 
51 
     | 
    
         
             
                  def auth_params
         
     | 
| 
       50 
52 
     | 
    
         
             
                    params[:auth]&.permit(:login, :password)
         
     | 
| 
       51 
53 
     | 
    
         
             
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                  def current_user
         
     | 
| 
      
 56 
     | 
    
         
            +
                    Tramway::Api.user_based_models.map do |user_based_model|
         
     | 
| 
      
 57 
     | 
    
         
            +
                      send("current_#{user_based_model.name.underscore}")
         
     | 
| 
      
 58 
     | 
    
         
            +
                    end.compact.first
         
     | 
| 
      
 59 
     | 
    
         
            +
                  end
         
     | 
| 
       52 
60 
     | 
    
         
             
                end
         
     | 
| 
       53 
61 
     | 
    
         
             
              end
         
     | 
| 
       54 
62 
     | 
    
         
             
            end
         
     | 
| 
         @@ -9,6 +9,14 @@ module Tramway 
     | 
|
| 
       9 
9 
     | 
    
         
             
                    def render_error_with_text(text)
         
     | 
| 
       10 
10 
     | 
    
         
             
                      render json: { text: text }, status: :bad_request
         
     | 
| 
       11 
11 
     | 
    
         
             
                    end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                    def snake_case(params)
         
     | 
| 
      
 14 
     | 
    
         
            +
                      hash = {}
         
     | 
| 
      
 15 
     | 
    
         
            +
                      params.each do |attribute, value|
         
     | 
| 
      
 16 
     | 
    
         
            +
                        hash.merge! attribute.to_s.gsub('-', '_') => value
         
     | 
| 
      
 17 
     | 
    
         
            +
                      end
         
     | 
| 
      
 18 
     | 
    
         
            +
                      hash
         
     | 
| 
      
 19 
     | 
    
         
            +
                    end
         
     | 
| 
       12 
20 
     | 
    
         
             
                  end
         
     | 
| 
       13 
21 
     | 
    
         
             
                end
         
     | 
| 
       14 
22 
     | 
    
         
             
              end
         
     | 
| 
         @@ -15,7 +15,7 @@ module Tramway::Api::V1 
     | 
|
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
                def create
         
     | 
| 
       17 
17 
     | 
    
         
             
                  record_form = form_class.new model_class.new
         
     | 
| 
       18 
     | 
    
         
            -
                  if record_form.submit params[:data][:attributes]
         
     | 
| 
      
 18 
     | 
    
         
            +
                  if record_form.submit snake_case params[:data][:attributes]
         
     | 
| 
       19 
19 
     | 
    
         
             
                    render json: record_form.model,
         
     | 
| 
       20 
20 
     | 
    
         
             
                      serializer: serializer_class,
         
     | 
| 
       21 
21 
     | 
    
         
             
                      include: '*',
         
     | 
| 
         @@ -27,7 +27,7 @@ module Tramway::Api::V1 
     | 
|
| 
       27 
27 
     | 
    
         | 
| 
       28 
28 
     | 
    
         
             
                def update
         
     | 
| 
       29 
29 
     | 
    
         
             
                  record_form = form_class.new model_class.active.find params[:id]
         
     | 
| 
       30 
     | 
    
         
            -
                  if record_form.submit params[:data][:attributes]
         
     | 
| 
      
 30 
     | 
    
         
            +
                  if record_form.submit snake_case params[:data][:attributes]
         
     | 
| 
       31 
31 
     | 
    
         
             
                    render json: record_form.model,
         
     | 
| 
       32 
32 
     | 
    
         
             
                      serializer: serializer_class,
         
     | 
| 
       33 
33 
     | 
    
         
             
                      include: '*',
         
     | 
| 
         @@ -68,7 +68,7 @@ module Tramway::Api::V1 
     | 
|
| 
       68 
68 
     | 
    
         | 
| 
       69 
69 
     | 
    
         
             
                def authenticate_user_if_needed
         
     | 
| 
       70 
70 
     | 
    
         
             
                  if action_name.in? Tramway::Api::available_models[model_class.to_s][:closed]&.map(&:to_s) || []
         
     | 
| 
       71 
     | 
    
         
            -
                     
     | 
| 
      
 71 
     | 
    
         
            +
                    current_user
         
     | 
| 
       72 
72 
     | 
    
         
             
                  end
         
     | 
| 
       73 
73 
     | 
    
         
             
                end
         
     | 
| 
       74 
74 
     | 
    
         | 
| 
         @@ -5,9 +5,9 @@ class Tramway::Api::V1::UsersController < ::Tramway::Api::V1::ApplicationControl 
     | 
|
| 
       5 
5 
     | 
    
         
             
              include Tramway::ClassNameHelpers
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
              def create
         
     | 
| 
       8 
     | 
    
         
            -
                user_form = sign_up_form_class_name( 
     | 
| 
      
 8 
     | 
    
         
            +
                user_form = sign_up_form_class_name(user_based_model).new user_based_model.new
         
     | 
| 
       9 
9 
     | 
    
         
             
                # Implement JSON API spec here
         
     | 
| 
       10 
     | 
    
         
            -
                if user_form.submit params[ 
     | 
| 
      
 10 
     | 
    
         
            +
                if user_form.submit snake_case params[user_based_model.name.underscore]
         
     | 
| 
       11 
11 
     | 
    
         
             
                  token = ::Knock::AuthToken.new(payload: { sub: user_form.model.uid }).token
         
     | 
| 
       12 
12 
     | 
    
         
             
                  # FIXME refactor this bullshit
         
     | 
| 
       13 
13 
     | 
    
         
             
                  serialized_user = OpenStruct.new(
         
     | 
| 
         @@ -31,4 +31,8 @@ class Tramway::Api::V1::UsersController < ::Tramway::Api::V1::ApplicationControl 
     | 
|
| 
       31 
31 
     | 
    
         
             
              def sign_up_form_class_name(model_class)
         
     | 
| 
       32 
32 
     | 
    
         
             
                form_class_name "#{model_class}SignUp"
         
     | 
| 
       33 
33 
     | 
    
         
             
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
              def user_based_model
         
     | 
| 
      
 36 
     | 
    
         
            +
                params[:user_based_model].constantize if params[:user_based_model].in? Tramway::Api.user_based_models.map(&:to_s)
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
       34 
38 
     | 
    
         
             
            end
         
     | 
    
        data/lib/tramway/api.rb
    CHANGED
    
    | 
         @@ -4,19 +4,27 @@ module Tramway 
     | 
|
| 
       4 
4 
     | 
    
         
             
              module Api
         
     | 
| 
       5 
5 
     | 
    
         
             
                class << self
         
     | 
| 
       6 
6 
     | 
    
         
             
                  def auth_config
         
     | 
| 
       7 
     | 
    
         
            -
                    @@auth_config ||= { user_model: ::Tramway::User::User, auth_attributes: :email }
         
     | 
| 
      
 7 
     | 
    
         
            +
                    @@auth_config ||= [{ user_model: ::Tramway::User::User, auth_attributes: :email }]
         
     | 
| 
       8 
8 
     | 
    
         
             
                  end
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
                  def auth_config=( 
     | 
| 
       11 
     | 
    
         
            -
                     
     | 
| 
      
 10 
     | 
    
         
            +
                  def auth_config=(params)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    if params.is_a? Hash
         
     | 
| 
      
 12 
     | 
    
         
            +
                      @@auth_config = [params]
         
     | 
| 
      
 13 
     | 
    
         
            +
                    elsif params.is_a? Array
         
     | 
| 
      
 14 
     | 
    
         
            +
                      @@auth_config = params
         
     | 
| 
      
 15 
     | 
    
         
            +
                    end
         
     | 
| 
       12 
16 
     | 
    
         
             
                  end
         
     | 
| 
       13 
17 
     | 
    
         | 
| 
       14 
     | 
    
         
            -
                  def  
     | 
| 
       15 
     | 
    
         
            -
                    @@auth_config 
     | 
| 
      
 18 
     | 
    
         
            +
                  def user_based_models
         
     | 
| 
      
 19 
     | 
    
         
            +
                    @@auth_config.map do |conf|
         
     | 
| 
      
 20 
     | 
    
         
            +
                      conf[:user_model]
         
     | 
| 
      
 21 
     | 
    
         
            +
                    end
         
     | 
| 
       16 
22 
     | 
    
         
             
                  end
         
     | 
| 
       17 
23 
     | 
    
         | 
| 
       18 
24 
     | 
    
         
             
                  def auth_attributes
         
     | 
| 
       19 
     | 
    
         
            -
                    @@auth_config 
     | 
| 
      
 25 
     | 
    
         
            +
                    @@auth_config.reduce({}) do |hash, conf|
         
     | 
| 
      
 26 
     | 
    
         
            +
                      hash.merge! conf[:user_model] => conf[:auth_attributes]
         
     | 
| 
      
 27 
     | 
    
         
            +
                    end
         
     | 
| 
       20 
28 
     | 
    
         
             
                  end
         
     | 
| 
       21 
29 
     | 
    
         | 
| 
       22 
30 
     | 
    
         
             
                  def set_available_models(**models)
         
     | 
    
        data/lib/tramway/api/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: tramway-api
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.6.0.1
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Pavel Kalashnikov
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2019- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2019-10-11 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: knock
         
     | 
| 
         @@ -76,6 +76,7 @@ files: 
     | 
|
| 
       76 
76 
     | 
    
         
             
            - app/serializers/tramway/api/v1/error_serializer.rb
         
     | 
| 
       77 
77 
     | 
    
         
             
            - app/views/layouts/tramway/api/application.html.erb
         
     | 
| 
       78 
78 
     | 
    
         
             
            - config/initializers/active_model_serializers.rb
         
     | 
| 
      
 79 
     | 
    
         
            +
            - config/initializers/json_param_key_transform.rb
         
     | 
| 
       79 
80 
     | 
    
         
             
            - config/routes.rb
         
     | 
| 
       80 
81 
     | 
    
         
             
            - lib/tasks/tramway/api_tasks.rake
         
     | 
| 
       81 
82 
     | 
    
         
             
            - lib/tramway/api.rb
         
     |