emmet-api 0.87.0.dev1__tar.gz → 0.87.0.dev2__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 (288) hide show
  1. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/PKG-INFO +1 -1
  2. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/core/documentation.py +1 -1
  3. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/materials/query_operators.py +37 -10
  4. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/similarity/query_operators.py +27 -10
  5. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/summary/resources.py +1 -0
  6. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet_api.egg-info/PKG-INFO +1 -1
  7. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/material_resources.py +11 -6
  8. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/requirements/deployment.txt +1 -1
  9. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/materials/test_query_operators.py +50 -0
  10. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/similarity/test_query_operators.py +16 -5
  11. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/synthesis/test_adaptor.py +1 -1
  12. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/synthesis/test_adaptor_synpro.py +2 -1
  13. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/synthesis/test_utils.py +6 -2
  14. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/tasks/test_query_operators.py +2 -2
  15. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/tasks/test_utils.py +5 -2
  16. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/tasks/test_utils.py +2 -1
  17. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/Dockerfile +0 -0
  18. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/app.py +0 -0
  19. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/defect_resources.py +0 -0
  20. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/API.py +0 -0
  21. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/__init__.py +0 -0
  22. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/core/__init__.py +0 -0
  23. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/core/api.py +0 -0
  24. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/core/assets/mp_logo.svg +0 -0
  25. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/core/assets/mp_logo_small.png +0 -0
  26. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/core/global_header.py +0 -0
  27. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/core/settings.py +0 -0
  28. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/default_responses.yaml +0 -0
  29. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/models.py +0 -0
  30. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/py.typed +0 -0
  31. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/query_operator/__init__.py +0 -0
  32. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/query_operator/core.py +0 -0
  33. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/query_operator/dynamic.py +0 -0
  34. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/query_operator/pagination.py +0 -0
  35. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/query_operator/sorting.py +0 -0
  36. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/query_operator/sparse_fields.py +0 -0
  37. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/query_operator/submission.py +0 -0
  38. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/resource/__init__.py +0 -0
  39. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/resource/aggregation.py +0 -0
  40. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/resource/core.py +0 -0
  41. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/resource/post_resource.py +0 -0
  42. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/resource/read_resource.py +0 -0
  43. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/resource/submission.py +0 -0
  44. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/resource/utils.py +0 -0
  45. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/__init__.py +0 -0
  46. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_consumer/__init__.py +0 -0
  47. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_consumer/query_operator.py +0 -0
  48. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_consumer/resources.py +0 -0
  49. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_general_store/__init__.py +0 -0
  50. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_general_store/query_operator.py +0 -0
  51. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_general_store/resources.py +0 -0
  52. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_messages/__init__.py +0 -0
  53. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_messages/query_operator.py +0 -0
  54. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_messages/resources.py +0 -0
  55. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/defects/tasks/__init__.py +0 -0
  56. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/defects/tasks/resources.py +0 -0
  57. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/dois/__init__.py +0 -0
  58. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/dois/resources.py +0 -0
  59. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/legacy/__init__.py +0 -0
  60. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/legacy/jcesr/__init__.py +0 -0
  61. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/legacy/jcesr/query_operators.py +0 -0
  62. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/legacy/jcesr/resources.py +0 -0
  63. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/__init__.py +0 -0
  64. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/absorption/__init__.py +0 -0
  65. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/absorption/resources.py +0 -0
  66. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/alloys/__init__.py +0 -0
  67. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/alloys/query_operators.py +0 -0
  68. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/alloys/resources.py +0 -0
  69. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/bonds/__init__.py +0 -0
  70. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/bonds/query_operators.py +0 -0
  71. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/bonds/resources.py +0 -0
  72. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/charge_density/__init__.py +0 -0
  73. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/charge_density/query_operators.py +0 -0
  74. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/charge_density/resources.py +0 -0
  75. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/chemenv/__init__.py +0 -0
  76. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/chemenv/query_operators.py +0 -0
  77. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/chemenv/resources.py +0 -0
  78. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/conversion_electrodes/__init__.py +0 -0
  79. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/conversion_electrodes/resources.py +0 -0
  80. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/dielectric/__init__.py +0 -0
  81. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/dielectric/query_operators.py +0 -0
  82. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/dielectric/resources.py +0 -0
  83. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/elasticity/__init__.py +0 -0
  84. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/elasticity/query_operators.py +0 -0
  85. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/elasticity/resources.py +0 -0
  86. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/electronic_structure/__init__.py +0 -0
  87. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/electronic_structure/query_operators.py +0 -0
  88. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/electronic_structure/resources.py +0 -0
  89. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/eos/__init__.py +0 -0
  90. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/eos/resources.py +0 -0
  91. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/fermi/__init__.py +0 -0
  92. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/fermi/resources.py +0 -0
  93. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/grain_boundary/__init__.py +0 -0
  94. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/grain_boundary/query_operators.py +0 -0
  95. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/grain_boundary/resources.py +0 -0
  96. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/insertion_electrodes/__init__.py +0 -0
  97. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/insertion_electrodes/query_operators.py +0 -0
  98. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/insertion_electrodes/resources.py +0 -0
  99. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/insertion_electrodes/utils.py +0 -0
  100. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/magnetism/__init__.py +0 -0
  101. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/magnetism/query_operators.py +0 -0
  102. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/magnetism/resources.py +0 -0
  103. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/materials/__init__.py +0 -0
  104. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/materials/resources.py +0 -0
  105. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/materials/utils.py +0 -0
  106. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/mpcomplete/__init__.py +0 -0
  107. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/mpcomplete/query_operator.py +0 -0
  108. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/mpcomplete/resources.py +0 -0
  109. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/oxidation_states/__init__.py +0 -0
  110. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/oxidation_states/query_operators.py +0 -0
  111. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/oxidation_states/resources.py +0 -0
  112. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/phonon/__init__.py +0 -0
  113. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/phonon/query_operators.py +0 -0
  114. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/phonon/resources.py +0 -0
  115. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/piezo/__init__.py +0 -0
  116. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/piezo/query_operators.py +0 -0
  117. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/piezo/resources.py +0 -0
  118. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/provenance/__init__.py +0 -0
  119. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/provenance/resources.py +0 -0
  120. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/robocrys/__init__.py +0 -0
  121. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/robocrys/query_operators.py +0 -0
  122. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/robocrys/resources.py +0 -0
  123. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/similarity/__init__.py +0 -0
  124. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/similarity/resources.py +0 -0
  125. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/substrates/__init__.py +0 -0
  126. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/substrates/query_operators.py +0 -0
  127. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/substrates/resources.py +0 -0
  128. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/summary/__init__.py +0 -0
  129. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/summary/hint_scheme.py +0 -0
  130. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/summary/query_operators.py +0 -0
  131. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/surface_properties/__init__.py +0 -0
  132. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/surface_properties/query_operators.py +0 -0
  133. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/surface_properties/resources.py +0 -0
  134. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/synthesis/__init__.py +0 -0
  135. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/synthesis/data_adaptor.py +0 -0
  136. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/synthesis/data_adaptor_synpro.py +0 -0
  137. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/synthesis/query_operators.py +0 -0
  138. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/synthesis/resources.py +0 -0
  139. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/synthesis/utils.py +0 -0
  140. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/tasks/__init__.py +0 -0
  141. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/tasks/hint_scheme.py +0 -0
  142. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/tasks/query_operators.py +0 -0
  143. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/tasks/resources.py +0 -0
  144. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/tasks/utils.py +0 -0
  145. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/thermo/__init__.py +0 -0
  146. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/thermo/query_operators.py +0 -0
  147. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/thermo/resources.py +0 -0
  148. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/xas/__init__.py +0 -0
  149. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/xas/query_operators.py +0 -0
  150. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/xas/resources.py +0 -0
  151. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/__init__.py +0 -0
  152. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/association/__init__.py +0 -0
  153. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/association/resources.py +0 -0
  154. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/bonds/__init__.py +0 -0
  155. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/bonds/query_operators.py +0 -0
  156. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/bonds/resources.py +0 -0
  157. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/electric/__init__.py +0 -0
  158. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/electric/query_operators.py +0 -0
  159. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/electric/resources.py +0 -0
  160. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/metal_binding/__init__.py +0 -0
  161. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/metal_binding/query_operators.py +0 -0
  162. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/metal_binding/resources.py +0 -0
  163. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/molecules/__init__.py +0 -0
  164. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/molecules/hint_scheme.py +0 -0
  165. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/molecules/query_operators.py +0 -0
  166. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/molecules/resources.py +0 -0
  167. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/orbitals/__init__.py +0 -0
  168. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/orbitals/resources.py +0 -0
  169. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/partial_charges/__init__.py +0 -0
  170. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/partial_charges/resources.py +0 -0
  171. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/partial_spins/__init__.py +0 -0
  172. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/partial_spins/resources.py +0 -0
  173. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/redox/__init__.py +0 -0
  174. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/redox/query_operators.py +0 -0
  175. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/redox/resources.py +0 -0
  176. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/summary/__init__.py +0 -0
  177. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/summary/hint_scheme.py +0 -0
  178. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/summary/query_operators.py +0 -0
  179. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/summary/resources.py +0 -0
  180. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/tasks/__init__.py +0 -0
  181. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/tasks/hint_scheme.py +0 -0
  182. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/tasks/query_operators.py +0 -0
  183. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/tasks/resources.py +0 -0
  184. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/tasks/utils.py +0 -0
  185. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/thermo/__init__.py +0 -0
  186. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/thermo/query_operators.py +0 -0
  187. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/thermo/resources.py +0 -0
  188. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/utils.py +0 -0
  189. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/vibrations/__init__.py +0 -0
  190. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/vibrations/resources.py +0 -0
  191. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/utils.py +0 -0
  192. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet_api.egg-info/SOURCES.txt +0 -0
  193. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet_api.egg-info/dependency_links.txt +0 -0
  194. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet_api.egg-info/requires.txt +0 -0
  195. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet_api.egg-info/top_level.txt +0 -0
  196. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/healthcheck.sh +0 -0
  197. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/molecule_resources.py +0 -0
  198. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/pyproject.toml +0 -0
  199. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/requirements/ubuntu-latest_py3.11.txt +0 -0
  200. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/requirements/ubuntu-latest_py3.11_extras.txt +0 -0
  201. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/requirements/ubuntu-latest_py3.12.txt +0 -0
  202. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/requirements/ubuntu-latest_py3.12_extras.txt +0 -0
  203. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/requirements/ubuntu-latest_py3.13.txt +0 -0
  204. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/requirements/ubuntu-latest_py3.13_extras.txt +0 -0
  205. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/setup.cfg +0 -0
  206. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/start.sh +0 -0
  207. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/__init__.py +0 -0
  208. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/_consumer/__init__.py +0 -0
  209. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/_consumer/test_query_operators.py +0 -0
  210. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/_general_store/__init__.py +0 -0
  211. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/_general_store/test_query_operators.py +0 -0
  212. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/async_mongomock.py +0 -0
  213. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/conftest.py +0 -0
  214. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/core/__init__.py +0 -0
  215. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/core/test_mapi.py +0 -0
  216. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/legacy/molecules/__init__.py +0 -0
  217. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/legacy/molecules/test_query_operators.py +0 -0
  218. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/mapi/test_aggregation_resource.py +0 -0
  219. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/mapi/test_api.py +0 -0
  220. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/mapi/test_post_resource.py +0 -0
  221. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/mapi/test_query_operators.py +0 -0
  222. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/mapi/test_read_resource.py +0 -0
  223. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/mapi/test_submission_resource.py +0 -0
  224. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/mapi/test_utils.py +0 -0
  225. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/bonds/__init__.py +0 -0
  226. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/bonds/test_query_operators.py +0 -0
  227. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/charge_density/__init__.py +0 -0
  228. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/charge_density/test_query_operators.py +0 -0
  229. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/chemenv/__init__.py +0 -0
  230. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/chemenv/test_query_operators.py +0 -0
  231. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/dielectric/__init__.py +0 -0
  232. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/dielectric/test_query_operators.py +0 -0
  233. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/elasticity/__init__.py +0 -0
  234. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/elasticity/test_query_operators.py +0 -0
  235. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/electrodes/__init__.py +0 -0
  236. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/electrodes/test_query_operators.py +0 -0
  237. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/electrodes/test_utils.py +0 -0
  238. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/electronic_structure/__init__.py +0 -0
  239. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/electronic_structure/test_query_operators.py +0 -0
  240. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/eos/__init__.py +0 -0
  241. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/grain_boundary/__init__.py +0 -0
  242. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/grain_boundary/test_query_operators.py +0 -0
  243. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/magnetism/__init__.py +0 -0
  244. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/magnetism/test_query_operators.py +0 -0
  245. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/materials/__init__.py +0 -0
  246. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/materials/test_utils.py +0 -0
  247. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/mpcomplete/__init__.py +0 -0
  248. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/mpcomplete/test_query_operators.py +0 -0
  249. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/oxidation_states/__init__.py +0 -0
  250. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/oxidation_states/test_query_operators.py +0 -0
  251. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/piezo/__init__.py +0 -0
  252. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/piezo/test_query_operators.py +0 -0
  253. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/robocrys/__init__.py +0 -0
  254. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/robocrys/test_query_operators.py +0 -0
  255. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/similarity/__init__.py +0 -0
  256. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/substrates/__init__.py +0 -0
  257. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/substrates/test_query_operators.py +0 -0
  258. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/summary/__init__.py +0 -0
  259. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/summary/test_hint_scheme.py +0 -0
  260. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/summary/test_query_operators.py +0 -0
  261. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/surface_properties/__init__.py +0 -0
  262. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/surface_properties/test_query_operators.py +0 -0
  263. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/synthesis/__init__.py +0 -0
  264. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/synthesis/test_query_operators.py +0 -0
  265. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/tasks/__init__.py +0 -0
  266. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/thermo/__init__.py +0 -0
  267. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/thermo/test_query_operators.py +0 -0
  268. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/xas/__init__.py +0 -0
  269. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/xas/test_query_operators.py +0 -0
  270. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/__init__.py +0 -0
  271. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/bonds/__init__.py +0 -0
  272. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/bonds/test_query_operators.py +0 -0
  273. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/electric/__init__.py +0 -0
  274. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/electric/test_query_operators.py +0 -0
  275. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/metal_binding/__init__.py +0 -0
  276. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/metal_binding/test_query_operators.py +0 -0
  277. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/molecules/__init__.py +0 -0
  278. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/molecules/test_hint_scheme.py +0 -0
  279. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/molecules/test_query_operators.py +0 -0
  280. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/redox/__init__.py +0 -0
  281. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/redox/test_query_operators.py +0 -0
  282. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/summary/__init__.py +0 -0
  283. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/summary/test_query_operators.py +0 -0
  284. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/tasks/__init__.py +0 -0
  285. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/tasks/test_hint_scheme.py +0 -0
  286. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/tasks/test_query_operators.py +0 -0
  287. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/thermo/__init__.py +0 -0
  288. {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/thermo/test_query_operators.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: emmet-api
3
- Version: 0.87.0.dev1
3
+ Version: 0.87.0.dev2
4
4
  Summary: Emmet API Server
5
5
  Author-email: The Materials Project <feedback@materialsproject.org>
6
6
  License: Modified BSD
@@ -133,7 +133,7 @@ tags_meta = [
133
133
  methodology discussed by Zimmerman *et al.* in [10.3389/fmats.2017.00034](https://doi.org/10.3389/fmats.2017.00034) \
134
134
  and [10.1039/C9RA07755C](https://doi.org/10.1039/C9RA07755C). \
135
135
  Note that similarity data has not been calculated for all materials in the Materials \
136
- Project database. See the `imilarityDoc` schema for a full list of fields returned by this route.",
136
+ Project database. See the `SimilarityDoc` schema for a full list of fields returned by this route.",
137
137
  },
138
138
  {
139
139
  "name": "Materials XAS",
@@ -1,5 +1,5 @@
1
1
  from itertools import permutations
2
- from typing import Literal
2
+ from typing import Literal, Any
3
3
 
4
4
  from fastapi import Body, HTTPException, Query
5
5
  from emmet.api.query_operator import QueryOperator
@@ -15,6 +15,9 @@ from emmet.api.routes.materials.materials.utils import (
15
15
  )
16
16
  from emmet.core.symmetry import CrystalSystem
17
17
  from emmet.core.vasp.calc_types import RunType
18
+ from emmet.core.vasp.material import BlessedCalcs
19
+
20
+ BLESSED_CALC_RUN_TYPES = sorted(BlessedCalcs.model_fields)
18
21
 
19
22
 
20
23
  class FormulaQuery(QueryOperator):
@@ -212,7 +215,7 @@ class BlessedCalcsQuery(QueryOperator):
212
215
 
213
216
  def query(
214
217
  self,
215
- run_type: RunType = Query(
218
+ run_type: Literal[*BLESSED_CALC_RUN_TYPES] | RunType = Query( # type: ignore[valid-type]
216
219
  ..., description="Calculation run type of blessed task data"
217
220
  ),
218
221
  energy_min: float | None = Query(
@@ -222,26 +225,50 @@ class BlessedCalcsQuery(QueryOperator):
222
225
  None, description="Maximum total uncorrected DFT energy in eV/atom"
223
226
  ),
224
227
  ) -> STORE_PARAMS:
225
- crit = {f"entries.{run_type}.energy": {}} # type: dict
226
228
 
227
- if energy_min:
228
- crit[f"entries.{run_type}.energy"].update({"$gte": energy_min})
229
+ parsed_run_type: str | None = None
230
+ if isinstance(run_type, RunType):
231
+ aliases = {
232
+ RunType.PBE: "GGA",
233
+ RunType.PBE_U: "GGA_U",
234
+ RunType.GGA: "GGA",
235
+ RunType.GGA_U: "GGA_U",
236
+ RunType.SCAN: "SCAN",
237
+ RunType.r2SCAN: "R2SCAN",
238
+ RunType.HSE06: "HSE",
239
+ }
240
+ parsed_run_type = aliases.get(run_type)
241
+
242
+ elif run_type in BLESSED_CALC_RUN_TYPES:
243
+ parsed_run_type = run_type
244
+
245
+ if parsed_run_type is None:
246
+ raise ValueError(
247
+ f"Unsupported {run_type=}, please choose one of "
248
+ f"{', '.join(BLESSED_CALC_RUN_TYPES)}"
249
+ )
250
+
251
+ crit: dict[str, Any] = {f"entries.{parsed_run_type}.energy": {}}
252
+
253
+ if energy_min is not None:
254
+ crit[f"entries.{parsed_run_type}.energy"].update({"$gte": energy_min})
229
255
 
230
- if energy_max:
231
- crit[f"entries.{run_type}.energy"].update({"$lte": energy_max})
256
+ if energy_max is not None:
257
+ crit[f"entries.{parsed_run_type}.energy"].update({"$lte": energy_max})
232
258
 
233
- if not crit[f"entries.{run_type}.energy"]:
234
- return {"criteria": {f"entries.{run_type}": {"$exists": True}}}
259
+ if not crit[f"entries.{parsed_run_type}.energy"]:
260
+ return {"criteria": {f"entries.{parsed_run_type}": {"$ne": None}}}
235
261
 
236
262
  return {"criteria": crit}
237
263
 
238
264
  def post_process(self, docs, query):
265
+ """Return only the blessed entry."""
239
266
  run_type = list(query["criteria"].keys())[0].split(".")[1]
240
267
 
241
268
  return_data = [
242
269
  {
243
270
  "material_id": doc["material_id"],
244
- "blessed_entry": doc["entries"][run_type],
271
+ "entries": {run_type: doc["entries"][run_type]},
245
272
  }
246
273
  for doc in docs
247
274
  ]
@@ -2,7 +2,7 @@
2
2
 
3
3
  from fastapi import HTTPException, Query
4
4
 
5
- from emmet.core.similarity import SimilarityMethod
5
+ from emmet.core.similarity import SimilarityMethod, _vector_from_hex_and_norm
6
6
 
7
7
  from emmet.api.query_operator import QueryOperator
8
8
  from emmet.api.utils import STORE_PARAMS
@@ -16,15 +16,27 @@ SIM_METHOD_TO_FEAT_VEC_LENGTH = {
16
16
  class SimilarityFeatureVectorQuery(QueryOperator):
17
17
  """Generate a feature-vector-based query.
18
18
 
19
- TODO: Add an `embedding` kwarg to select between
20
- multiple embedding methods used to gauge
21
- similarity (e.g., ML-based metrics.)
19
+ The feature_vector_hex field is limited to 3_000 characters
20
+ to prevent malicious submission of overly-long string data.
21
+
22
+ In the worst case, a random unit vector of floats with
23
+ length 130 has roughly a hex string length of 2,100 characters.
24
+
25
+ Note that we pass unit vectors through only.
26
+ Passing vectors with non-unit norm would increase the lenght of
27
+ `feature_vector_hex` uncontrollably.
22
28
  """
23
29
 
24
30
  def query(
25
31
  self,
26
- feature_vector: list[float] = Query(
27
- ..., description="A row vector of floats representing a structure."
32
+ feature_vector_hex: str = Query(
33
+ ...,
34
+ description="A compressed, hex representation of a row unit vector of floats.",
35
+ max_length=3_000,
36
+ ),
37
+ feature_vector_norm: float = Query(
38
+ ...,
39
+ description="The norm of the feature vector",
28
40
  ),
29
41
  method: str | SimilarityMethod | None = Query(
30
42
  None,
@@ -37,6 +49,9 @@ class SimilarityFeatureVectorQuery(QueryOperator):
37
49
  ) -> STORE_PARAMS:
38
50
  """Identify similar materials."""
39
51
 
52
+ feature_vector = _vector_from_hex_and_norm(
53
+ feature_vector_hex, feature_vector_norm
54
+ )
40
55
  if method is None:
41
56
  try:
42
57
  method = next(
@@ -65,8 +80,10 @@ class SimilarityFeatureVectorQuery(QueryOperator):
65
80
  ):
66
81
  raise HTTPException(
67
82
  status_code=400,
68
- detail=f"Invalid feature vector for method {method.value}: "
69
- f"should be a list of {ref_fv_len} floats.",
83
+ detail=(
84
+ f"Invalid feature vector for method {method.value}: " # type: ignore[union-attr]
85
+ f"should be a list of {ref_fv_len} floats.",
86
+ ),
70
87
  )
71
88
 
72
89
  index_name = "similarity_feature_vector"
@@ -74,7 +91,7 @@ class SimilarityFeatureVectorQuery(QueryOperator):
74
91
  # and I was not forward thinking in naming it.
75
92
  # TODO: homogenize once we have other data built out
76
93
  if method != SimilarityMethod.CRYSTALNN:
77
- index_name += f"_{method.value.lower()}"
94
+ index_name += f"_{method.value.lower()}" # type: ignore[union-attr]
78
95
 
79
96
  pipeline = [
80
97
  {
@@ -100,7 +117,7 @@ class SimilarityFeatureVectorQuery(QueryOperator):
100
117
  }
101
118
 
102
119
  def post_process(self, docs, query):
103
- self.total_doc = docs[0]["meta"]["count"]["total"]
120
+ self.total_doc = len(docs)
104
121
  return docs
105
122
 
106
123
  def meta(self):
@@ -84,6 +84,7 @@ def summary_resource(summary_store):
84
84
 
85
85
 
86
86
  def summary_stats_resource(summary_store):
87
+ """NOTE: Currently unused, API endpoint no longer available."""
87
88
  resource = AggregationResource(
88
89
  summary_store,
89
90
  SummaryStats,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: emmet-api
3
- Version: 0.87.0.dev1
3
+ Version: 0.87.0.dev2
4
4
  Summary: Emmet API Server
5
5
  Author-email: The Materials Project <feedback@materialsproject.org>
6
6
  License: Modified BSD
@@ -156,9 +156,17 @@ from emmet.api.routes.materials.eos.resources import eos_resource
156
156
  materials_resources.extend([eos_resource(eos_store)])
157
157
 
158
158
  # Similarity
159
- from emmet.api.routes.materials.similarity.resources import similarity_resource
159
+ from emmet.api.routes.materials.similarity.resources import (
160
+ similarity_resource,
161
+ similarity_feature_vector_resource,
162
+ )
160
163
 
161
- materials_resources.extend([similarity_resource(similarity_store)])
164
+ materials_resources.extend(
165
+ [
166
+ similarity_resource(similarity_store),
167
+ similarity_feature_vector_resource(similarity_store),
168
+ ]
169
+ )
162
170
 
163
171
  # XAS
164
172
  from emmet.api.routes.materials.xas.resources import xas_resource
@@ -242,12 +250,9 @@ materials_resources.extend([provenance_resource(provenance_store)])
242
250
  # Summary
243
251
  from emmet.api.routes.materials.summary.resources import (
244
252
  summary_resource,
245
- summary_stats_resource,
246
253
  )
247
254
 
248
- materials_resources.extend(
249
- [summary_stats_resource(summary_store), summary_resource(summary_store)]
250
- )
255
+ materials_resources.extend([summary_resource(summary_store)])
251
256
 
252
257
  # Electronic Structure
253
258
  from emmet.api.routes.materials.electronic_structure.resources import (
@@ -40,7 +40,7 @@ ddtrace==4.0.0
40
40
  # via emmet-api (emmet/emmet-api/pyproject.toml)
41
41
  dnspython==2.8.0
42
42
  # via pymongo
43
- emmet-core==0.86.1
43
+ emmet-core==0.86.2rc0
44
44
  # via emmet-api (emmet/emmet-api/pyproject.toml)
45
45
  envier==0.6.1
46
46
  # via ddtrace
@@ -4,6 +4,7 @@ from pymatgen.core.structure import Structure
4
4
 
5
5
  from emmet.api.core.settings import MAPISettings
6
6
  from emmet.api.routes.materials.materials.query_operators import (
7
+ BlessedCalcsQuery,
7
8
  ChemsysQuery,
8
9
  DeprecationQuery,
9
10
  ElementsQuery,
@@ -15,6 +16,55 @@ from emmet.api.routes.materials.materials.query_operators import (
15
16
  SymmetryQuery,
16
17
  )
17
18
  from emmet.core.symmetry import CrystalSystem
19
+ from emmet.core.vasp.calc_types import RunType
20
+
21
+
22
+ def test_blessed_calcs_query():
23
+
24
+ op = BlessedCalcsQuery()
25
+ for mapped, possible_user_input in {
26
+ "GGA": ["GGA", RunType.GGA, RunType.PBE],
27
+ "GGA_U": ["GGA_U", RunType.PBE_U],
28
+ "R2SCAN": ["R2SCAN", RunType.r2SCAN],
29
+ "SCAN": ["SCAN", RunType.SCAN],
30
+ "HSE": ["HSE", RunType.HSE06],
31
+ }.items():
32
+
33
+ assert all(
34
+ op.query(run_type=user_inp, energy_min=None, energy_max=None)
35
+ == {"criteria": {f"entries.{mapped}": {"$ne": None}}}
36
+ for user_inp in possible_user_input
37
+ )
38
+
39
+ assert all(
40
+ op.query(
41
+ run_type=user_inp,
42
+ energy_min=0.0,
43
+ energy_max=None,
44
+ )
45
+ == {"criteria": {f"entries.{mapped}.energy": {"$gte": 0.0}}}
46
+ for user_inp in possible_user_input
47
+ )
48
+
49
+ assert all(
50
+ op.query(
51
+ run_type=user_inp,
52
+ energy_min=None,
53
+ energy_max=5.0,
54
+ )
55
+ == {"criteria": {f"entries.{mapped}.energy": {"$lte": 5.0}}}
56
+ for user_inp in possible_user_input
57
+ )
58
+
59
+ assert all(
60
+ op.query(
61
+ run_type=user_inp,
62
+ energy_min=0.0,
63
+ energy_max=5.0,
64
+ )
65
+ == {"criteria": {f"entries.{mapped}.energy": {"$gte": 0.0, "$lte": 5.0}}}
66
+ for user_inp in possible_user_input
67
+ )
18
68
 
19
69
 
20
70
  def test_formula_query():
@@ -1,13 +1,17 @@
1
1
  """Test crystalline similarity vector search."""
2
2
 
3
+ import numpy as np
3
4
  import pytest
4
5
 
5
- from emmet.core.similarity import SimilarityMethod
6
+ from emmet.core.similarity import (
7
+ SimilarityMethod,
8
+ _vector_to_hex_and_norm,
9
+ _vector_from_hex_and_norm,
10
+ )
6
11
  from emmet.api.routes.materials.similarity.query_operators import (
7
12
  SimilarityFeatureVectorQuery,
8
13
  SIM_METHOD_TO_FEAT_VEC_LENGTH,
9
14
  )
10
- import numpy as np
11
15
 
12
16
 
13
17
  @pytest.mark.parametrize(
@@ -19,6 +23,8 @@ def test_similarity_structure_search(test_dir, method):
19
23
  fv = np.random.rand(
20
24
  SIM_METHOD_TO_FEAT_VEC_LENGTH[SimilarityMethod.CRYSTALNN]
21
25
  ).tolist()
26
+ fv_hex, fv_norm = _vector_to_hex_and_norm(fv)
27
+
22
28
  limit = 10
23
29
  q = {
24
30
  "pipeline": [
@@ -26,7 +32,7 @@ def test_similarity_structure_search(test_dir, method):
26
32
  "$vectorSearch": {
27
33
  "index": "similarity_feature_vector",
28
34
  "path": "feature_vector",
29
- "queryVector": fv,
35
+ "queryVector": _vector_from_hex_and_norm(fv_hex, fv_norm),
30
36
  "numCandidates": limit,
31
37
  "limit": limit,
32
38
  }
@@ -42,9 +48,14 @@ def test_similarity_structure_search(test_dir, method):
42
48
  ]
43
49
  }
44
50
 
45
- manual_q = op.query(feature_vector=fv, method=method, _limit=limit)
51
+ manual_q = op.query(
52
+ feature_vector_hex=fv_hex,
53
+ feature_vector_norm=fv_norm,
54
+ method=method,
55
+ _limit=limit,
56
+ )
46
57
  assert manual_q == q
47
58
 
48
59
  doc = [{"meta": {"count": {"total": limit}}}]
49
60
  assert op.post_process(doc, q) == doc
50
- assert op.meta() == {"total_doc": limit}
61
+ assert "total_doc" in op.meta()
@@ -19,7 +19,7 @@ def test_string2comp():
19
19
 
20
20
  def test_convert_recipe():
21
21
  with zopen(
22
- os.path.join(MAPISettings().TEST_FILES, "synth_doc_adaptor.json.gz")
22
+ os.path.join(MAPISettings().TEST_FILES, "synth_doc_adaptor.json.gz"), "rt"
23
23
  ) as file:
24
24
  synth_doc = load(file)
25
25
 
@@ -112,7 +112,8 @@ def test_get_material_formula():
112
112
 
113
113
  def test_convert_one():
114
114
  with zopen(
115
- os.path.join(MAPISettings().TEST_FILES, "synth_doc_adaptor_synpro.json.gz")
115
+ os.path.join(MAPISettings().TEST_FILES, "synth_doc_adaptor_synpro.json.gz"),
116
+ "rt",
116
117
  ) as file:
117
118
  synth_doc = load(file)
118
119
 
@@ -20,7 +20,9 @@ def test_make_ellipsis():
20
20
 
21
21
 
22
22
  def test_mask_paragraphs():
23
- with zopen(os.path.join(MAPISettings().TEST_FILES, "synth_doc.json.gz")) as file:
23
+ with zopen(
24
+ os.path.join(MAPISettings().TEST_FILES, "synth_doc.json.gz"), "rt"
25
+ ) as file:
24
26
  synth_doc = load(file)
25
27
 
26
28
  doc = SynthesisSearchResultModel(**synth_doc)
@@ -30,7 +32,9 @@ def test_mask_paragraphs():
30
32
 
31
33
 
32
34
  def test_mask_highlights():
33
- with zopen(os.path.join(MAPISettings().TEST_FILES, "synth_doc.json.gz")) as file:
35
+ with zopen(
36
+ os.path.join(MAPISettings().TEST_FILES, "synth_doc.json.gz"), "rt"
37
+ ) as file:
34
38
  synth_doc = load(file)
35
39
 
36
40
  doc = SynthesisSearchResultModel(**synth_doc)
@@ -30,7 +30,7 @@ def test_entries_query():
30
30
  assert op.query(task_ids=" mp-149, mp-13") == q
31
31
 
32
32
  with zopen(
33
- os.path.join(MAPISettings().TEST_FILES, "tasks_Li_Fe_V.json.gz")
33
+ os.path.join(MAPISettings().TEST_FILES, "tasks_Li_Fe_V.json.gz"), "rt"
34
34
  ) as file:
35
35
  tasks = json.load(file)
36
36
  docs = op.post_process(tasks, q)
@@ -45,7 +45,7 @@ def test_trajectory_query():
45
45
  assert op.query(task_ids=" mp-149, mp-13") == q
46
46
 
47
47
  with zopen(
48
- os.path.join(MAPISettings().TEST_FILES, "tasks_Li_Fe_V.json.gz")
48
+ os.path.join(MAPISettings().TEST_FILES, "tasks_Li_Fe_V.json.gz"), "rt"
49
49
  ) as file:
50
50
  tasks = json.load(file)
51
51
  docs = op.post_process(tasks, q)
@@ -11,7 +11,8 @@ from emmet.api.routes.materials.tasks.utils import (
11
11
 
12
12
  def test_calcs_reversed_to_trajectory():
13
13
  with zopen(
14
- os.path.join(MAPISettings().TEST_FILES, "calcs_reversed_mp_1031016.json.gz")
14
+ os.path.join(MAPISettings().TEST_FILES, "calcs_reversed_mp_1031016.json.gz"),
15
+ "rt",
15
16
  ) as file:
16
17
  calcs_reversed = load(file)
17
18
  trajectories = calcs_reversed_to_trajectory(calcs_reversed)
@@ -27,7 +28,9 @@ def test_calcs_reversed_to_trajectory():
27
28
 
28
29
 
29
30
  def test_task_to_entry():
30
- with zopen(os.path.join(MAPISettings().TEST_FILES, "test_task.json.gz")) as file:
31
+ with zopen(
32
+ os.path.join(MAPISettings().TEST_FILES, "test_task.json.gz"), "rt"
33
+ ) as file:
31
34
  doc = load(file)
32
35
 
33
36
  entry_dict = task_to_entry(doc)
@@ -8,7 +8,8 @@ from emmet.api.routes.molecules.tasks.utils import calcs_reversed_to_trajectory
8
8
 
9
9
  def test_calcs_reversed_to_trajectory():
10
10
  with zopen(
11
- os.path.join(MAPISettings().TEST_FILES, "calcs_reversed_mpcule_36097.json.gz")
11
+ os.path.join(MAPISettings().TEST_FILES, "calcs_reversed_mpcule_36097.json.gz"),
12
+ "rt",
12
13
  ) as file:
13
14
  calcs_reversed = load(file)
14
15
  trajectories = calcs_reversed_to_trajectory(calcs_reversed)
File without changes