iron_warbler 2.0.7.7 → 2.0.7.9
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/Rakefile +3 -16
- data/app/assets/javascript/iron_warbler/application.js +3 -0
- data/app/assets/stylesheets/iron_warbler/positions.scss +47 -0
- data/app/assets/stylesheets/iron_warbler/strategies.scss +0 -0
- data/app/assets/stylesheets/iron_warbler/utils.css +44 -0
- data/app/controllers/iro/alerts_controller.rb +6 -6
- data/app/controllers/iro/application_controller.rb +3 -2
- data/app/controllers/iro/datapoints_controller.rb +0 -2
- data/app/controllers/iro/positions_controller.rb +62 -0
- data/app/controllers/iro/profiles_controller.rb +0 -2
- data/app/controllers/iro/purses_controller.rb +65 -0
- data/app/controllers/iro/stocks_controller.rb +11 -4
- data/app/controllers/iro/strategies_controller.rb +66 -0
- data/app/models/iro/alert.rb +15 -4
- data/app/models/iro/datapoint.rb +108 -3
- data/app/models/iro/date.rb +10 -0
- data/app/models/iro/option.rb +13 -5
- data/app/models/iro/position.rb +222 -0
- data/app/models/iro/price_item.rb +5 -2
- data/app/models/iro/purse.rb +17 -0
- data/app/models/iro/stock.rb +19 -8
- data/app/models/iro/strategy.rb +38 -0
- data/app/models/tda/option.rb +137 -0
- data/app/views/iro/_analytics.erb +16 -0
- data/app/views/iro/_main_header.haml +23 -0
- data/app/views/iro/alerts/index.haml +1 -1
- data/app/views/iro/positions/_form.haml +59 -0
- data/app/views/iro/positions/_reasons.haml +4 -0
- data/app/views/iro/positions/_table.haml +137 -0
- data/app/views/iro/positions/edit.haml +4 -0
- data/app/views/iro/positions/new.haml +4 -0
- data/app/views/iro/purses/_form.haml +9 -0
- data/app/views/iro/purses/edit.haml +3 -0
- data/app/views/iro/purses/index.haml +11 -0
- data/app/views/iro/purses/show.haml +10 -0
- data/app/views/iro/stocks/_form.haml +4 -0
- data/app/views/iro/strategies/_form.haml +37 -0
- data/app/views/iro/strategies/_header.haml +8 -0
- data/app/views/iro/strategies/_show.haml +18 -0
- data/app/views/iro/strategies/_table.haml +18 -0
- data/app/views/iro/strategies/edit.haml +3 -0
- data/app/views/iro/strategies/new.haml +3 -0
- data/app/views/layouts/iro/application.haml +48 -13
- data/config/initializers/assets.rb +10 -0
- data/config/routes.rb +6 -0
- data/lib/iron_warbler.rb +4 -1
- data/lib/tasks/db_tasks.rake +54 -1
- data/lib/tasks/iro_tasks.rake +35 -0
- data/lib/tasks/iro_tasks.rake-old +128 -0
- metadata +122 -40
- data/app/assets/stylesheets/iron_warbler/main.css +0 -13
- data/app/assets/stylesheets/scaffold.css +0 -80
- data/app/models/iro/application_record.rb +0 -4
- data/app/models/iro/profile.rb +0 -4
- data/app/views/iro/alerts/edit.html.erb +0 -6
- data/app/views/iro/alerts/new.html.erb +0 -5
- data/app/views/iro/alerts/show.html.erb +0 -34
- data/app/views/iro/profiles/_form.html.erb +0 -32
- data/app/views/iro/profiles/edit.html.erb +0 -6
- data/app/views/iro/profiles/index.html.erb +0 -31
- data/app/views/iro/profiles/new.html.erb +0 -5
- data/app/views/iro/profiles/show.html.erb +0 -19
- data/db/migrate/20231210204830_create_iro_profiles.rb +0 -12
- data/db/migrate/20231210205837_create_iro_alerts.rb +0 -16
- data/db/migrate/20231219204329_create_dates.rb +0 -13
- data/db/migrate/20231219205644_create_datapoint.rb +0 -15
- data/db/migrate/20231220193201_create_stocks.rb +0 -11
- data/db/migrate/20231220194903_add_alert_status.rb +0 -5
- data/db/migrate/20231220223730_create_iro_price_item.rb +0 -57
- /data/app/models/tda/{api.rb → stock.rb} +0 -0
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 179360dc9b7500f3725379c3c25e6a43c0f5b4bcf4fff1d16f1b23022fe1e8dc
         | 
