Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
20419f2
Add fields which support graph-based complex experiments
x-ji Jun 4, 2022
7148eaa
Add some logic related to graph-based complex experiments
x-ji Jun 4, 2022
f6e5735
Add logic to initialize slot-related fields on Experiment
x-ji Jun 5, 2022
d8d2d4b
Fix Experiment.changeset
x-ji Jun 6, 2022
0aa7066
Code to generate slots from ULC specification
x-ji Jun 6, 2022
b0e307b
Add slot_attempt_counts
x-ji Jun 6, 2022
05dd06b
Add logic to automatically expand the slots
x-ji Jun 6, 2022
d948d4a
Remove slot-related code from Experiment module
x-ji Jun 11, 2022
e501367
Fix update_slots_from_ulc_specification/1
x-ji Jun 11, 2022
95cbc20
Make the functions work. Move free_slot inside of get_next_free_slot
x-ji Jun 11, 2022
98a3f76
Set in_progress together with get_next_free_slot
x-ji Jun 12, 2022
310e8a2
Also update attempt count upon getting the next slot
x-ji Jun 12, 2022
b570817
Use slots in ParticipantSocket
x-ji Jun 12, 2022
2557ce8
Also test expanding plain experiments
x-ji Jun 12, 2022
735278f
Remove :is_dynamic and :is_interactive fields from Experiment
x-ji Jun 12, 2022
18daa7f
Use _ instead of : to separate player
x-ji Jul 3, 2022
3926657
Use credo 1.6
x-ji Jul 3, 2022
1a7f94a
Don't forget to record the number of players specified for each trial
x-ji Jul 3, 2022
e8fd877
Use new format for joining interactive experiments
x-ji Jul 3, 2022
82bb579
WIP Change the way we submit and store ExperimentResults
x-ji Jul 9, 2022
3492ffd
Remove unused field
x-ji Jul 15, 2022
216dfcf
Write up a new ExperimentChannel
x-ji Jul 15, 2022
026a461
Add WaitingQueueWorker
x-ji Aug 5, 2022
b8d5740
Refactoring ParticipantChannel
x-ji Aug 5, 2022
d349892
Fix WaitingQueueWorker
x-ji Aug 5, 2022
88f3f19
Fix migration
x-ji Sep 18, 2022
68db551
WIP
x-ji Sep 26, 2022
8676201
Add credo config
x-ji Sep 26, 2022
43cd5bf
Credo don't fail TODO tags
x-ji Sep 26, 2022
34ac29a
WIP
x-ji Sep 26, 2022
2076a90
Fix ParticipantSocketTest
x-ji Sep 27, 2022
1672667
Fix WaitingQueueWorker
x-ji Sep 27, 2022
6c232d0
Fix pop_participant
x-ji Sep 27, 2022
4a9a778
Fix broadcasting next slot. Fix dequeuing
x-ji Sep 27, 2022
0110d33
Fix test helper
x-ji Sep 29, 2022
ea28217
Mechanism to assign slots to queued participants
x-ji Sep 29, 2022
f8f3c7c
Add :expansion_strategy to experiments
x-ji Sep 29, 2022
3917bc1
Perform expansion within get_all_free_slots/1
x-ji Sep 29, 2022
00e1060
Change around functions related to freeing slots
x-ji Sep 29, 2022
c421aee
Add tests for Slots
x-ji Sep 29, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
210 changes: 210 additions & 0 deletions .credo.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
# This file contains the configuration for Credo and you are probably reading
# this after creating it with `mix credo.gen.config`.
#
# If you find anything wrong or unclear in this file, please report an
# issue on GitHub: https://github.com/rrrene/credo/issues
#
%{
#
# You can have as many configs as you like in the `configs:` field.
configs: [
%{
#
# Run any config using `mix credo -C <name>`. If no config name is given
# "default" is used.
#
name: "default",
#
# These are the files included in the analysis:
files: %{
#
# You can give explicit globs or simply directories.
# In the latter case `**/*.{ex,exs}` will be used.
#
included: [
"lib/",
"src/",
"test/",
"web/",
"apps/*/lib/",
"apps/*/src/",
"apps/*/test/",
"apps/*/web/"
],
excluded: [~r"/_build/", ~r"/deps/", ~r"/node_modules/"]
},
#
# Load and configure plugins here:
#
plugins: [],
#
# If you create your own checks, you must specify the source files for
# them here, so they can be loaded by Credo before running the analysis.
#
requires: [],
#
# If you want to enforce a style guide and need a more traditional linting
# experience, you can change `strict` to `true` below:
#
strict: false,
#
# To modify the timeout for parsing files, change this value:
#
parse_timeout: 5000,
#
# If you want to use uncolored output by default, you can change `color`
# to `false` below:
#
color: true,
#
# You can customize the parameters of any check by adding a second element
# to the tuple.
#
# To disable a check put `false` as second element:
#
# {Credo.Check.Design.DuplicatedCode, false}
#
checks: %{
enabled: [
#
## Consistency Checks
#
{Credo.Check.Consistency.ExceptionNames, []},
{Credo.Check.Consistency.LineEndings, []},
{Credo.Check.Consistency.ParameterPatternMatching, []},
{Credo.Check.Consistency.SpaceAroundOperators, []},
{Credo.Check.Consistency.SpaceInParentheses, []},
{Credo.Check.Consistency.TabsOrSpaces, []},

#
## Design Checks
#
# You can customize the priority of any check
# Priority values are: `low, normal, high, higher`
#
{Credo.Check.Design.AliasUsage,
[priority: :low, if_nested_deeper_than: 2, if_called_more_often_than: 0]},
# You can also customize the exit_status of each check.
# If you don't want TODO comments to cause `mix credo` to fail, just
# set this value to 0 (zero).
#
{Credo.Check.Design.TagTODO, [exit_status: 0]},
{Credo.Check.Design.TagFIXME, []},

#
## Readability Checks
#
{Credo.Check.Readability.AliasOrder, []},
{Credo.Check.Readability.FunctionNames, []},
{Credo.Check.Readability.LargeNumbers, []},
{Credo.Check.Readability.MaxLineLength, false},
{Credo.Check.Readability.ModuleAttributeNames, []},
{Credo.Check.Readability.ModuleDoc, []},
{Credo.Check.Readability.ModuleNames, []},
{Credo.Check.Readability.ParenthesesInCondition, []},
{Credo.Check.Readability.ParenthesesOnZeroArityDefs, []},
{Credo.Check.Readability.PipeIntoAnonymousFunctions, []},
{Credo.Check.Readability.PredicateFunctionNames, []},
{Credo.Check.Readability.PreferImplicitTry, []},
{Credo.Check.Readability.RedundantBlankLines, []},
{Credo.Check.Readability.Semicolons, []},
{Credo.Check.Readability.SpaceAfterCommas, []},
{Credo.Check.Readability.StringSigils, []},
{Credo.Check.Readability.TrailingBlankLine, []},
{Credo.Check.Readability.TrailingWhiteSpace, []},
{Credo.Check.Readability.UnnecessaryAliasExpansion, []},
{Credo.Check.Readability.VariableNames, []},
{Credo.Check.Readability.WithSingleClause, []},

#
## Refactoring Opportunities
#
{Credo.Check.Refactor.Apply, []},
{Credo.Check.Refactor.CondStatements, []},
{Credo.Check.Refactor.CyclomaticComplexity, []},
{Credo.Check.Refactor.FunctionArity, []},
{Credo.Check.Refactor.LongQuoteBlocks, []},
{Credo.Check.Refactor.MatchInCondition, []},
{Credo.Check.Refactor.MapJoin, []},
{Credo.Check.Refactor.NegatedConditionsInUnless, []},
{Credo.Check.Refactor.NegatedConditionsWithElse, []},
{Credo.Check.Refactor.Nesting, []},
{Credo.Check.Refactor.UnlessWithElse, []},
{Credo.Check.Refactor.WithClauses, []},
{Credo.Check.Refactor.FilterFilter, []},
{Credo.Check.Refactor.RejectReject, []},
{Credo.Check.Refactor.RedundantWithClauseResult, []},

#
## Warnings
#
{Credo.Check.Warning.ApplicationConfigInModuleAttribute, []},
{Credo.Check.Warning.BoolOperationOnSameValues, []},
{Credo.Check.Warning.ExpensiveEmptyEnumCheck, []},
{Credo.Check.Warning.IExPry, []},
{Credo.Check.Warning.IoInspect, []},
{Credo.Check.Warning.OperationOnSameValues, []},
{Credo.Check.Warning.OperationWithConstantResult, []},
{Credo.Check.Warning.RaiseInsideRescue, []},
{Credo.Check.Warning.SpecWithStruct, []},
{Credo.Check.Warning.WrongTestFileExtension, []},
{Credo.Check.Warning.UnusedEnumOperation, []},
{Credo.Check.Warning.UnusedFileOperation, []},
{Credo.Check.Warning.UnusedKeywordOperation, []},
{Credo.Check.Warning.UnusedListOperation, []},
{Credo.Check.Warning.UnusedPathOperation, []},
{Credo.Check.Warning.UnusedRegexOperation, []},
{Credo.Check.Warning.UnusedStringOperation, []},
{Credo.Check.Warning.UnusedTupleOperation, []},
{Credo.Check.Warning.UnsafeExec, []}
],
disabled: [
#
# Checks scheduled for next check update (opt-in for now, just replace `false` with `[]`)

#
# Controversial and experimental checks (opt-in, just move the check to `:enabled`
# and be sure to use `mix credo --strict` to see low priority checks)
#
{Credo.Check.Consistency.MultiAliasImportRequireUse, []},
{Credo.Check.Consistency.UnusedVariableNames, []},
{Credo.Check.Design.DuplicatedCode, []},
{Credo.Check.Design.SkipTestWithoutComment, []},
{Credo.Check.Readability.AliasAs, []},
{Credo.Check.Readability.BlockPipe, []},
{Credo.Check.Readability.ImplTrue, []},
{Credo.Check.Readability.MultiAlias, []},
{Credo.Check.Readability.NestedFunctionCalls, []},
{Credo.Check.Readability.SeparateAliasRequire, []},
{Credo.Check.Readability.SingleFunctionToBlockPipe, []},
{Credo.Check.Readability.SinglePipe, []},
{Credo.Check.Readability.Specs, []},
{Credo.Check.Readability.StrictModuleLayout, []},
{Credo.Check.Readability.WithCustomTaggedTuple, []},
{Credo.Check.Refactor.ABCSize, []},
{Credo.Check.Refactor.AppendSingleItem, []},
{Credo.Check.Refactor.DoubleBooleanNegation, []},
{Credo.Check.Refactor.FilterReject, []},
{Credo.Check.Refactor.IoPuts, []},
{Credo.Check.Refactor.MapMap, []},
{Credo.Check.Refactor.ModuleDependencies, []},
{Credo.Check.Refactor.NegatedIsNil, []},
{Credo.Check.Refactor.PipeChainStart, []},
{Credo.Check.Refactor.RejectFilter, []},
{Credo.Check.Refactor.VariableRebinding, []},
{Credo.Check.Warning.LazyLogging, []},
{Credo.Check.Warning.LeakyEnvironment, []},
{Credo.Check.Warning.MapGetUnsafePass, []},
{Credo.Check.Warning.MixEnv, []},
{Credo.Check.Warning.UnsafeToAtom, []}

# {Credo.Check.Refactor.MapInto, []},

#
# Custom checks can be created using `mix credo.gen.check`.
#
]
}
}
]
}
34 changes: 31 additions & 3 deletions lib/magpie/application.ex
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
defmodule Magpie.Application do
@moduledoc false
use Application

