2020-09-09 15:18:39 +00:00
Code . eval_file ( " mess.exs " )
2020-11-07 14:05:06 +00:00
defmodule Bonfire.MixProject do
2020-08-05 07:39:59 +00:00
use Mix.Project
2021-12-16 22:56:46 +00:00
@config [ # TODO: put these in ENV or an external writeable config file similar to deps.*
2022-03-06 01:44:43 +00:00
version : " 0.1.0-beta.155 " , # note that the flavour will automatically be added where the dash appears
2021-07-02 08:16:56 +00:00
elixir : " ~> 1.12 " ,
2021-05-16 08:34:50 +00:00
default_flavour : " classic " ,
2021-12-16 22:56:46 +00:00
logo : " assets/static/images/bonfire-icon.png " ,
docs : [
" README.md " ,
" docs/HACKING.md " ,
" docs/DEPLOY.md " ,
" docs/ARCHITECTURE.md " ,
" docs/GRAPHQL.md " ,
2022-02-24 18:39:19 +00:00
" docs/MRF.md " ,
2021-12-16 22:56:46 +00:00
] ,
2021-11-19 00:48:15 +00:00
deps_prefixes : [
2022-03-06 00:32:13 +00:00
docs : [ " bonfire_ " , " pointers " , " paginator " , " ecto_shorts " , " ecto_sparkles " , " absinthe_client " , " activity_pub " , " arrows " , " ecto_materialized_path " , " flexto " , " grumble " , " linkify " , " verbs " , " voodoo " , " waffle " , " zest " ] ,
test : [ " bonfire_ " , " pointers " , " paginator " , " ecto_shorts " , " ecto_sparkles " ] ,
2022-02-17 01:15:39 +00:00
data : [ " bonfire_data_ " , " pointers " , " bonfire_tag " , " bonfire_classify " , " bonfire_geolocate " , " bonfire_boundaries " ]
2021-11-19 00:48:15 +00:00
]
2021-05-16 08:34:50 +00:00
]
2020-08-05 07:39:59 +00:00
def project do
[
2020-11-07 14:05:06 +00:00
app : :bonfire ,
2021-05-16 08:34:50 +00:00
version : version ( ) ,
elixir : @config [ :elixir ] ,
2021-05-15 18:14:06 +00:00
elixirc_paths : elixirc_paths ( Mix . env ( ) ) ,
2021-05-05 13:29:10 +00:00
test_paths : test_paths ( ) ,
2021-10-31 22:07:04 +00:00
compilers : compilers ( Mix . env ( ) ) ,
2020-08-05 07:39:59 +00:00
start_permanent : Mix . env ( ) == :prod ,
aliases : aliases ( ) ,
2021-05-04 17:29:30 +00:00
deps : deps ( ) ,
config_path : config_path ( " config.exs " ) ,
releases : [
2021-05-04 18:09:59 +00:00
bonfire : [ runtime_config_path : config_path ( " runtime.exs " ) ] ,
2021-11-19 00:48:15 +00:00
] ,
2022-03-06 00:32:13 +00:00
source_url : " https://github.com/bonfire-networks/bonfire-app " ,
homepage_url : " https://bonfirenetworks.org " ,
2021-11-19 00:48:15 +00:00
docs : [
# The first page to display from the docs
main : " readme " ,
2021-12-16 22:56:46 +00:00
logo : @config [ :logo ] ,
2021-11-19 00:48:15 +00:00
output : " docs/exdoc " ,
2022-03-06 01:20:38 +00:00
# source_url_pattern: &source_url_pattern/2,
2021-12-16 22:56:46 +00:00
# extra pages to include
extras : readme_paths ( ) ,
2022-03-06 00:32:13 +00:00
# extra apps to include in module docs
2021-12-16 22:56:46 +00:00
source_beam : docs_paths ( ) ,
2022-03-06 00:32:13 +00:00
deps : doc_deps ( ) ,
groups_for_extras : [ # Note: first match wins
" Guides " : Path . wildcard ( " docs/* " ) ,
" Flavours of Bonfire " : Path . wildcard ( " flavours/*/* " ) ,
" Data schemas " : Path . wildcard ( " {deps,forks}/bonfire_data_*/* " ) ,
" UI extensions " : Path . wildcard ( " {deps,forks}/bonfire_ui_*/* " ) ,
" Bonfire utilities " : [ " bonfire_api_graphql " , " bonfire_boundaries " , " bonfire_common " , " bonfire_ecto " , " bonfire_epics " , " bonfire_fail " , " bonfire_files " , " bonfire_mailer " ] |> Enum . flat_map ( & Path . wildcard ( " */ #{ &1 } /* " ) ) ,
" Feature extensions " : Path . wildcard ( " {deps,forks}/bonfire_*/* " ) ,
" Generic utilities " : Path . wildcard ( " {deps,forks}/*/* " ) ,
" Dependencies " : Path . wildcard ( " docs/DEPENDENCIES/* " ) ,
] ,
groups_for_modules : [
" Data schemas " : ~r/ ^Bonfire.Data.? / ,
" UI extensions " : ~r/ ^Bonfire.UI.? / ,
" Bonfire utilities " : [ ~r/ ^Bonfire.API? / , ~r/ ^Bonfire.GraphQL? / , ~r/ ^Bonfire.Repo? / , ~r/ ^Bonfire.Web? / , ~r/ ^Bonfire.Boundaries? / , ~r/ ^Bonfire.Common? / , ~r/ ^Bonfire.Ecto? / , ~r/ ^Bonfire.Epics? / , ~r/ ^Bonfire.Fail? / , ~r/ ^Bonfire.Files? / , ~r/ ^Bonfire.Mailer? / ] ,
" Feature extensions " : [ ~r/ ^Bonfire.? / , ~r/ ^ValueFlows.? / ] ,
" Utilities " : ~r/ .? / ,
] ,
2022-03-06 01:20:38 +00:00
# nest_modules_by_prefix: [
# Bonfire.Data,
# # Bonfire.UI,
# Bonfire,
# ValueFlows
# ]
2021-11-19 00:48:15 +00:00
] ,
2020-08-05 07:39:59 +00:00
]
2021-05-16 08:34:50 +00:00
2020-08-05 07:39:59 +00:00
end
2021-05-05 13:29:10 +00:00
def application do
[
mod : { Bonfire.Application , [ ] } ,
2021-06-04 12:14:45 +00:00
extra_applications : [ :logger , :runtime_tools , :os_mon , :ssl , :bamboo , :bamboo_smtp ]
2021-05-05 13:29:10 +00:00
]
2021-05-04 10:25:25 +00:00
end
2020-12-26 17:01:34 +00:00
2021-05-16 08:34:50 +00:00
defp aliases do
[
" hex.setup " : [ " local.hex --force " ] ,
" rebar.setup " : [ " local.rebar --force " ] ,
2021-06-08 11:37:53 +00:00
" assets.release " : [
2021-06-08 12:39:11 +00:00
" cmd cd ./assets && pnpm build " ,
2021-05-16 08:34:50 +00:00
] ,
2021-10-10 01:02:52 +00:00
" bonfire.seeds " : [
# "phil_columns.seed",
] ,
2022-01-09 10:19:16 +00:00
" bonfire.deps.update " : [ " deps.update " <> deps_to_update ( ) ] ,
" bonfire.deps.clean " : [ " deps.clean " <> deps_to_clean ( ) <> " --build " ] ,
" bonfire.deps.recompile " : [ " deps.compile " <> deps_to_update ( ) <> " --force " ] ,
2021-05-16 08:34:50 +00:00
" bonfire.deps " : [ " bonfire.deps.update " , " bonfire.deps.clean " ] ,
2022-03-06 00:32:13 +00:00
" ecto.seeds " : [
" run #{ flavour_path ( ) } /repo/seeds.exs "
] ,
" js.deps.get " : [ " cmd make js.deps.get " ] ,
" js.deps.update " : [ " cmd cd assets && pnpm update " ] ,
2021-06-25 11:17:01 +00:00
setup : [ " hex.setup " , " rebar.setup " , " deps.get " , " bonfire.deps.clean " , " ecto.setup " ] ,
updates : [ " deps.get " , " bonfire.deps " ] ,
2021-05-16 08:34:50 +00:00
upgrade : [ " updates " , " ecto.migrate " ] ,
2021-11-25 02:21:03 +00:00
" ecto.setup " : [ " ecto.create " , " ecto.migrate " ] ,
" ecto.migrate " : [ " ecto.migrate " , " bonfire.seeds " ] ,
2022-01-09 10:19:16 +00:00
" ecto.reset " : [ " ecto.drop --force " , " ecto.setup " ] ,
2022-03-06 00:32:13 +00:00
test : [ " ecto.create --quiet " , " ecto.migrate --quiet " , " test " ] ,
2021-05-16 08:34:50 +00:00
]
end
2020-12-26 17:01:34 +00:00
defp deps ( ) do
2021-05-04 10:25:25 +00:00
Mess . deps ( mess_sources ( ) , [
2020-12-26 17:01:34 +00:00
## password hashing - builtin vs nif
2021-05-13 20:05:27 +00:00
{ :pbkdf2_elixir , " ~> 1.4 " , only : [ :dev , :test ] } ,
2021-09-25 03:33:45 +00:00
{ :argon2_elixir , " ~> 2.4 " , only : [ :prod ] } ,
2020-12-26 17:01:34 +00:00
## dev conveniences
2021-04-08 18:19:52 +00:00
# {:dbg, "~> 1.0", only: [:dev, :test]},
2021-09-25 03:33:45 +00:00
{ :phoenix_live_reload , " ~> 1.3 " , only : :dev } ,
2021-03-02 14:38:17 +00:00
{ :exsync , " ~> 0.2 " , only : :dev } ,
2021-10-31 22:07:04 +00:00
{ :mix_unused , " ~> 0.3.0 " , only : :dev } ,
2022-03-06 00:32:13 +00:00
{ :ex_doc , " ~> 0.28.2 " , only : [ :dev , :test ] , runtime : false } ,
2022-02-19 08:03:58 +00:00
{ :ecto_erd , " ~> 0.4 " , only : :dev } ,
2022-02-24 18:39:19 +00:00
{ :flame_on , " ~> 0.2.1 " , only : :dev } , # flame graphs in live_dashboard
2021-04-27 10:26:40 +00:00
2020-12-26 17:01:34 +00:00
# tests
{ :floki , " >= 0.0.0 " , only : [ :dev , :test ] } ,
{ :ex_machina , " ~> 2.4 " , only : :test } ,
2021-09-25 03:33:45 +00:00
{ :mock , " ~> 0.3 " , only : :test } ,
2020-12-27 12:44:16 +00:00
{ :zest , " ~> 0.1 " } ,
2021-05-11 12:48:32 +00:00
{ :grumble , " ~> 0.1.3 " , only : [ :test ] , override : true } ,
2021-05-11 13:31:15 +00:00
{ :bonfire_api_graphql , git : " https://github.com/bonfire-networks/bonfire_api_graphql " , branch : " main " , only : [ :test ] } ,
2021-06-10 14:46:57 +00:00
{ :mix_test_watch , " ~> 1.0 " , only : :test , runtime : false } ,
{ :mix_test_interactive , " ~> 1.0 " , only : :test , runtime : false } ,
{ :ex_unit_notifier , " ~> 1.0 " , only : :test } ,
2021-04-27 10:26:40 +00:00
2021-02-18 13:45:59 +00:00
# list dependencies & licenses
2021-02-21 18:52:16 +00:00
{ :licensir , only : :dev , runtime : false ,
2022-02-25 08:13:50 +00:00
git : " https://github.com/bonfire-networks/licensir " , branch : " main " ,
# path: "./forks/licensir"
2021-02-21 18:52:16 +00:00
} ,
2021-04-30 10:58:35 +00:00
2021-02-18 13:45:59 +00:00
# security auditing
# {:mix_audit, "~> 0.1", only: [:dev], runtime: false}
{ :sobelow , " ~> 0.8 " , only : :dev }
2021-05-11 13:31:15 +00:00
]
)
2021-05-16 08:34:50 +00:00
2020-12-26 17:01:34 +00:00
end
2021-10-31 22:07:04 +00:00
defp compilers ( :dev ) do
[ :unused ] ++ compilers ( nil )
end
defp compilers ( _ ) do
[ :phoenix , :gettext ] ++ Mix . compilers ( )
end
2021-10-12 01:27:24 +00:00
def catalogues ( _env ) do
2021-07-28 10:11:11 +00:00
[
" deps/surface/priv/catalogue " ,
2021-10-12 01:27:24 +00:00
dep_path ( " bonfire_ui_social " ) <> " /priv/catalogue "
2021-07-28 10:11:11 +00:00
]
end
2021-06-09 11:42:40 +00:00
def deps ( deps \\ deps ( ) , deps_subtype ) when is_atom ( deps_subtype ) , do :
2021-05-16 08:34:50 +00:00
Enum . filter ( deps , & include_dep? ( deps_subtype , &1 ) )
2020-11-28 12:49:44 +00:00
2021-05-16 08:34:50 +00:00
def flavour_path ( ) , do :
2021-06-08 14:11:02 +00:00
System . get_env ( " FLAVOUR_PATH " , " flavours/ " <> flavour ( ) )
2020-09-09 15:18:39 +00:00
2021-05-16 08:34:50 +00:00
def flavour ( ) , do :
2021-06-08 14:11:02 +00:00
System . get_env ( " FLAVOUR " , @config [ :default_flavour ] )
2020-12-26 17:01:34 +00:00
2021-05-11 13:31:15 +00:00
def config_path ( flavour_path \\ flavour_path ( ) , filename ) ,
2021-05-05 13:29:10 +00:00
do : Path . expand ( Path . join ( [ flavour_path , " config " , filename ] ) )
2021-03-23 08:35:29 +00:00
2022-03-06 00:32:13 +00:00
def forks_path ( ) , do : System . get_env ( " FORKS_PATH " , " forks/ " )
2021-05-16 08:34:50 +00:00
2021-05-05 13:29:10 +00:00
defp mess_sources ( ) do
mess_sources ( System . get_env ( " WITH_FORKS " , " 1 " ) )
|> Enum . map ( fn { k , v } -> { k , config_path ( v ) } end )
end
2021-03-23 08:35:29 +00:00
2021-05-16 08:34:50 +00:00
defp mess_sources ( " 0 " ) , do : [ git : " deps.git " , hex : " deps.hex " ]
defp mess_sources ( _ ) , do : [ path : " deps.path " , git : " deps.git " , hex : " deps.hex " ]
2021-05-05 13:29:10 +00:00
2021-05-11 13:31:15 +00:00
def deps_to_clean ( ) do
2021-05-16 08:34:50 +00:00
deps ( :data )
|> deps_names ( )
2021-05-11 13:31:15 +00:00
end
def deps_to_update ( ) do
2021-05-16 08:34:50 +00:00
deps ( :update )
|> deps_names ( )
|> IO . inspect ( label : " Running Bonfire #{ version ( ) } with configuration from #{ flavour_path ( ) } in #{ Mix . env ( ) } environment. You can run `mix bonfire.deps.update` to update these extensions and dependencies " )
2021-05-11 13:31:15 +00:00
end
2021-06-09 11:42:40 +00:00
def deps_to_localise ( ) do
deps ( :test )
|> Enum . map ( & dep_name / 1 )
end
2021-11-19 00:48:15 +00:00
# Specifies which paths to include in docs
def docs_paths ( ) do
build = Mix.Project . build_path ( )
2021-12-16 22:56:46 +00:00
( [ :bonfire ] ++ deps ( :docs ) )
2021-11-19 00:48:15 +00:00
|> Enum . map ( & docs_path ( &1 , build ) )
end
2021-12-16 22:56:46 +00:00
defp docs_path ( app , build ) , do : Path . join ( [ build , " lib " , dep_name ( app ) , " ebin " ] )
2022-03-06 00:32:13 +00:00
def readme_paths ( ) , do : @config [ :docs ]
++ Enum . map ( Path . wildcard ( " flavours/*/README.md " ) , & flavour_readme / 1 )
++ Enum . map ( Path . wildcard ( " docs/DEPENDENCIES/*.md " ) , & flavour_deps_doc / 1 )
++ Enum . flat_map ( deps ( :docs ) , & readme_path / 1 )
2021-12-17 00:52:46 +00:00
defp readme_path ( dep ) when not is_nil ( dep ) , do : dep_paths ( dep , " README.md " ) |> List . first |> readme_path ( dep )
2022-03-06 00:32:13 +00:00
defp readme_path ( path , dep ) when not is_nil ( path ) , do : [ { path |> String . to_atom , [ filename : " extension- " <> dep_name ( dep ) ] } ]
2021-12-17 00:52:46 +00:00
defp readme_path ( _ , _ ) , do : [ ]
2021-12-16 22:56:46 +00:00
def flavour_readme ( path ) , do : { path |> String . to_atom , [ filename : path |> String . split ( " / " ) |> Enum . at ( 1 ) ] }
2022-03-06 00:32:13 +00:00
def flavour_deps_doc ( path ) , do : { path |> String . to_atom , [ title : path |> String . split ( " / " ) |> Enum . at ( 2 ) |> String . slice ( 0 . . - 4 ) |> String . capitalize ( ) , filename : path |> String . split ( " / " ) |> Enum . at ( 2 ) |> String . slice ( 0 . . - 4 ) |> then ( & " deps- #{ &1 } " ) ] }
2021-12-16 22:56:46 +00:00
defp doc_deps ( ) , do : deps ( :docs ) |> Enum . map ( & doc_dep / 1 ) #[plug: "https://myserver/plug/"]
defp doc_dep ( dep ) , do : { elem ( dep , 0 ) , " ./ " }
2021-11-19 00:48:15 +00:00
2022-03-06 00:32:13 +00:00
def source_url_pattern ( " deps/ " <> _ = path , line ) , do : bonfire_ext_pattern ( path , line )
def source_url_pattern ( " forks/ " <> _ = path , line ) , do : bonfire_ext_pattern ( path , line )
def source_url_pattern ( path , line ) , do : bonfire_app_pattern ( path , line )
defp bonfire_ext_pattern ( path , line ) , do : bonfire_ext_pattern ( path |> String . split ( " / " ) |> Enum . at ( 1 ) , path |> String . split ( " / " ) |> Enum . slice ( 2 . . 1000 ) |> Enum . join ( " / " ) , line )
defp bonfire_ext_pattern ( dep , path , line ) , do : bonfire_app_pattern ( " https://github.com/bonfire-networks/ #{ dep } /blob/main/%{path} # L%{line} " , path , line )
defp bonfire_app_pattern ( path , line ) , do : bonfire_app_pattern ( " https://github.com/bonfire-networks/bonfire-app/blob/main/%{path} # L%{line} " , path , line )
defp bonfire_app_pattern ( pattern , path , line ) , do : pattern |> String . replace ( " %{path} " , path ) |> String . replace ( " %{line} " , line )
2021-05-16 08:34:50 +00:00
# Specifies which paths to include when running tests
defp test_paths ( ) , do : [ " test " | Enum . flat_map ( deps ( :test ) , & dep_paths ( &1 , " test " ) ) ]
# Specifies which paths to compile per environment
defp elixirc_paths ( :test ) , do : [ " lib " , " test/support " | Enum . flat_map ( deps ( :test ) , & dep_paths ( &1 , " test/support " ) ) ]
2021-10-12 01:27:24 +00:00
defp elixirc_paths ( env ) , do : [ " lib " ] ++ catalogues ( env )
2021-05-16 08:34:50 +00:00
defp include_dep? ( :update , dep ) when is_tuple ( dep ) , do : unpinned_git_dep? ( dep )
2021-05-11 13:31:15 +00:00
2021-11-19 01:39:50 +00:00
defp include_dep? ( :docs = type , dep ) , do : String . starts_with? ( dep_name ( dep ) , @config [ :deps_prefixes ] [ type ] ) || git_dep? ( dep )
2021-11-19 00:48:15 +00:00
defp include_dep? ( type , dep ) , do : String . starts_with? ( dep_name ( dep ) , @config [ :deps_prefixes ] [ type ] )
2021-11-19 01:39:50 +00:00
defp git_dep? ( dep ) do
spec = elem ( dep , 1 )
is_list ( spec ) && spec [ :git ]
end
2021-05-11 13:31:15 +00:00
defp unpinned_git_dep? ( dep ) do
spec = elem ( dep , 1 )
is_list ( spec ) && spec [ :git ] && ! spec [ :commit ]
end
2021-05-16 08:34:50 +00:00
defp dep_name ( dep ) when is_tuple ( dep ) , do : elem ( dep , 0 ) |> dep_name ( )
defp dep_name ( dep ) when is_atom ( dep ) , do : Atom . to_string ( dep )
defp dep_name ( dep ) when is_binary ( dep ) , do : dep
def deps_names ( deps ) do
deps
|> Enum . map ( & dep_name / 1 )
|> Enum . join ( " " )
end
2021-05-15 14:28:18 +00:00
defp dep_path ( dep ) when is_binary ( dep ) do
2021-10-12 01:27:24 +00:00
path_if_exists ( forks_path ( ) <> dep )
|| path_if_exists ( Mix.Project . deps_path ( ) <> " / " <> dep |> Path . relative_to ( File . cwd! ) )
|| " . "
2021-05-15 14:28:18 +00:00
end
2021-05-05 13:29:10 +00:00
defp dep_path ( dep ) do
spec = elem ( dep , 1 )
2021-05-15 14:28:18 +00:00
path = if is_list ( spec ) && spec [ :path ] ,
2021-05-08 18:17:50 +00:00
do : spec [ :path ] ,
2021-05-11 12:16:15 +00:00
else : Mix.Project . deps_path ( ) <> " / " <> dep_name ( dep ) |> Path . relative_to ( File . cwd! )
2021-05-15 14:28:18 +00:00
path_if_exists ( path )
2020-12-26 17:01:34 +00:00
end
2021-05-15 14:28:18 +00:00
defp path_if_exists ( path ) , do : if File . exists? ( path ) , do : path
2021-05-05 13:29:10 +00:00
defp dep_paths ( dep , extra ) when is_list ( extra ) , do : Enum . flat_map ( extra , & dep_paths ( dep , &1 ) )
defp dep_paths ( dep , extra ) when is_binary ( extra ) do
2021-05-15 17:33:58 +00:00
dep_path = dep_path ( dep )
2021-05-19 06:42:43 +00:00
if dep_path do
path = Path . join ( dep_path , extra ) |> path_if_exists ( )
if path , do : [ path ] , else : [ ]
else
[ ]
end
2020-12-26 17:01:34 +00:00
end
2021-05-19 08:37:10 +00:00
def version do
@config [ :version ]
|> String . split ( " - " , parts : 2 )
|> List . insert_at ( 1 , flavour ( ) )
|> Enum . join ( " - " )
end
2020-08-05 07:39:59 +00:00
end