| 4 | 
            +
              data.tar.gz: e0800a507ec076cb0f819838c83a01d4ba75130b81fd4c86fe1e2fa1acdc905c
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: '08052f61264a239d4e07bc14564e1f54c624d627c947f1ab7cce88a7e6ddffeaac64d92d91393c8f8842e0d7c8db236f1b0ec589a9b3e9251a00dd17a0f7232e'
         | 
| 7 | 
            +
              data.tar.gz: 29772fd02c33118fb73797a981a4b03d0bbe561ab645623c4fd5abb0dc7fa0f2a6e9c7fd1bcb5cd918c873751d05210574ff38281e1ebfa72656357970dcb468
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -1,18 +1,5 @@ | |
| 1 | 
            -
            require "bundler/setup"
         | 
| 2 1 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
            load "rails/tasks/engine.rake"
         | 
| 2 | 
            +
            require_relative 'test/dummy/config/application'
         | 
| 5 3 |  | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
            require "bundler/gem_tasks"
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            require "rake/testtask"
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            Rake::TestTask.new(:test) do |t|
         | 
| 13 | 
            -
              t.libs << 'test'
         | 
| 14 | 
            -
              t.pattern = 'test/**/*_test.rb'
         | 
| 15 | 
            -
              t.verbose = false
         | 
| 16 | 
            -
            end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
            task default: :test
         | 
| 4 | 
            +
            # Rails.application.initialize!
         | 
| 5 | 
            +
            Rails.application.load_tasks
         | 
| @@ -0,0 +1,47 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            .positions--table {
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              table {
         | 
| 5 | 
            +
                td {
         | 
| 6 | 
            +
                  text-align: center;
         | 
| 7 | 
            +
                }
         | 
| 8 | 
            +
                td.actions,
         | 
| 9 | 
            +
                td.next_position,
         | 
| 10 | 
            +
                td.strategy,
         | 
| 11 | 
            +
                ._ {
         | 
| 12 | 
            +
                  text-align: left;
         | 
| 13 | 
            +
                }
         | 
| 14 | 
            +
                th {
         | 
| 15 | 
            +
                  border: 1px solid red;
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  > * {
         | 
| 18 | 
            +
                    border: 1px solid yellow;
         | 
| 19 | 
            +
                    // background: #ddd;
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                    transform-origin: 0 0;
         | 
| 22 | 
            +
                    rotate: -40deg;
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    padding: .4em 0;
         | 
| 25 | 
            +
                    width: 120px;
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  }
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                }
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                th.begin_price {
         | 
| 32 | 
            +
                  > div {
         | 
| 33 | 
            +
                    background: cyan;
         | 
| 34 | 
            +
                  }
         | 
| 35 | 
            +
                }
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                th.end_delta {
         | 
| 38 | 
            +
                  width: 50px;
         | 
| 39 | 
            +
                }
         | 
| 40 | 
            +
                th.next_position {
         | 
| 41 | 
            +
                  width: 160px;
         | 
| 42 | 
            +
                }
         | 
| 43 | 
            +
                th.next_symbol {
         | 
| 44 | 
            +
                  width: 120px;
         | 
| 45 | 
            +
                }
         | 
| 46 | 
            +
              }
         | 
| 47 | 
            +
            }
         | 
| 
            File without changes
         | 
| @@ -0,0 +1,44 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            /* F */
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            .flex-row {
         | 
| 5 | 
            +
              display: flex;
         | 
| 6 | 
            +
              margin-bottom: 0.4em;
         | 
| 7 | 
            +
            }
         | 
| 8 | 
            +
            .field {
         | 
| 9 | 
            +
              min-width: 100px;
         | 
| 10 | 
            +
              margin-right: 1em;
         | 
| 11 | 
            +
            }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            /* M */
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            .modal-absolute {
         | 
| 16 | 
            +
              border: 1px solid green;
         | 
| 17 | 
            +
              border-radius: 5px;
         | 
| 18 | 
            +
              box-shadow: 2px 2px;
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              padding: 0.5em;
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              position: absolute;
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              min-width: 200px;
         | 
| 25 | 
            +
              width: 400px;
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              min-height: 200px;
         | 
| 28 | 
            +
              height: 300px;
         | 
| 29 | 
            +
              /* overflow: auto; */
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              background: white;
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              z-index: 2;
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            }
         | 
