earningscall 0.0.8__tar.gz → 0.0.10__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 (38) hide show
  1. {earningscall-0.0.8 → earningscall-0.0.10}/PKG-INFO +32 -5
  2. {earningscall-0.0.8 → earningscall-0.0.10}/README.md +10 -4
  3. {earningscall-0.0.8 → earningscall-0.0.10}/earningscall/__init__.py +1 -1
  4. {earningscall-0.0.8 → earningscall-0.0.10}/earningscall/api.py +15 -7
  5. {earningscall-0.0.8 → earningscall-0.0.10}/earningscall/errors.py +0 -4
  6. {earningscall-0.0.8 → earningscall-0.0.10}/earningscall/exports.py +9 -5
  7. {earningscall-0.0.8 → earningscall-0.0.10}/earningscall/symbols.py +2 -2
  8. {earningscall-0.0.8 → earningscall-0.0.10}/earningscall/transcript.py +1 -0
  9. {earningscall-0.0.8 → earningscall-0.0.10}/pyproject.toml +2 -1
  10. earningscall-0.0.10/scripts/list_companies.py +24 -0
  11. earningscall-0.0.10/setup.cfg +2 -0
  12. earningscall-0.0.8/scripts/list_all_companies.py +0 -8
  13. earningscall-0.0.8/tests/test_simple.py +0 -27
  14. {earningscall-0.0.8 → earningscall-0.0.10}/.github/workflows/release.yml +0 -0
  15. {earningscall-0.0.8 → earningscall-0.0.10}/.gitignore +0 -0
  16. {earningscall-0.0.8 → earningscall-0.0.10}/.python-version +0 -0
  17. {earningscall-0.0.8 → earningscall-0.0.10}/CHANGELOG.md +0 -0
  18. {earningscall-0.0.8 → earningscall-0.0.10}/DEVELOPMENT.md +0 -0
  19. {earningscall-0.0.8 → earningscall-0.0.10}/LICENSE +0 -0
  20. {earningscall-0.0.8 → earningscall-0.0.10}/TODO.md +0 -0
  21. {earningscall-0.0.8 → earningscall-0.0.10}/earningscall/company.py +0 -0
  22. {earningscall-0.0.8 → earningscall-0.0.10}/earningscall/event.py +1 -1
  23. {earningscall-0.0.8 → earningscall-0.0.10}/earningscall/sectors.py +0 -0
  24. {earningscall-0.0.8 → earningscall-0.0.10}/earningscall/utils.py +0 -0
  25. {earningscall-0.0.8 → earningscall-0.0.10}/requirements-dev.lock +0 -0
  26. {earningscall-0.0.8 → earningscall-0.0.10}/requirements.lock +0 -0
  27. {earningscall-0.0.8 → earningscall-0.0.10}/scripts/get_all_company_transcripts.py +0 -0
  28. {earningscall-0.0.8 → earningscall-0.0.10}/scripts/get_single_transcript.py +0 -0
  29. {earningscall-0.0.8 → earningscall-0.0.10}/tests/data/demo-symbols-v2-alpha.yaml +0 -0
  30. {earningscall-0.0.8 → earningscall-0.0.10}/tests/data/demo-symbols-v2.yaml +0 -0
  31. {earningscall-0.0.8 → earningscall-0.0.10}/tests/data/msft-transcript-response.yaml +0 -0
  32. {earningscall-0.0.8 → earningscall-0.0.10}/tests/data/symbols-v2.yaml +0 -0
  33. {earningscall-0.0.8 → earningscall-0.0.10}/tests/data/symbols.txt +0 -0
  34. {earningscall-0.0.8 → earningscall-0.0.10}/tests/data/symbols.yaml +0 -0
  35. {earningscall-0.0.8 → earningscall-0.0.10}/tests/test_earnings_event.py +0 -0
  36. {earningscall-0.0.8 → earningscall-0.0.10}/tests/test_get_transcript.py +0 -0
  37. {earningscall-0.0.8 → earningscall-0.0.10}/tests/test_helper.py +0 -0
  38. {earningscall-0.0.8 → earningscall-0.0.10}/tests/test_symbols.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: earningscall
