Repository: lmmentel/mendeleev

Issue:
boiling and melting points in the elements table?
## Describe the bug
The documentation about the bulk data shows boiling and melting points in the elements table, but I do not have them when I access it as described in the examples in the documentation.

## To Reproduce
Steps to reproduce the behavior:
exactly as described at https://mendeleev.readthedocs.io/en/latest/notebooks/bulk_data_access.html

## Expected behavior
the two properties in the table

## Specification

mendleev version: mendeleev-0.13.1-py3-none-any.whl

## Additional context
I'd just need to know how I can access the properties. Have they been moved to another table maybe?


Discussion:

Patch:
diff --git a/mendeleev/electronegativity.py b/mendeleev/electronegativity.py
index 4fdcb53..62d47cc 100644
--- a/mendeleev/electronegativity.py
+++ b/mendeleev/electronegativity.py
@@ -3,7 +3,7 @@ Electronegativity scale formulas.
 """
 
 import math
-from typing import List
+from typing import List, Union
 
 import numpy as np
 
@@ -98,17 +98,15 @@ def martynov_batsanov(ionization_energies: List[float]) -> float:
 def mulliken(
     ionization_energy: float,
     electron_affinity: float,
-    missing_is_zero: bool = False,
-    allow_negative_ea: bool = False,
-) -> float:
+) -> Union[float, None]:
     r"""
-    Return the absolute electronegativity (Mulliken scale), calculated as
+    Return the absolute electronegativity (Mulliken scale).
 
     Args:
         ionization_energy: ionization energy
         electron_affinity: electron affinity
-        missing_is_zero: missing values are substituted with zero
-        allow_negative_ea: if `True` negative EA values will be allowed
+
+    The value of electonegativity is calculated as:
 
     .. math::
 