| 36 | 
            +
             | 
| 37 | 
            +
             | 
| 38 | 
            +
             | 
| 39 | 
            +
            /* W */
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            .w-min-50px {
         | 
| 42 | 
            +
              min-width: 50px;
         | 
| 43 | 
            +
            }
         | 
| 44 | 
            +
             | 
| @@ -4,7 +4,8 @@ class Iro::AlertsController < Iro::ApplicationController | |
| 4 4 | 
             
              before_action :set_lists
         | 
| 5 5 |  | 
| 6 6 | 
             
              def create
         | 
| 7 | 
            -
                @alert = Iro::Alert.new | 
| 7 | 
            +
                @alert = Iro::Alert.new params[:alert].permit!
         | 
| 8 | 
            +
                authorize! :create, @alert
         | 
| 8 9 | 
             
                if @alert.save
         | 
| 9 10 | 
             
                  redirect_to action: :index, notice: 'Alert was successfully created.'
         | 
| 10 11 | 
             
                else
         | 
| @@ -14,17 +15,20 @@ class Iro::AlertsController < Iro::ApplicationController | |
| 14 15 |  | 
| 15 16 | 
             
              def destroy
         | 
| 16 17 | 
             
                @alert = Iro::Alert.find(params[:id])
         | 
| 18 | 
            +
                authorize! :destroy, @alert
         | 
| 17 19 | 
             
                @alert.destroy
         | 
| 18 20 | 
             
                redirect_to action: :index, notice: 'Alert was successfully destroyed.'
         | 
| 19 21 | 
             
              end
         | 
| 20 22 |  | 
| 21 23 | 
             
              def index
         | 
| 22 24 | 
             
                @alerts = Iro::Alert.all
         | 
| 25 | 
            +
                authorize! :index, Iro::Alert
         | 
| 23 26 | 
             
              end
         | 
| 24 27 |  | 
| 25 28 | 
             
              def update
         | 
| 26 29 | 
             
                @alert = Iro::Alert.find(params[:id])
         | 
| 27 | 
            -
                 | 
| 30 | 
            +
                authorize! :update, @alert
         | 
| 31 | 
            +
                if @alert.update params[:alert].permit!
         | 
| 28 32 | 
             
                  redirect_to action: :index, notice: 'Alert was successfully updated.'
         | 
| 29 33 | 
             
                else
         | 
| 30 34 | 
             
                  render :edit
         | 
| @@ -36,10 +40,6 @@ class Iro::AlertsController < Iro::ApplicationController | |
| 36 40 | 
             
              ##
         | 
| 37 41 | 
             
              private
         | 
| 38 42 |  | 
| 39 | 
            -
              def alert_params
         | 
| 40 | 
            -
                params.require(:alert).permit(:class_name, :kind, :symbol, :direction, :strike, :profile_id)
         | 
| 41 | 
            -
              end
         | 
| 42 | 
            -
             | 
| 43 43 | 
             
              def set_lists
         | 
| 44 44 | 
             
                # @profiles_list = Wco::Profile.list
         | 
| 45 45 | 
             
                @stocks_list = [[nil,nil]] + Iro::Stock.active.map { |s| [ s.ticker, s.ticker ] }
         | 
| @@ -0,0 +1,62 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            class Iro::PositionsController < Iro::ApplicationController
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              before_action :set_lists
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              def new
         | 
| 7 | 
            +
                @position = Iro::Position.new purse_id: params[:purse_id]
         | 
| 8 | 
            +
                authorize! :new, @posision
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              def create
         | 
| 12 | 
            +
                @position = Iro::Position.new params[:position].permit!
         | 
| 13 | 
            +
                authorize! :create, @position
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                if @position.save
         | 
| 16 | 
            +
                  flash_notice @position
         | 
| 17 | 
            +
                  redirect_to controller: :purses, action: :show, id: @position.purse_id.to_s
         | 
| 18 | 
            +
                else
         | 
| 19 | 
            +
                  flash_alert @position
         | 
| 20 | 
            +
                  redirect_to request.referrer
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              def destroy
         | 
| 25 | 
            +
                @position = Iro::Position.find params[:id]
         | 