3
- Version: 0.0.8
3
+ Version: 0.0.10
4
4
  Summary: The EarningsCall Python library.
5
5
  Project-URL: Homepage, https://earningscall.biz
6
6
  Project-URL: Documentation, https://github.com/EarningsCall/earningscall-python
@@ -9,6 +9,27 @@ Project-URL: Issues, https://github.com/EarningsCall/earningscall-python/issues
9
9
  Project-URL: Source, https://github.com/EarningsCall/earningscall-python
10
10
  Project-URL: Changelog, https://github.com/EarningsCall/earningscall-python/blob/master/CHANGELOG.md
11
11
  Author-email: EarningsCall <dev@earningscall.biz>
12
+ License: MIT License
13
+
14
+ Copyright (c) 2024 EarningsCall
15
+
16
+ Permission is hereby granted, free of charge, to any person obtaining a copy
17
+ of this software and associated documentation files (the "Software"), to deal
18
+ in the Software without restriction, including without limitation the rights
19
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20
+ copies of the Software, and to permit persons to whom the Software is
21
+ furnished to do so, subject to the following conditions:
22
+
23
+ The above copyright notice and this permission notice shall be included in all
24
+ copies or substantial portions of the Software.
25
+
26
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32
+ SOFTWARE.
12
33
  License-File: LICENSE
13
34
  Requires-Python: >=3.8
14
35
  Requires-Dist: dataclasses-json>=0.6.4
@@ -44,7 +65,6 @@ pip install --upgrade earningscall
44
65
  ```python
45
66
  from earningscall import get_company
46
67
 
47
-
48
68
  company = get_company("aapl") # Lookup Apple, Inc by its ticker symbol, "AAPL"
49
69
 
50
70
  transcript = company.get_transcript(year=2021, quarter=3)
@@ -64,7 +84,6 @@ Apple Inc. Q3 2021 Transcript Text: "Good day, and welcome to the Apple Q3 FY 20
64
84
  ```python
65
85
  from earningscall import get_company
66
86
 
67
-
68
87
  company = get_company("aapl") # Lookup Apple, Inc by its ticker symbol, "AAPL"
69
88
 
70
89
  print(f"Getting all transcripts for: {company}..")
@@ -94,8 +113,6 @@ Getting all transcripts for: Apple Inc...
94
113
  ...
95
114
  ```
96
115
 
97
-
98
-
99
116
  ## List All Companies
100
117
 
101
118
  ```python
@@ -125,3 +142,13 @@ Alternatively, you can pass in your API key as an environment variable:
125
142
  export ECALL_API_KEY="YOUR SECRET API KEY GOES HERE"
126
143
  python your-python-script.py
127
144
  ```
145
+
146
+ ## List S&P 500 Companies
147
+
148
+ ```python
149
+ from earningscall import get_sp500_companies
150
+
151
+ for company in get_sp500_companies():
152
+ print(f"{company.company_info} -- {company.company_info.sector} -- {company.company_info.industry}")
153
+ ```
154
+
@@ -26,7 +26,6 @@ pip install --upgrade earningscall
26
26
  ```python
27
27
  from earningscall import get_company
28
28
 
29
-
30
29
  company = get_company("aapl") # Lookup Apple, Inc by its ticker symbol, "AAPL"
31
30
 
32
31
  transcript = company.get_transcript(year=2021, quarter=3)
@@ -46,7 +45,6 @@ Apple Inc. Q3 2021 Transcript Text: "Good day, and welcome to the Apple Q3 FY 20
46
45
  ```python
47
46
  from earningscall import get_company
48
47
 
49
-
50
48
  company = get_company("aapl") # Lookup Apple, Inc by its ticker symbol, "AAPL"
51
49
 
52
50
  print(f"Getting all transcripts for: {company}..")
@@ -76,8 +74,6 @@ Getting all transcripts for: Apple Inc...
76
74
  ...
77
75
  ```
78
76
 
79
-
80
-
81
77
  ## List All Companies
82
78
 
83
79
  ```python
@@ -107,3 +103,13 @@ Alternatively, you can pass in your API key as an environment variable:
107
103
  export ECALL_API_KEY="YOUR SECRET API KEY GOES HERE"
108
104
  python your-python-script.py
109
105
  ```