alias Magpie.Repo

# See http://elixir-lang.org/docs/stable/elixir/Application.html
# for more information on OTP Applications
def start(_type, _args) do
Expand All @@ -21,14 +24,39 @@ defmodule Magpie.Application do
# worker(Magpie.Worker, [arg1, arg2, arg3]),
# Starts a worker by calling: Magpie.Worker.start_link(arg)
# {Magpie.Worker, arg},
{Magpie.Experiments.ExperimentStatusResetWorker, []},
{Magpie.Experiments.ChannelWatcher, :participants}
# {Magpie.Experiments.ExperimentStatusResetWorker, []},
{Magpie.Experiments.ChannelWatcher, :participants},
{Magpie.Experiments.WaitingQueueWorker, []}
# {Magpie.Experiments.AssignExperimentSlotsWorker, []}

# Registry for keeping track of the workers. Not useful with the current implementation.
# {Registry, keys: :unique, name: Magpie.Registry},
# DynamicSupervisor to supervise the workers. Not useful with the current implementation.
# {DynamicSupervisor, strategy: :one_for_one, name: Magpie.DynamicSupervisor},
]

# See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: Magpie.Supervisor]
Supervisor.start_link(children, opts)
result = Supervisor.start_link(children, opts)

# Let's first try out the simpler setup where there's only one worker globally for both types.
# We can go on to use dynamic supervisors later if the single worker can't handle the traffic.
# experiments = Magpie.Repo.all(Magpie.Experiments.Experiment)

# Enum.each(experiments, fn experiment ->
# DynamicSupervisor.start_child(
# Magpie.DynamicSupervisor,
# {Magpie.Experiments.AssignExperimentSlotsWorker, experiment.id}
# )

# DynamicSupervisor.start_child(
# Magpie.DynamicSupervisor,
# {Magpie.Experiments.WaitingQueueWorker, experiment.id}
# )
# end)

result
end

# Tell Phoenix to update the endpoint configuration
Expand Down
Loading