| 26 | 
            +
                authorize! :destroy, @position
         | 
| 27 | 
            +
                @position.delete
         | 
| 28 | 
            +
                flash_notice "Probably ok"
         | 
| 29 | 
            +
                redirect_to request.referrer
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              def edit
         | 
| 33 | 
            +
                @position = Iro::Position.find params[:id]
         | 
| 34 | 
            +
                authorize! :edit, @position
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                @strategies_list = Iro::Strategy.for_ticker( @position.ticker ).list
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              def update
         | 
| 40 | 
            +
                @position = Iro::Position.find params[:id]
         | 
| 41 | 
            +
                authorize! :update, @position
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                if @position.update params[:position].permit!
         | 
| 44 | 
            +
                  flash_notice @position
         | 
| 45 | 
            +
                  redirect_to controller: :purses, action: :show, id: @position.purse_id.to_s
         | 
| 46 | 
            +
                else
         | 
| 47 | 
            +
                  flash_alert @position
         | 
| 48 | 
            +
                  redirect_to request.referrer
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              ##
         | 
| 53 | 
            +
              ## private
         | 
| 54 | 
            +
              ##
         | 
| 55 | 
            +
              private
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              def set_lists
         | 
| 58 | 
            +
                @strategies_list = Iro::Strategy.list
         | 
| 59 | 
            +
                @tickers_list = Iro::Stock.tickers_list
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            end
         | 
| @@ -0,0 +1,65 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            class Iro::PursesController < Iro::ApplicationController
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              before_action :set_lists
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              def create
         | 
| 7 | 
            +
                @purse = Iro::Purse.new params[:purse].permit!
         | 
| 8 | 
            +
                authorize! :create, @purse
         | 
| 9 | 
            +
                if @purse.save
         | 
| 10 | 
            +
                  redirect_to action: :index, notice: 'Purse was successfully created.'
         | 
| 11 | 
            +
                else
         | 
| 12 | 
            +
                  render :new
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              def destroy
         | 
| 17 | 
            +
                @purse = Iro::Purse.find(params[:id])
         | 
| 18 | 
            +
                authorize! :destroy, @purse
         | 
| 19 | 
            +
                @purse.destroy
         | 
| 20 | 
            +
                redirect_to action: :index, notice: 'Purse was successfully destroyed.'
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              def edit
         | 
| 24 | 
            +
                @purse = Iro::Purse.find(params[:id])
         | 
| 25 | 
            +
                authorize! :edit, @purse
         | 
| 26 | 
            +
             | 
| 27 | 
            +
             | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              def index
         | 
| 31 | 
            +
                @purses = Iro::Purse.all
         | 
| 32 | 
            +
                authorize! :index, Iro::Purse
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              def show
         | 
| 36 | 
            +
                @purse = Iro::Purse.find(params[:id])
         | 
| 37 | 
            +
                authorize! :show, @purse
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                @positions = Iro::Position.all
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              def update
         | 
| 43 | 
            +
                @purse = Iro::Purse.find(params[:id])
         | 
| 44 | 
            +
                authorize! :update, @purse
         | 
| 45 | 
            +
                if @purse.update params[:purse].permit!
         | 
| 46 | 
            +
                  redirect_to action: :index, notice: 'Purse was successfully updated.'
         | 
| 47 | 
            +
                else
         | 
| 48 | 
            +
                  render :edit
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              ##
         | 
| 53 | 
            +
              ## private
         | 
| 54 | 
            +
              ##
         | 
| 55 | 
            +
              private
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              def set_lists
         | 
| 58 | 
            +
                # @profiles_list = Wco::Profile.list
         | 
| 59 | 
            +
                @stocks_list = [[nil,nil]] + Iro::Stock.active.map { |s| [ s.ticker, s.ticker ] }
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
             | 
| 64 | 
            +
            end
         | 
| 65 | 
            +
             | 
| @@ -4,6 +4,7 @@ class Iro::StocksController < Iro::ApplicationController | |
| 4 4 |  | 
| 5 5 | 
             
              def index
         | 
| 6 6 | 
             
                @stocks = Iro::Stock.all
         | 
| 7 | 
            +
                authorize! :index, Iro::Stock
         | 
| 7 8 | 
             
              end
         | 
| 8 9 |  | 
| 9 10 | 
             
              def show
         | 
