bullishpy 0.48.0__tar.gz → 0.50.0__tar.gz

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.
Files changed (60) hide show
  1. {bullishpy-0.48.0 → bullishpy-0.50.0}/PKG-INFO +1 -1
  2. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/analysis/analysis.py +4 -2
  3. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/analysis/predefined_filters.py +7 -0
  4. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/app/app.py +5 -3
  5. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/jobs/models.py +3 -1
  6. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/jobs/tasks.py +28 -1
  7. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/utils/checks.py +2 -17
  8. {bullishpy-0.48.0 → bullishpy-0.50.0}/pyproject.toml +1 -1
  9. {bullishpy-0.48.0 → bullishpy-0.50.0}/README.md +0 -0
  10. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/__init__.py +0 -0
  11. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/analysis/__init__.py +0 -0
  12. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/analysis/backtest.py +0 -0
  13. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/analysis/constants.py +0 -0
  14. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/analysis/filter.py +0 -0
  15. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/analysis/functions.py +0 -0
  16. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/analysis/indicators.py +0 -0
  17. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/analysis/industry_views.py +0 -0
  18. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/app/__init__.py +0 -0
  19. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/cli.py +0 -0
  20. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/__init__.py +0 -0
  21. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/README +0 -0
  22. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/alembic.ini +0 -0
  23. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/env.py +0 -0
  24. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/script.py.mako +0 -0
  25. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/037dbd721317_.py +0 -0
  26. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/040b15fba458_.py +0 -0
  27. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/08ac1116e055_.py +0 -0
  28. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/11d35a452b40_.py +0 -0
  29. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/12889a2cbd7d_.py +0 -0
  30. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/17e51420e7ad_.py +0 -0
  31. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/49c83f9eb5ac_.py +0 -0
  32. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/4b0a2f40b7d3_.py +0 -0
  33. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/4ee82b171449_.py +0 -0
  34. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/5b10ee7604c1_.py +0 -0
  35. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/6d252e23f543_.py +0 -0
  36. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/73564b60fe24_.py +0 -0
  37. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/79bc71ec6f9e_.py +0 -0
  38. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/ae444f338124_.py +0 -0
  39. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/b76079e9845f_.py +0 -0
  40. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/bf6b86dd5463_.py +0 -0
  41. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/d0e58e050845_.py +0 -0
  42. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/d663166c531d_.py +0 -0
  43. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/ec25c8fa449f_.py +0 -0
  44. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/ee5baabb35f8_.py +0 -0
  45. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/fc191121f522_.py +0 -0
  46. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/alembic/versions/ff0cc4ba40ec_.py +0 -0
  47. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/crud.py +0 -0
  48. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/schemas.py +0 -0
  49. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/scripts/create_revision.py +0 -0
  50. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/scripts/stamp.py +0 -0
  51. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/scripts/upgrade.py +0 -0
  52. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/database/settings.py +0 -0
  53. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/exceptions.py +0 -0
  54. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/figures/__init__.py +0 -0
  55. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/figures/figures.py +0 -0
  56. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/interface/__init__.py +0 -0
  57. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/interface/interface.py +0 -0
  58. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/jobs/__init__.py +0 -0
  59. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/jobs/app.py +0 -0
  60. {bullishpy-0.48.0 → bullishpy-0.50.0}/bullish/utils/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bullishpy
3
- Version: 0.48.0
3
+ Version: 0.50.0
4
4
  Summary:
5
5
  Author: aan
6
6
  Author-email: andoludovic.andriamamonjy@gmail.com
@@ -530,8 +530,10 @@ class SubjectAnalysis(BaseModel):
530
530
 
531
531
  def compute_upside(self, last_price: float) -> None:
532
532
  if self.high_price_target is not None:
533
- self.upside = (float(self.high_price_target) - float(last_price)) / float(
534
- last_price
533
+ self.upside = (
534
+ (float(self.high_price_target) - float(last_price))
535
+ * 100
536
+ / float(last_price)
535
537
  )
536
538
 
537
539
  def to_news(self) -> Optional[str]:
@@ -164,6 +164,13 @@ SMALL_CAP = NamedFilterQuery(
164
164
  market_capitalization=[5e7, 5e8],
165
165
  properties=["positive_debt_to_equity"],
166
166
  average_volume_30=[50000, 5e9],
167
+ volume_above_average=DATE_THRESHOLD,
168
+ sma_50_above_sma_200=[
169
+ datetime.date.today() - datetime.timedelta(days=5000),
170
+ datetime.date.today(),
171
+ ],
172
+ weekly_growth=[1, 100],
173
+ monthly_growth=[8, 100],
167
174
  order_by_desc="market_capitalization",
168
175
  ).variants()
169
176
 
@@ -27,14 +27,13 @@ from bullish.analysis.filter import (
27
27
  GeneralFilter,
28
28
  TechnicalAnalysisFilters,
29
29
  )
30
- from bullish.jobs.tasks import update, news, analysis
30
+ from bullish.jobs.tasks import update, news, analysis, initialize
31
31
  from pydantic import BaseModel
32
32
 
33
33
  from bullish.utils.checks import (
34
34
  compatible_bearish_database,
35
35
  compatible_bullish_database,
36
36
  empty_analysis_table,
37
- DataBaseSingleTon,
38
37
  )
39
38
 
40
39
  CACHE_SHELVE = "user_cache"
@@ -421,7 +420,10 @@ def main() -> None:
421
420
  if st.session_state.database_path is None:
422
421
  dialog_pick_database()
423
422
  bearish_db_ = bearish_db(st.session_state.database_path)
424
- DataBaseSingleTon(path=st.session_state.database_path)
423
+ initialize(
424
+ database_path=st.session_state.database_path,
425
+ job_type="Initialize",
426
+ )
425
427
  charts_tab, jobs_tab = st.tabs(["Charts", "Jobs"])
426
428
  if "data" not in st.session_state:
427
429
  st.session_state.data = load_analysis_data(bearish_db_)
@@ -4,7 +4,9 @@ from typing import Literal, get_args
4
4
  import pandas as pd
5
5
  from pydantic import BaseModel, Field
6
6
 
7
- JobType = Literal["Update data", "Update analysis", "Fetching news", "backtest signals"]
7
+ JobType = Literal[
8
+ "Update data", "Update analysis", "Fetching news", "backtest signals", "Initialize"
9
+ ]
8
10
  JobStatus = Literal["Completed", "Failed", "Running", "Started"]
9
11
  StatusIcon = ["✅ Completed", "❌ Failed", "🔄 Running", "🚀 Started"]
10
12
 
@@ -18,11 +18,26 @@ from ..analysis.industry_views import compute_industry_view
18
18
  from ..analysis.predefined_filters import predefined_filters, load_custom_filters
19
19
  from ..database.crud import BullishDb
20
20
  from bullish.analysis.filter import FilterUpdate
21
- from ..utils.checks import DataBaseSingleTon
22
21
 
23
22
  logger = logging.getLogger(__name__)
24
23
 
25
24
 
25
+ class DataBaseSingleTon:
26
+ _instance = None
27
+
28
+ def __new__(cls, *args: Any, **kwargs: Any) -> Any:
29
+ if cls._instance is None:
30
+ cls._instance = super().__new__(cls)
31
+ return cls._instance
32
+
33
+ def __init__(self, path: Optional[Path] = None) -> None:
34
+ if not hasattr(self, "path"): # Only set once
35
+ self.path = path
36
+
37
+ def valid(self) -> bool:
38
+ return hasattr(self, "path") and self.path is not None
39
+
40
+
26
41
  def job_tracker(func: Callable[..., Any]) -> Callable[..., Any]:
27
42
  @functools.wraps(func)
28
43
  def wrapper(
@@ -75,6 +90,18 @@ def _base_update(
75
90
  compute_industry_view(bullish_db)
76
91
 
77
92
 
93
+ @huey.task(context=True) # type: ignore
94
+ @job_tracker
95
+ def initialize(
96
+ database_path: Path,
97
+ job_type: JobType,
98
+ task: Optional[Task] = None,
99
+ ) -> None:
100
+ database = DataBaseSingleTon(path=database_path)
101
+ if not database.valid():
102
+ raise ValueError("Database path is not valid.")
103
+
104
+
78
105
  @huey.task(context=True) # type: ignore
79
106
  @job_tracker
80
107
  def update(
@@ -2,9 +2,10 @@ import sqlite3
2
2
  from contextlib import contextmanager
3
3
  from pathlib import Path
4
4
  from sqlite3 import Connection
5
- from typing import List, Generator, Optional, Any
5
+ from typing import Generator, List
6
6
 
7
7
  from bearish.database.schemas import * # type: ignore # noqa: F403
8
+
8
9
  from bullish.database.schemas import * # noqa: F403
9
10
 
10
11
 
@@ -64,19 +65,3 @@ def compatible_bearish_database(database_path: Path) -> bool:
64
65
 
65
66
  def compatible_bullish_database(database_path: Path) -> bool:
66
67
  return _compatible_table(database_path, "bullish.database.schemas")
67
-
68
-
69
- class DataBaseSingleTon:
70
- _instance = None
71
-
72
- def __new__(cls, *args: Any, **kwargs: Any) -> Any:
73
- if cls._instance is None:
74
- cls._instance = super().__new__(cls)
75
- return cls._instance
76
-
77
- def __init__(self, path: Optional[Path] = None) -> None:
78
- if not hasattr(self, "path"): # Only set once
79
- self.path = path
80
-
81
- def valid(self) -> bool:
82
- return hasattr(self, "path")
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "bullishpy"
3
- version = "0.48.0"
3
+ version = "0.50.0"
4
4
  description = ""
5
5
  authors = ["aan <andoludovic.andriamamonjy@gmail.com>"]
6
6
  readme = "README.md"
File without changes
File without changes