106
+
107
+ ## List S&P 500 Companies
108
+
109
+ ```python
110
+ from earningscall import get_sp500_companies
111
+
112
+ for company in get_sp500_companies():
113
+ print(f"{company.company_info} -- {company.company_info.sector} -- {company.company_info.industry}")
114
+ ```
115
+
@@ -1,6 +1,6 @@
1
1
  from typing import Optional
2
2
 
3
+ from earningscall.exports import get_company, get_all_companies, get_sp500_companies
3
4
  from earningscall.symbols import Symbols, load_symbols
4
- from earningscall.exports import get_company, get_all_companies
5
5
 
6
6
  api_key: Optional[str] = None
@@ -2,9 +2,9 @@ import logging
2
2
  import os
3
3
  from typing import Optional
4
4
 
5
- import earningscall
6
5
  import requests
7
6
 
7
+ import earningscall
8
8
 
9
9
  log = logging.getLogger(__file__)
10
10
 
@@ -19,6 +19,10 @@ def get_api_key():
19
19
  return api_key
20
20
 
21
21
 
22
+ def api_key_param():
23
+ return {"apikey": get_api_key()}
24
+
25
+
22
26
  def is_demo_account():
23
27
  return get_api_key() == "demo"
24
28
 
@@ -28,7 +32,7 @@ def get_events(exchange: str,
28
32
 
29
33
  log.debug(f"get_events exchange: {exchange} symbol: {symbol}")
30
34
  params = {
31
- "apikey": get_api_key(),
35
+ **api_key_param(),
32
36
  "exchange": exchange,
33
37
  "symbol": symbol,
34
38
  }
@@ -45,7 +49,7 @@ def get_transcript(exchange: str,
45
49
 
46
50
  log.debug(f"get_transcript year: {year} quarter: {quarter}")
47
51
  params = {
48
- "apikey": get_api_key(),
52
+ **api_key_param(),
49
53
  "exchange": exchange,
50
54
  "symbol": symbol,
51
55
  "year": str(year),
@@ -65,10 +69,14 @@ def get_symbols_v1():
65
69
 
66
70
 
67
71
  def get_symbols_v2():
68
- params = {
69
- "apikey": get_api_key(),
70
- }
71
- response = requests.get(f"{API_BASE}/symbols-v2.txt", params=params)
72
+ response = requests.get(f"{API_BASE}/symbols-v2.txt", params=api_key_param())
73
+ if response.status_code != 200:
74
+ return None
75
+ return response.text
76
+
77
+
78
+ def get_sp500_companies_txt_file():
79
+ response = requests.get(f"{API_BASE}/symbols/sp500.txt", params=api_key_param())
72
80
  if response.status_code != 200:
73
81
  return None
74
82
  return response.text
@@ -23,7 +23,3 @@ class ClientError(BaseError):
23
23
 
24
24
  class InsufficientApiAccessError(ClientError):
25
25
  pass
26
-
27
-
28
- class CompanyNotFound(ClientError):
29
- pass
@@ -1,8 +1,8 @@
1
1
  from typing import Optional
2
2
 
3
- from earningscall.symbols import get_symbols
4
-
3
+ from earningscall.api import get_sp500_companies_txt_file
5
4
  from earningscall.company import Company
5
+ from earningscall.symbols import get_symbols
6
6
 
7
7
 
8
8
  def get_company(symbol: str) -> Optional[Company]:
@@ -18,6 +18,10 @@ def get_all_companies() -> [Company]:
18
18
 
19
19
 
20
20
  def get_sp500_companies() -> [Company]:
21
- ## TODO: Actually only return SP500 companies.
22
- for company_info in get_symbols().get_all():
23
- yield Company(company_info=company_info)
21
+ resp = get_sp500_companies_txt_file()
22
+ if not resp:
23
+ return []
24
+ for ticker_symbol in resp.split("\n"):
25
+ company_info = get_symbols().lookup_company(ticker_symbol)
26
+ if company_info:
27
+ yield Company(company_info=company_info)
@@ -129,8 +129,8 @@ class Symbols:
129
129
  except KeyError:
130
130
  pass
131
131
  if is_demo_account():
132
- raise InsufficientApiAccessError(f"For full access, please get an API Key. See: "
133
- f"https://earningscall.biz/api-pricing")
132
+ raise InsufficientApiAccessError(f"\"{symbol}\" requires an API Key for access. To get your API Key,"
133
+ f" see: https://earningscall.biz/api-pricing")
134
134
  return None
135
135
 
136
136
  def remove_exchange_symbol(self, exchange_symbol: str):
@@ -3,6 +3,7 @@ from typing import Optional
3
3
 
4
4
  from dataclasses import dataclass, field
5
5
  from dataclasses_json import dataclass_json
6
+
6
7
  from earningscall.event import EarningsEvent
7
8
 
8
9
  log = logging.getLogger(__file__)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "earningscall"
3
- version = "0.0.8"
3
+ version = "0.0.10"
4
4
  description = "The EarningsCall Python library."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -12,6 +12,7 @@ dependencies = [
12
12
  "dataclasses-json>=0.6.4",
13
13
  "requests>=2.30.0",
14
14
  ]
15
+ license = { file = "LICENSE" }
15
16
 
16
17
  [project.urls]
17
18
  Homepage = "https://earningscall.biz"
@@ -0,0 +1,24 @@
1
+ import argparse
2
+ import logging
3
+
4
+ from earningscall import get_all_companies, get_sp500_companies
5
+ from earningscall.utils import configure_sane_logging
6
+
7
+
8
+ parser = argparse.ArgumentParser(description='')
9
+ parser.add_argument('--debug', action='store_true', help='Enable debug logs')
10
+ parser.add_argument('--sp-500', action='store_true', help='Show S&P500 Companies')
11
+
12
+ args = parser.parse_args()
13
+ level = logging.DEBUG
14
+ if args.debug:
15
+ level = logging.DEBUG
16
+ configure_sane_logging(level=level)
17
+
18
+ if args.sp_500:
19
+ get_func = get_sp500_companies
20
+ else:
21
+ get_func = get_all_companies
22
+
23
+ for company in get_func():
24
+ print(f"{company.company_info} -- {company.company_info.sector} -- {company.company_info.industry}")
@@ -0,0 +1,2 @@
1
+ [metadata]
2
+ url = https://github.com/EarningsCall/earningscall-python
@@ -1,8 +0,0 @@
1
- from earningscall import get_all_companies
2
- from earningscall.utils import enable_debug_logs
3
-
4
-
5
- enable_debug_logs()
6
-
7
- for company in get_all_companies():
8
- print(f"{company.company_info} -- {company.company_info.sector} -- {company.company_info.industry}")
@@ -1,27 +0,0 @@
1
- import responses
2
- import requests
3
- # from responses import _recorder
4
-
5
-
6
- @responses.activate
7
- def test_simple():
8
- responses.add(responses.GET, 'http://twitter.com/api/1/foobar',
9
- json={'error': 'not found'}, status=404)
10
-
11
- resp = requests.get('http://twitter.com/api/1/foobar')
12
-
13
- assert resp.json() == {"error": "not found"}
14
-
15
- assert len(responses.calls) == 1
16
- assert responses.calls[0].request.url == 'http://twitter.com/api/1/foobar'
17
- assert responses.calls[0].response.text == '{"error": "not found"}'
18
-
19
-
20
- # @_recorder.record(file_path="symbols.yaml")
21
- # def test_save_symbols_v1():
22
- # requests.get("https://earningscall.biz/symbols.txt")
23
- #
24
- #
25
- # @_recorder.record(file_path="symbols-v2.yaml")
26
- # def test_save_symbols_v1():
27
- # requests.get("https://earningscall.biz/symbols-v2.txt")
File without changes
File without changes
File without changes
File without changes
@@ -1,8 +1,8 @@
1
1
  import logging
2
- from dataclasses import dataclass, field
3
2
  from datetime import datetime
4
3
  from typing import Optional
5
4
 
5
+ from dataclasses import dataclass, field
6
6
  from dataclasses_json import config
7
7
  from dataclasses_json import dataclass_json
8
8
  from marshmallow import fields