| @@ -11,6 +12,7 @@ class Iro::StocksController < Iro::ApplicationController | |
| 11 12 |  | 
| 12 13 | 
             
              def new
         | 
| 13 14 | 
             
                @stock = Iro::Stock.new
         | 
| 15 | 
            +
                authorize! :new, @stock
         | 
| 14 16 | 
             
              end
         | 
| 15 17 |  | 
| 16 18 | 
             
              def edit
         | 
| @@ -18,20 +20,25 @@ class Iro::StocksController < Iro::ApplicationController | |
| 18 20 |  | 
| 19 21 | 
             
              def create
         | 
| 20 22 | 
             
                @stock = Iro::Stock.new(stock_params)
         | 
| 23 | 
            +
                authorize! :create, @stock
         | 
| 21 24 |  | 
| 22 25 | 
             
                if @stock.save
         | 
| 23 | 
            -
                   | 
| 26 | 
            +
                  flash_notice @stock
         | 
| 24 27 | 
             
                else
         | 
| 25 | 
            -
                   | 
| 28 | 
            +
                  flash_alert @stock
         | 
| 26 29 | 
             
                end
         | 
| 30 | 
            +
                redirect_to action: :index
         | 
| 27 31 | 
             
              end
         | 
| 28 32 |  | 
| 29 33 | 
             
              def update
         | 
| 34 | 
            +
                @stock = Iro::Stock.find params[:id]
         | 
| 35 | 
            +
                authorize! :update, @stock
         | 
| 30 36 | 
             
                if @stock.update(stock_params)
         | 
| 31 | 
            -
                   | 
| 37 | 
            +
                  flash_notice @stock
         | 
| 32 38 | 
             
                else
         | 
| 33 | 
            -
                   | 
| 39 | 
            +
                  flash_alert @stock
         | 
| 34 40 | 
             
                end
         | 
| 41 | 
            +
                redirect_to request.referrer
         | 
| 35 42 | 
             
              end
         | 
| 36 43 |  | 
| 37 44 | 
             
              def destroy
         | 
| @@ -0,0 +1,66 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            class Iro::StrategiesController < Iro::ApplicationController
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              before_action :set_lists
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              def new
         | 
| 7 | 
            +
                @strategy = Iro::Strategy.new
         | 
| 8 | 
            +
                authorize! :new, @posision
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              def create
         | 
| 12 | 
            +
                @strategy = Iro::Strategy.new params[:strategy].permit!
         | 
| 13 | 
            +
                authorize! :create, @strategy
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                if @strategy.save
         | 
| 16 | 
            +
                  flash_notice @strategy
         | 
| 17 | 
            +
                else
         | 
| 18 | 
            +
                  flash_alert @strategy
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                redirect_to action: :index
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              def destroy
         | 
| 25 | 
            +
                @strategy = Iro::Strategy.find params[:id]
         | 
| 26 | 
            +
                authorize! :destroy, @strategy
         | 
| 27 | 
            +
                @strategy.delete
         | 
| 28 | 
            +
                flash_notice "Probably ok"
         | 
| 29 | 
            +
                redirect_to request.referrer
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              def edit
         | 
| 33 | 
            +
                @strategy = Iro::Strategy.find params[:id]
         | 
| 34 | 
            +
                authorize! :edit, @strategy
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              def index
         | 
| 38 | 
            +
                authorize! :index, Iro::Strategy
         | 
| 39 | 
            +
                @strategies = Iro::Strategy.all
         | 
| 40 | 
            +
                render '_table'
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              def update
         | 
| 44 | 
            +
                @strategy = Iro::Strategy.find params[:id]
         | 
| 45 | 
            +
                authorize! :update, @strategy
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                if @strategy.update params[:strategy].permit!
         | 
| 48 | 
            +
                  flash_notice @strategy
         | 
| 49 | 
            +
                else
         | 
| 50 | 
            +
                  flash_alert @strategy
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                redirect_to action: :index
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
              ##
         | 
| 57 | 
            +
              ## private
         | 
| 58 | 
            +
              ##
         | 
| 59 | 
            +
              private
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              def set_lists
         | 
| 62 | 
            +
                @strategies_list = Iro::Strategy.list
         | 
| 63 | 
            +
                @tickers_list = Iro::Stock.tickers_list
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            end
         | 
    
        data/app/models/iro/alert.rb
    CHANGED
    
    | @@ -1,6 +1,8 @@ | |