@@ -120,18 +118,14 @@ def mulliken(
     - :math:`A` is the electron affinity
     """
 
-    if ionization_energy is not None:
-        if (
-            electron_affinity is not None
-            and electron_affinity < 0.0
-            and allow_negative_ea
-        ):
-            return (ionization_energy + electron_affinity) * 0.5
-        elif electron_affinity is not None or missing_is_zero:
-            return ionization_energy * 0.5
-    else:
+    if ionization_energy is None:
         return None
 
+    if electron_affinity is None:
+        return ionization_energy * 0.5
+
+    return (ionization_energy + electron_affinity) * 0.5
+
 
 def nagle(nvalence: int, polarizability: float) -> float:
     """
diff --git a/mendeleev/fetch.py b/mendeleev/fetch.py
index 130bdb1..1307ea2 100644
--- a/mendeleev/fetch.py
+++ b/mendeleev/fetch.py
@@ -48,10 +48,12 @@ def fetch_table(table: str, **kwargs) -> pd.DataFrame:
     tables = {
         "elements",
         "groups",
-        "isotopes",
         "ionicradii",
         "ionizationenergies",
+        "isotopedecaymodes",
+        "isotopes",
         "oxidationstates",
+        "phasetransitions",
         "screeningconstants",
         "series",
     }
diff --git a/mendeleev/models.py b/mendeleev/models.py
index f6130bc..89646c7 100644
--- a/mendeleev/models.py
+++ b/mendeleev/models.py
@@ -627,23 +627,23 @@ class Element(Base):
     def electronegativity_mulliken(
         self,
         charge: int = 0,
-        missing_is_zero: bool = False,
-        allow_negative_ea: bool = False,
     ) -> float:
         r"""
-        Return the absolute electronegativity (Mulliken scale), calculated as
+        Return the absolute electronegativity (Mulliken scale).
 
         Args:
             charge: charge of the ion
-            missing_is_zero: missing values are substituted with zero
-            allow_negative_ea: if `True` negative EA values will be allowed
+
+        The value of electonegativity is calculated as:
 
         .. math::
 
-           \chi = \frac{I + A}{2}
+        \chi = \frac{I + A}{2}
+
+        where:
 
-        where :math:`I` is the ionization energy and :math:`A` is the electron
-        affinity
+        - :math:`I` is the ionization energy,
+        - :math:`A` is the electron affinity
         """
 
         if charge == 0:
@@ -654,9 +654,7 @@ class Element(Base):
             ea = self.ionenergies.get(charge, None)
         else:
             raise ValueError(f"Charge has to be a non-negative integer, got: {charge}")
-        return mulliken(
-            ip, ea, missing_is_zero=missing_is_zero, allow_negative_ea=allow_negative_ea
-        )
+        return mulliken(ip, ea)
 
     def electronegativity_nagle(self) -> float:
         "Nagle's electronegativity"
diff --git a/poetry.lock b/poetry.lock
index a142a88..42ef51a 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand.
+# This file is automatically @generated by Poetry and should not be changed by hand.
 
 [[package]]
 name = "aiofiles"
@@ -3509,23 +3509,23 @@ files = [
 
 [[package]]
 name = "tornado"
-version = "6.3.1"
+version = "6.3.2"
 description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
 category = "main"
 optional = false
 python-versions = ">= 3.8"
 files = [
-    {file = "tornado-6.3.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:db181eb3df8738613ff0a26f49e1b394aade05034b01200a63e9662f347d4415"},
-    {file = "tornado-6.3.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b4e7b956f9b5e6f9feb643ea04f07e7c6b49301e03e0023eedb01fa8cf52f579"},
-    {file = "tornado-6.3.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9661aa8bc0e9d83d757cd95b6f6d1ece8ca9fd1ccdd34db2de381e25bf818233"},
-    {file = "tornado-6.3.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81c17e0cc396908a5e25dc8e9c5e4936e6dfd544c9290be48bd054c79bcad51e"},
-    {file = "tornado-6.3.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a27a1cfa9997923f80bdd962b3aab048ac486ad8cfb2f237964f8ab7f7eb824b"},
-    {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d7117f3c7ba5d05813b17a1f04efc8e108a1b811ccfddd9134cc68553c414864"},
-    {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:ffdce65a281fd708da5a9def3bfb8f364766847fa7ed806821a69094c9629e8a"},
-    {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:90f569a35a8ec19bde53aa596952071f445da678ec8596af763b9b9ce07605e6"},
-    {file = "tornado-6.3.1-cp38-abi3-win32.whl", hash = "sha256:3455133b9ff262fd0a75630af0a8ee13564f25fb4fd3d9ce239b8a7d3d027bf8"},
-    {file = "tornado-6.3.1-cp38-abi3-win_amd64.whl", hash = "sha256:1285f0691143f7ab97150831455d4db17a267b59649f7bd9700282cba3d5e771"},
-    {file = "tornado-6.3.1.tar.gz", hash = "sha256:5e2f49ad371595957c50e42dd7e5c14d64a6843a3cf27352b69c706d1b5918af"},
+    {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"},
+    {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"},
+    {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"},
+    {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"},
+    {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"},
+    {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"},
+    {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"},
+    {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"},
+    {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"},
+    {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"},
+    {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"},
 ]
 
 [[package]]
@@ -3891,7 +3891,7 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker
 testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"]
 
 [extras]
-vis = ["bokeh", "jupyter-bokeh", "plotly", "seaborn"]
+vis = ["bokeh", "plotly", "seaborn", "jupyter-bokeh"]
 
 [metadata]
 lock-version = "2.0"
diff --git a/readthedocs.yml b/readthedocs.yml
index bea451f..dfb341f 100644
--- a/readthedocs.yml
+++ b/readthedocs.yml
@@ -16,9 +16,13 @@ sphinx:
 # Optionally build your docs in additional formats such as PDF and ePub
 formats: all
 
+build:
+  os: ubuntu-22.04
+  tools:
+    python: "3.11"
+
 # Optionally set the version of Python and requirements required to build your docs
 python:
-  version: 3.8
   install:
     - method: pip
       path: .


Test patch:
diff --git a/tests/test_electronegativity.py b/tests/test_electronegativity.py
index 5080ffd..07935d2 100644
--- a/tests/test_electronegativity.py
+++ b/tests/test_electronegativity.py
@@ -1,6 +1,7 @@
 import pytest
 
 from mendeleev import Element
+from mendeleev.electronegativity import mulliken
 
 
 def test_scales_exception():
@@ -8,3 +9,11 @@ def test_scales_exception():
     e = Element()
     with pytest.raises(ValueError):
         e.electronegativity(scale="unknown")
+
+
+def test_mulliken():
+
+    assert mulliken(None, None) is None
+    assert mulliken(None, 1.0) is None
+    assert mulliken(2.0, None) == pytest.approx(1.0)
+    assert mulliken(2.0, 1.0) == pytest.approx(1.5)
diff --git a/tests/test_fetch.py b/tests/test_fetch.py
index f439eaa..5ad5005 100644
--- a/tests/test_fetch.py
+++ b/tests/test_fetch.py
@@ -17,26 +17,24 @@ tables = [
     ("groups", 18),
     ("series", 10),
     ("oxidationstates", 579),
+    ("phasetransitions", 108),
 ]
 
 
 @pytest.mark.parametrize("table,nrows", tables)
 def test_fetch_table(table, nrows):
-
     df = fetch_table(table)
     assert isinstance(df, pd.DataFrame)
     assert df.shape[0] == nrows
 
 
 def test_fetch_neutral_data():
-
     df = fetch_neutral_data()
     assert isinstance(df, pd.DataFrame)
 
 
 @pytest.mark.parametrize("radius", ("ionic_radius", "crystal_radius"))
 def test_fetch_ionic_radii(radius):
-
     df = fetch_ionic_radii(radius)
     assert isinstance(df, pd.DataFrame)
 
@@ -46,13 +44,11 @@ def test_fetch_ionic_radii(radius):
     ((1, ["IE1"]), ([1, 2], ["IE1", "IE2"]), ([1, 2, 6], ["IE1", "IE2", "IE6"])),
 )
 def test_fetch_ionization_energies(degree, cols):
-
     df = fetch_ionization_energies(degree)
     assert isinstance(df, pd.DataFrame)
     assert all(col in df.columns for col in cols)
 
 
 def test_fetch_electronegativities():
-
     df = fetch_electronegativities()
     assert isinstance(df, pd.DataFrame)