| 1 1 |  | 
| 2 | 
            -
            class Iro::Alert | 
| 3 | 
            -
               | 
| 2 | 
            +
            class Iro::Alert
         | 
| 3 | 
            +
              include Mongoid::Document
         | 
| 4 | 
            +
              include Mongoid::Timestamps
         | 
| 5 | 
            +
              store_in collection: 'iro_alerts'
         | 
| 4 6 |  | 
| 5 7 | 
             
              SLEEP_TIME_SECONDS = Rails.env.production? ? 60 : 15
         | 
| 6 8 |  | 
| @@ -13,11 +15,20 @@ class Iro::Alert < Iro::ApplicationRecord | |
| 13 15 | 
             
              STATUS_ACTIVE   = 'active'
         | 
| 14 16 | 
             
              STATUS_INACTIVE = 'inactive'
         | 
| 15 17 | 
             
              STATUSES        = [ 'active', 'inactive' ]
         | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 18 | 
             
              def self.active
         | 
| 19 19 | 
             
                where( status: STATUS_ACTIVE )
         | 
| 20 20 | 
             
              end
         | 
| 21 21 |  | 
| 22 | 
            +
              field :class_name
         | 
| 23 | 
            +
              validates :class_name, presence: true
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              field :symbol
         | 
| 26 | 
            +
              validates :symbol, presence: true
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              field :direction
         | 
| 29 | 
            +
              validates :direction, presence: true
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              field :strike
         | 
| 32 | 
            +
              validates :strike, presence: true
         | 
| 22 33 |  | 
| 23 34 | 
             
            end
         | 
    
        data/app/models/iro/datapoint.rb
    CHANGED
    
    | @@ -1,5 +1,110 @@ | |
| 1 1 |  | 
| 2 | 
            -
            class Iro::Datapoint < Iro::ApplicationRecord
         | 
| 3 | 
            -
              self.table_name = "iro_datapoints"
         | 
| 4 2 |  | 
| 5 | 
            -
             | 
| 3 | 
            +
            class Iro::Datapoint
         | 
| 4 | 
            +
              include Mongoid::Document
         | 
| 5 | 
            +
              include Mongoid::Timestamps
         | 
| 6 | 
            +
              store_in collection: 'iro_datapoints'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              field :date
         | 
| 9 | 
            +
              field :value, type: Float
         | 
| 10 | 
            +
              field :kind
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def self.test_0trash
         | 
| 13 | 
            +
                add_fields = { '$addFields':  {
         | 
| 14 | 
            +
                  'date_string': {
         | 
| 15 | 
            +
                    '$dateToString': { 'format': "%Y-%m-%d", 'date': "$created_at" }
         | 
| 16 | 
            +
                  }
         | 
| 17 | 
            +
                } }
         | 
| 18 | 
            +
                group = { '$group': {
         | 
| 19 | 
            +
                  '_id': "$date_string",
         | 
| 20 | 
            +
                  'my_doc': { '$first': "$$ROOT" }
         | 
| 21 | 
            +
                } }
         | 
| 22 | 
            +
                group = { '$group': {
         | 
| 23 | 
            +
                  '_id': "$date",
         | 
| 24 | 
            +
                  'my_doc': { '$first': "$$ROOT" }
         | 
| 25 | 
            +
                } }
         | 
| 26 | 
            +
                lookup = { '$lookup': {
         | 
| 27 | 
            +
                  'from':         'iro_dates',
         | 
| 28 | 
            +
                  'localField':   'date_string',
         | 
| 29 | 
            +
                  'foreignField': 'date',
         | 
| 30 | 
            +
                  'as':           'dates',
         | 
| 31 | 
            +
                } }
         | 
| 32 | 
            +
                lookup_merge = { '$replaceRoot': {
         | 
| 33 | 
            +
                  'newRoot': { '$mergeObjects': [
         | 
| 34 | 
            +
                    { '$arrayElemAt': [ "$dates", 0 ] }, "$$ROOT"
         | 
| 35 | 
            +
                  ] }
         | 
| 36 | 
            +
                } }
         | 
| 37 | 
            +
                match = { '$match': {
         | 
| 38 | 
            +
                  'kind': 'some-type',
         | 
| 39 | 
            +
                  'created_at': {
         | 
| 40 | 
            +
                    '$gte': '2023-12-01'.to_datetime,
         | 
| 41 | 
            +
                    '$lte': '2023-12-31'.to_datetime,
         | 
| 42 | 
            +
                  }
         | 
| 43 | 
            +
                } }
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                outs = Iro::Datapoint.collection.aggregate([
         | 
| 46 | 
            +
                  add_fields,
         | 
| 47 | 
            +
                  lookup, lookup_merge,
         | 
| 48 | 
            +
                  match,
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  { '$sort': { 'date_string': 1 } },
         | 
| 51 | 
            +
                  group,
         | 
| 52 | 
            +
                  # { '$replaceRoot': { 'newRoot': "$my_doc" } },
         | 
| 53 | 
            +
                  # { '$project': { '_id': 0, 'date_string': 1, 'value': 1 } },
         | 
| 54 | 
            +
                ])
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                puts! 'result'
         | 
| 57 | 
            +
                pp outs.to_a
         | 
| 58 | 
            +
                # puts! outs.to_a, 'result'
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              def self.test
         | 
| 62 | 
            +
                lookup = { '$lookup': {
         | 
| 63 | 
            +
                  'from':         'iro_datapoints',
         | 
| 64 | 
            +
                  'localField':   'date',
         | 
| 65 | 
            +
                  'foreignField': 'date',
         | 
| 66 | 
            +
                  'pipeline': [
         | 
| 67 | 
            +
                    { '$sort': { 'value': -1 } },
         | 
| 68 | 
            +
                  ],
         | 
| 69 | 
            +
                  'as':           'datapoints',
         | 
| 70 | 
            +
                } }
         | 
| 71 | 
            +
                lookup_merge = { '$replaceRoot': {
         | 
| 72 | 
            +
                  'newRoot': { '$mergeObjects': [
         | 
| 73 | 
            +
                    { '$arrayElemAt': [ "$datapoints", 0 ] }, "$$ROOT"
         | 
| 74 | 
            +
                  ] }
         | 
| 75 | 
            +
                } }
         | 
| 76 | 
            +
             | 
| 77 | 
            +
             | 
| 78 | 
            +
                match = { '$match': {
         | 
| 79 | 
            +
                  'date': {
         | 
| 80 | 
            +
                    '$gte': '2023-12-25',
         | 
| 81 | 
            +
                    '$lte': '2023-12-31',
         | 
| 82 | 
            +
                  }
         | 
| 83 | 
            +
                } }
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                group = { '$group': {
         | 
| 86 | 
            +
                  '_id': "$date",
         | 
| 87 | 
            +
                  'my_doc': { '$first': "$$ROOT" }
         | 
| 88 | 
            +
                } }
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                outs = Iro::Date.collection.aggregate([
         | 
| 91 | 
            +
                  match,
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                  lookup,
         | 
| 94 | 
            +
                  lookup_merge,
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                  group,
         | 
| 97 | 
            +
                  { '$replaceRoot': { 'newRoot': "$my_doc" } },
         | 
| 98 | 
            +
                  # { '$replaceRoot': { 'newRoot': "$my_doc" } },
         | 
| 99 | 
            +
             | 
| 100 | 
            +
             | 
| 101 | 
            +
                  { '$project': { '_id': 0, 'date': 1, 'value': 1 } },
         | 
| 102 | 
            +
                  { '$sort': { 'date': 1 } },
         | 
| 103 | 
            +
                ])
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                puts! 'result'
         | 
| 106 | 
            +
                pp outs.to_a
         | 
| 107 | 
            +
                # puts! outs.to_a, 'result'
         | 
| 108 | 
            +
              end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
            end
         | 
    
        data/app/models/iro/option.rb
    CHANGED
    
    | @@ -1,7 +1,15 @@ | |
| 1 1 |  | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Iro::Option
         | 
| 4 | 
            +
              include Mongoid::Document
         | 
| 5 | 
            +
              include Mongoid::Timestamps
         | 
| 6 | 
            +
              store_in collection: 'iro_options'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              # field :ticker
         | 
| 9 | 
            +
              # validates :ticker, uniqueness: true, presence: true
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              field :symbol
         | 
| 12 | 
            +
              validates :symbol, uniqueness: true, presence: true
         | 
| 13 | 
            +
             | 
| 14 | 
            +
             | 
| 7 15 | 
             
            end
         |