[SPARK-9394][SQL] Handle parentheses in CodeFormatter.

Our CodeFormatter currently does not handle parentheses, and as a result in code dump, we see code formatted this way:
foo(
a,
b,
c)

With this patch, it is formatted this way:
foo(
  a,
  b,
  c)

Merged build triggered.

Merged build started.

Merged build finished. Test FAILed.

Merged build triggered.

Merged build started.

Test build #38654 has started for   PR 7712 at commit 3cfb174.

Test build #38654 has finished for   PR 7712 at commit 3cfb174.

This patch fails Spark unit tests.
This patch merges cleanly.
This patch adds no public classes.

Merged build finished. Test FAILed.

Merged build triggered.

Merged build started.

Merged build finished. Test FAILed.

Test build #1214 has started for   PR 7712 at commit c2b1c5f.

LGTM

Test build #1214 has finished for   PR 7712 at commit c2b1c5f.

This patch passes all tests.
This patch merges cleanly.
This patch adds no public classes.


Implement memoization for perception checks

This PR adds memoization to the calculation of isInSwiftUIBody during perception checks as originally discussed here.
This substantially increases performance while exercising an app in a simulator running iOS 16 (or older). In my standard test case of text input in a back-ported SyncUps app, typing a single character now only takes 0.0005 secs when the memoization cache has been pre-warmed.  It was previously taking approximately 0.15 secs after the fixes in #2622.
The memoization cache is built on top of an OrderedDictionary and caps the capacity to a fixed number of entries. As new entries are added, the oldest entry is evicted. In my experiments with SyncUps, fully exercising the app results in about 500 unique stack backtraces across the various views. When the cache is fully primed, the app performance on iOS 16 is indistinguishable from iOS 17 from a user interaction perspective.
Based on my experiments with SyncUps I have set the default cache max size to 500, which seems to be large enough to hold the working set of a moderately complex app under development/test. A typical stack backtrace has about 80-90 frames (for math purposes, we will round up to 100).  So the rough memory cost of this cache is ~400k (500 entries * 100 frames per entry * 8 bytes per frame). This seems like a reasonable tradeoff for most apps under development/test.
Note, I have left some instrumentation code in the memoization cache. It should probably be removed at some point, but it was useful in testing this feature so I left it there for now.

Hey @scogeo, thanks again for taking the time to look into this.
However, I'm not able to really measure a significant speed bump with memoization over what is on observation-beta right now. We included a few performance improvements in #2614, which was merged after your PR. Perhaps that closed the gap a bit?
To measure I put the following code at the top of perceptionCheck:
let start = Date()
defer {
  if #available(iOS 15.0, *) {
    print(
      "perceptionCheck",
      Date().timeIntervalSince(start)
        .formatted(.number.precision(.significantDigits(1...10)))
    )
  }
}

And then I ran the app with the memoization condition:
if #unavailable(iOS 17, macOS 14, tvOS 17, watchOS 10),
  !PerceptionLocals.isInPerceptionTracking,
  !PerceptionLocals.isInWithoutPerceptionChecking,
  isInSwiftUIBody  // ⬅

…and without:
if #unavailable(iOS 17, macOS 14, tvOS 17, watchOS 10),
  !PerceptionLocals.isInPerceptionTracking,
  !PerceptionLocals.isInWithoutPerceptionChecking,
   determineIfInSwiftUIBody  // ⬅

And it just seems that on average they are about the same.
Can you confirm that you see a measurable performance improvement over the most recent commit on observation-beta?

@mbrandonw I synced my fork and merged the latest from the observation-beta branch (as of about an hour ago) and I definitely still see substantial performance improvements with memoization in my SyncUp experiments.
Using your instrumentation when calling with determineIfInSwiftUIBody and typing a key after clicking the plus button, the first 10 calls are (note I disabled _printChanges() for these tests):

perceptionCheck 0.01766705513
perceptionCheck 0.01663196087
perceptionCheck 0.01708400249
perceptionCheck 0.01737201214
perceptionCheck 0.01763093472
perceptionCheck 0.01731300354
perceptionCheck 0.01727092266
perceptionCheck 0.01709699631
perceptionCheck 0.01724898815
perceptionCheck 0.01633000374

Using your instrumentation when calling with isInSwiftUIBody.  I first warm up the cache by typing in the title text field a few times in the add sheet.  Then close the add sheet and reopen.  After typing a key, the first 10 calls are:

perceptionCheck 0.00007092952728
perceptionCheck 0.00003397464752
perceptionCheck 0.00003397464752
perceptionCheck 0.0000319480896
perceptionCheck 0.00002789497375
perceptionCheck 0.00002992153168
perceptionCheck 0.00002896785736
perceptionCheck 0.00003397464752
perceptionCheck 0.00002992153168
perceptionCheck 0.00002801418304

So there is still a substantial improvement.  But the qualitative improvement in using the simulator to track down perception issues is more of my concern.  The qualitative improvement is very obvious from just using the app with and without memoization.
I'm going to create a branch in my fork that includes my SyncUp iOS 16 backport merged with my memoization changes so that we are both using the same branch/app for our tests. Will post an update when it's ready.

@mbrandonw You should be able to clone my fork and checkout the syncups-ios16-memoized branch.
You can then just run SyncUps on an iOS 16 simulator.  I happen to be running on an iPhone 14 Pro with iOS 16.4, Xcode 15.0.1.
The easiest test is to just add a new SyncUp and start typing in the title field (make edits, delete, etc), both with and without memoization.
Hopefully, you will be able to see the improvement.

Hey @scogeo, thanks for following up. I was just running the case studies, so maybe that was too simplistic to see the difference. I'm traveling today, but we will get to this soon.
Thanks again for pushing this forward!

Hey @scogeo, ok was able to look into this more and I do see more significant changes in SyncUps than just using the Integration app target. So we will be merging this soon!

@mbrandonw Great, I'm glad you were able to see what I was experiencing.


Add Exponential Smoothing, HoltWinters to compileResults.R

We'll not be going ahead with this approach for now.


Error: Only one input size may be -1, not both 0 and 1

Issue type
Support
Have you reproduced the bug with TensorFlow Nightly?
No
Source
source
TensorFlow version
2.17.0
Custom code
Yes
OS platform and distribution
Windows 10 LTSC
Mobile device
No response
Python version
3.12.6
Bazel version
No response
GCC/compiler version
No response
CUDA/cuDNN version
No response
GPU model and memory
No response
Current behavior?
When I used tfrecord file to generate the dataset and fit the model, I encountered the error 'Only one input size may be -1, not both 0 and 1'.
I'm not sure if this issue is caused by a TensorFlow bug, as the main code works fine when I use local image and JSON label files for training.
If there is any way to resolve this issue, please let me know.
Standalone code to reproduce the issue
https://colab.research.google.com/drive/1ntVuMurkZ4nmg-owgzYOd9hLA596ZwyE?usp=sharing

Relevant log output
Total params: 35,040,706 (133.67 MB)
Trainable params: 35,040,706 (133.67 MB)
Non-trainable params: 0 (0.00 B)
Epoch 1/10
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1726724161.327751   51040 service.cc:146] XLA service 0x26fbeda47c0 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
I0000 00:00:1726724161.328263   51040 service.cc:154]   StreamExecutor device (0): Host, Default Version
I0000 00:00:1726724161.340495   51040 device_compiler.h:188] Compiled cluster using XLA!  This line is logged at most once for the lifetime of the process.
2024-09-19 13:36:01.640915: W tensorflow/core/framework/op_kernel.cc:1840] OP_REQUIRES failed at reshape_op.h:65 : INVALID_ARGUMENT:
Only one input size may be -1, not both 0 and 1
2024-09-19 13:36:01.643767: I tensorflow/core/framework/local_rendezvous.cc:404] Local rendezvous is aborting with status: INVALID_ARGUMENT: Only one input size may be -1, not both 0 and 1
         [[{{function_node __inference_one_step_on_data_2728}}{{node functional_1/flatten_1/Reshape}}]]

After repeated attempts, I found that replacing tf.keras.layers.Flatten with tf.keras.layers.GlobalAveragePooling2D can solve the problem, although I am not sure what happened.
The dimensions of the shape of the input are fixed.

@Mochengvia,
I was facing a different issue/error while executing the mentioned code. Kindly find the gist of it here and provide the complete dependencies which helps to debug the issue. Thank you!

@tilakrayal
Sorry, I forgot to upload my TFRecord file. I’ve updated the code, so you can now run it directly and see the results.
https://colab.research.google.com/drive/1ntVuMurkZ4nmg-owgzYOd9hLA596ZwyE?usp=sharing

@Mochengvia,
Tensorflow 2.17 contains Keras3.0 which might be the reason for the error. Could you please try to install tf-keras i.e., keras2.0 which the code was executed without any issues/error. Kindly find the gist of it here.
!pip install tf-keras
import tf_keras as keras

Thank you!

it works well, thanks.


[Question]: How to add sparkApplicationID to the driver and executor pod names

I am looking for an option to add sparkApplicationId to driver and executor pod names. This allows me to filter and structure the logs in S3 bucket with unique sparkApplicationId. I am planning to store the Spark Driver and Executor Logs under one folder with sparkApplicationId.
e.g.,
s3://spark-bucket/year=yyyy/month=mm/day=dd/<spark-application-id>/<app-name-driver>
s3://spark-bucket/year=yyyy/month=mm/day=dd/<spark-application-id>/<app-name-executor-1>
s3://spark-bucket/year=yyyy/month=mm/day=dd/<spark-application-id>/<app-name-executor-2>
...

This is my config to add the Driver and Executor Pod names .
sparkConf:
  # Naming the Driver and Executor pods
  "spark.app.name": "taxi-trip"
  "spark.kubernetes.driver.pod.name": "taxi-trip"
  "spark.kubernetes.executor.podNamePrefix": "taxi-trip"

I am using FluentBit to export the Driver and Executor logs. So, I am able to store the logs as follows in S3 bucket.
Driver → s3://spark-bucket/fluentbit-logs/taxi-trip/
Executor1 → s3://spark-bucket/fluentbit-logs/taxi-trip-exec-1/
Executor2 → s3://spark-bucket/fluentbit-logs/taxi-trip-exec-2/
...

I have also enabled the event logs to be written to S3 as shown in the below config
sparkConf:
  "spark.eventLog.enabled": "true"
  "spark.eventLog.dir": "s3a://spark-bucket/spark-history-event-logs/"

Spark Operator creates a Event log file with the name of sparkApplicationId  as shown below. It will be easy to correlate the App logs and Event Logs if we can leverage sparkApplicationId to be used in driver and executor pods as well.
s3://spark-bucket/spark-history-event-logs/*spark-0141a465e0ea4b5f97196987c204b63e*
Another question... :)
Currently my SparkHistoryServer setup only shows the Spark Events from the above file. I understand we can also view app logs for driver & executors from the Spark History Server. Does anyone know the required config to achieve this?
You can see my full implementation here for the above setup https://awslabs.github.io/data-on-eks/docs/data-analytics/spark-operator-yunikorn.

The only option I could think of is implementing a 'KubernetesDriverCustomFeatureConfigStep' to override pod naming steps from 'BasicDriverFeatureStep' and BasicExecutorFeatureStep. After that you should enable this as a custom feature using 'spark.kubernetes.driver.pod.featureSteps' config. However this is an unstable developer API, so definitely it's not prod-sufficient.
As an alternative, I'd rather consider storing the mapping between pod logs and event logs somewhere else. E.g, as an object
class SparkAppMeta {
  String appId;
  String appName;
  String driverLogPath;
  String[] executorLogPaths;
}

in a database. It would be much more customizable and reliable than based on solid naming conventions.
Regarding viewing logs from SparkHS, I don't know if it's available on K8S. In YARN, spark HS is can redirect you to YARN HS by application id and you'll be able to get container logs. There is no equivalent in spark-on-K8S case, as far as I know.
FYI: by the way, there is at least one known issue with storing event logs on S3 because of objectstores specifics: https://issues.apache.org/jira/browse/SPARK-35428

I am looking for an option to add sparkApplicationId to driver and executor pod names. This allows me to filter and structure the logs in S3 bucket with unique sparkApplicationId. I am planning to store the Spark Driver and Executor Logs under one folder with sparkApplicationId.
e.g.,
s3://spark-bucket/year=yyyy/month=mm/day=dd/<spark-application-id>/<app-name-driver>
s3://spark-bucket/year=yyyy/month=mm/day=dd/<spark-application-id>/<app-name-executor-1>
s3://spark-bucket/year=yyyy/month=mm/day=dd/<spark-application-id>/<app-name-executor-2>
...

This is my config to add the Driver and Executor Pod names .
sparkConf:
  # Naming the Driver and Executor pods
  "spark.app.name": "taxi-trip"
  "spark.kubernetes.driver.pod.name": "taxi-trip"
  "spark.kubernetes.executor.podNamePrefix": "taxi-trip"

I am using FluentBit to export the Driver and Executor logs. So, I am able to store the logs as follows in S3 bucket.
Driver → s3://spark-bucket/fluentbit-logs/taxi-trip/
Executor1 → s3://spark-bucket/fluentbit-logs/taxi-trip-exec-1/
Executor2 → s3://spark-bucket/fluentbit-logs/taxi-trip-exec-2/
...

I have also enabled the event logs to be written to S3 as shown in the below config
sparkConf:
  "spark.eventLog.enabled": "true"
  "spark.eventLog.dir": "s3a://spark-bucket/spark-history-event-logs/"

Spark Operator creates a Event log file with the name of sparkApplicationId as shown below. It will be easy to correlate the App logs and Event Logs if we can leverage sparkApplicationId to be used in driver and executor pods as well.
s3://spark-bucket/spark-history-event-logs/*spark-0141a465e0ea4b5f97196987c204b63e*
Another question... :)
Currently my SparkHistoryServer setup only shows the Spark Events from the above file. I understand we can also view app logs for driver & executors from the Spark History Server. Does anyone know the required config to achieve this?
You can see my full implementation here for the above setup https://awslabs.github.io/data-on-eks/docs/data-analytics/spark-operator-yunikorn.

could you please show the fluentbit config to forward raw log stdout of  driver and executor to s3 ? Thank you so much


Sections: not remembering drop down section selection

This happens when a user selects a section from a menu.  For example Applications > Costs.  When navigating to another page that section is not re-opened.

Issue was due to the old,simplistic _.find(availableSections, s => s.id) code.  Sections can now have child sections and we weren't looking at these children when trying to reopen sections.

Issue was due to the old,simplistic _.find(availableSections, s => s.id) code.  Sections can now have child sections and we weren't looking at these children when trying to reopen sections.


Published version is incorrectly pinned to pydata-sphinx-theme~=0.6.0

Describe the problem
If I pip install sphinx-book-theme it installs  pydata-sphinx-theme-0.6.3 and sphinx-book-theme-0.1.6. This is very confusing, since while pypi says the latest sphinx-book-theme is 0.1.6, the latest  pydata-sphinx-theme is 0.7.2, and your own source shows it should be pinned to 0.7.*:
https://github.com/executablebooks/sphinx-book-theme/blob/519cf7c78c9ecffdd073be680af8f8f60bb0b130/setup.py#L35
pip install sphinx-book-theme
$ mkdir t2
$ cd t2/
$ python3 -m venv .venv
$ . .venv/bin/activate
(.venv) $ pip install sphinx-book-theme
Collecting sphinx-book-theme
  Using cached sphinx_book_theme-0.1.6-py3-none-any.whl (92 kB)
Collecting docutils<0.17,>=0.15
  Using cached docutils-0.16-py2.py3-none-any.whl (548 kB)
Collecting sphinx<5,>=3
  Using cached Sphinx-4.3.0-py3-none-any.whl (3.1 MB)
Collecting pyyaml
  Using cached PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (661 kB)
Collecting beautifulsoup4<5,>=4.6.1
  Using cached beautifulsoup4-4.10.0-py3-none-any.whl (97 kB)
Collecting pydata-sphinx-theme~=0.6.0
  Using cached pydata_sphinx_theme-0.6.3-py3-none-any.whl (1.4 MB)
Collecting click~=7.1
  Using cached click-7.1.2-py2.py3-none-any.whl (82 kB)
Collecting soupsieve>1.2
  Using cached soupsieve-2.3-py3-none-any.whl (37 kB)
Collecting alabaster<0.8,>=0.7
  Using cached alabaster-0.7.12-py2.py3-none-any.whl (14 kB)
Collecting Pygments>=2.0
  Using cached Pygments-2.10.0-py3-none-any.whl (1.0 MB)
Collecting sphinxcontrib-htmlhelp>=2.0.0
  Using cached sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl (100 kB)
Collecting requests>=2.5.0
  Using cached requests-2.26.0-py2.py3-none-any.whl (62 kB)
Collecting sphinxcontrib-qthelp
  Using cached sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl (90 kB)
Collecting packaging
  Using cached packaging-21.2-py3-none-any.whl (40 kB)
Collecting sphinxcontrib-devhelp
  Using cached sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl (84 kB)
Collecting imagesize
  Using cached imagesize-1.3.0-py2.py3-none-any.whl (5.2 kB)
Collecting snowballstemmer>=1.1
  Using cached snowballstemmer-2.1.0-py2.py3-none-any.whl (93 kB)
Collecting sphinxcontrib-serializinghtml>=1.1.5
  Using cached sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl (94 kB)
Collecting sphinxcontrib-jsmath
  Using cached sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl (5.1 kB)
Collecting Jinja2>=2.3
  Using cached Jinja2-3.0.3-py3-none-any.whl (133 kB)
Collecting sphinxcontrib-applehelp
  Using cached sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl (121 kB)
Collecting babel>=1.3
  Using cached Babel-2.9.1-py2.py3-none-any.whl (8.8 MB)
Requirement already satisfied: setuptools in ./.venv/lib/python3.9/site-packages (from sphinx<5,>=3->sphinx-book-theme) (57.4.0)
Collecting pytz>=2015.7
  Using cached pytz-2021.3-py2.py3-none-any.whl (503 kB)
Collecting MarkupSafe>=2.0
  Using cached MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (30 kB)
Collecting idna<4,>=2.5
  Using cached idna-3.3-py3-none-any.whl (61 kB)
Collecting urllib3<1.27,>=1.21.1
  Using cached urllib3-1.26.7-py2.py3-none-any.whl (138 kB)
Collecting certifi>=2017.4.17
  Using cached certifi-2021.10.8-py2.py3-none-any.whl (149 kB)
Collecting charset-normalizer~=2.0.0
  Using cached charset_normalizer-2.0.7-py3-none-any.whl (38 kB)
Collecting pyparsing<3,>=2.0.2
  Using cached pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
Installing collected packages: urllib3, pytz, pyparsing, MarkupSafe, idna, charset-normalizer, certifi, sphinxcontrib-serializinghtml, sphinxcontrib-qthelp, sphinxcontrib-jsmath, sphinxcontrib-htmlhelp, sphinxcontrib-devhelp, sphinxcontrib-applehelp, soupsieve, snowballstemmer, requests, Pygments, packaging, Jinja2, imagesize, docutils, babel, alabaster, sphinx, beautifulsoup4, pyyaml, pydata-sphinx-theme, click, sphinx-book-theme
Successfully installed Jinja2-3.0.3 MarkupSafe-2.0.1 Pygments-2.10.0 alabaster-0.7.12 babel-2.9.1 beautifulsoup4-4.10.0 certifi-2021.10.8 charset-normalizer-2.0.7 click-7.1.2 docutils-0.16 idna-3.3 imagesize-1.3.0 packaging-21.2 pydata-sphinx-theme-0.6.3 pyparsing-2.4.7 pytz-2021.3 pyyaml-6.0 requests-2.26.0 snowballstemmer-2.1.0 soupsieve-2.3 sphinx-4.3.0 sphinx-book-theme-0.1.6 sphinxcontrib-applehelp-1.0.2 sphinxcontrib-devhelp-1.0.2 sphinxcontrib-htmlhelp-2.0.0 sphinxcontrib-jsmath-1.0.1 sphinxcontrib-qthelp-1.0.3 sphinxcontrib-serializinghtml-1.1.5 urllib3-1.26.7
WARNING: You are using pip version 21.2.3; however, version 21.3.1 is available.
You should consider upgrading via the '/home/kousu/src/neuropoly/t2/.venv/bin/python3 -m pip install --upgrade pip' command.

If I try to force it to use 0.7.* like it should, pip tries to download every version of sphinx-book-theme until it finds one it's satisfied with, eventually picking pydata-sphinx-theme-0.7.2 and sphinx-book-theme-0.0.11, an ancient version.
...
  Downloading sphinx_book_theme-0.0.28-py3-none-any.whl (31 kB)
  Downloading sphinx_book_theme-0.0.27-py3-none-any.whl (31 kB)
  Downloading sphinx_book_theme-0.0.26-py3-none-any.whl (31 kB)
  Downloading sphinx_book_theme-0.0.25-py3-none-any.whl (30 kB)
...

pip install pydata-sphinx-theme~=0.7.1 sphinx-book-theme
(.venv) [kousu@requiem t2]$ pip uninstall -y pydata-sphinx-theme sphinx-book-theme
Found existing installation: pydata-sphinx-theme 0.6.3
Uninstalling pydata-sphinx-theme-0.6.3:
  Successfully uninstalled pydata-sphinx-theme-0.6.3
Found existing installation: sphinx-book-theme 0.1.6
Uninstalling sphinx-book-theme-0.1.6:
  Successfully uninstalled sphinx-book-theme-0.1.6
(.venv) [kousu@requiem t2]$ pip install pydata-sphinx-theme~=0.7.1 sphinx-book-theme
Collecting pydata-sphinx-theme~=0.7.1
  Downloading pydata_sphinx_theme-0.7.2-py3-none-any.whl (1.4 MB)
     |████████████████████████████████| 1.4 MB 2.4 MB/s
Collecting sphinx-book-theme
  Using cached sphinx_book_theme-0.1.6-py3-none-any.whl (92 kB)
Requirement already satisfied: beautifulsoup4 in ./.venv/lib/python3.9/site-packages (from pydata-sphinx-theme~=0.7.1) (4.10.0)
Requirement already satisfied: docutils!=0.17.0 in ./.venv/lib/python3.9/site-packages (from pydata-sphinx-theme~=0.7.1) (0.16)
Requirement already satisfied: sphinx in ./.venv/lib/python3.9/site-packages (from pydata-sphinx-theme~=0.7.1) (4.3.0)
Requirement already satisfied: pyyaml in ./.venv/lib/python3.9/site-packages (from sphinx-book-theme) (6.0)
Requirement already satisfied: click~=7.1 in ./.venv/lib/python3.9/site-packages (from sphinx-book-theme) (7.1.2)
  Downloading sphinx_book_theme-0.1.5-py3-none-any.whl (92 kB)
     |████████████████████████████████| 92 kB 3.1 MB/s
  Downloading sphinx_book_theme-0.1.4-py3-none-any.whl (89 kB)
     |████████████████████████████████| 89 kB 2.2 MB/s
  Downloading sphinx_book_theme-0.1.3-py3-none-any.whl (88 kB)
     |████████████████████████████████| 88 kB 2.5 MB/s
  Downloading sphinx_book_theme-0.1.2-py3-none-any.whl (88 kB)
     |████████████████████████████████| 88 kB 2.5 MB/s
  Downloading sphinx_book_theme-0.1.1-py3-none-any.whl (88 kB)
     |████████████████████████████████| 88 kB 2.4 MB/s
  Downloading sphinx_book_theme-0.1.0-py3-none-any.whl (87 kB)
     |████████████████████████████████| 87 kB 2.2 MB/s
  Downloading sphinx_book_theme-0.0.42-py3-none-any.whl (89 kB)
     |████████████████████████████████| 89 kB 2.4 MB/s
  Downloading sphinx_book_theme-0.0.41-py3-none-any.whl (89 kB)
     |████████████████████████████████| 89 kB 2.6 MB/s
  Downloading sphinx_book_theme-0.0.40-py3-none-any.whl (89 kB)
     |████████████████████████████████| 89 kB 2.8 MB/s
  Downloading sphinx_book_theme-0.0.39-py3-none-any.whl (86 kB)
     |████████████████████████████████| 86 kB 2.0 MB/s
  Downloading sphinx_book_theme-0.0.38-py3-none-any.whl (84 kB)
     |████████████████████████████████| 84 kB 1.1 MB/s
  Downloading sphinx_book_theme-0.0.37-py3-none-any.whl (84 kB)
     |████████████████████████████████| 84 kB 1.5 MB/s
  Downloading sphinx_book_theme-0.0.36-py3-none-any.whl (31 kB)
  Downloading sphinx_book_theme-0.0.35-py3-none-any.whl (30 kB)
  Downloading sphinx_book_theme-0.0.34-py3-none-any.whl (30 kB)
  Downloading sphinx_book_theme-0.0.33-py3-none-any.whl (30 kB)
  Downloading sphinx_book_theme-0.0.32-py3-none-any.whl (30 kB)
  Downloading sphinx_book_theme-0.0.31-py3-none-any.whl (29 kB)
  Downloading sphinx_book_theme-0.0.30-py3-none-any.whl (29 kB)
  Downloading sphinx_book_theme-0.0.29-py3-none-any.whl (29 kB)
  Downloading sphinx_book_theme-0.0.28-py3-none-any.whl (31 kB)
  Downloading sphinx_book_theme-0.0.27-py3-none-any.whl (31 kB)
  Downloading sphinx_book_theme-0.0.26-py3-none-any.whl (31 kB)
  Downloading sphinx_book_theme-0.0.25-py3-none-any.whl (30 kB)
  Downloading sphinx_book_theme-0.0.24-py3-none-any.whl (23 kB)
  Downloading sphinx_book_theme-0.0.23-py3-none-any.whl (23 kB)
  Downloading sphinx_book_theme-0.0.22-py3-none-any.whl (23 kB)
  Downloading sphinx_book_theme-0.0.21-py3-none-any.whl (23 kB)
  Downloading sphinx_book_theme-0.0.20-py3-none-any.whl (22 kB)
  Downloading sphinx_book_theme-0.0.19-py3-none-any.whl (22 kB)
  Downloading sphinx_book_theme-0.0.18-py3-none-any.whl (22 kB)
Collecting libsass
  Downloading libsass-0.21.0-cp36-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl (9.4 MB)
     |████████████████████████████████| 9.4 MB 4.6 MB/s
Requirement already satisfied: setuptools in ./.venv/lib/python3.9/site-packages (from sphinx-book-theme) (57.4.0)
Collecting sphinx-book-theme
  Downloading sphinx_book_theme-0.0.17-py3-none-any.whl (22 kB)
  Downloading sphinx_book_theme-0.0.16-py3-none-any.whl (21 kB)
  Downloading sphinx_book_theme-0.0.15-py3-none-any.whl (21 kB)
  Downloading sphinx_book_theme-0.0.14-py3-none-any.whl (21 kB)
  Downloading sphinx_book_theme-0.0.13-py3-none-any.whl (21 kB)
  Downloading sphinx_book_theme-0.0.12-py3-none-any.whl (21 kB)
  Downloading sphinx_book_theme-0.0.11-py3-none-any.whl (21 kB)
Requirement already satisfied: soupsieve>1.2 in ./.venv/lib/python3.9/site-packages (from beautifulsoup4->pydata-sphinx-theme~=0.7.1) (2.3)
Collecting six
  Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Requirement already satisfied: sphinxcontrib-applehelp in ./.venv/lib/python3.9/site-packages (from sphinx->pydata-sphinx-theme~=0.7.1) (1.0.2)
Requirement already satisfied: imagesize in ./.venv/lib/python3.9/site-packages (from sphinx->pydata-sphinx-theme~=0.7.1) (1.3.0)
Requirement already satisfied: Jinja2>=2.3 in ./.venv/lib/python3.9/site-packages (from sphinx->pydata-sphinx-theme~=0.7.1) (3.0.3)
Requirement already satisfied: sphinxcontrib-jsmath in ./.venv/lib/python3.9/site-packages (from sphinx->pydata-sphinx-theme~=0.7.1) (1.0.1)
Requirement already satisfied: sphinxcontrib-htmlhelp>=2.0.0 in ./.venv/lib/python3.9/site-packages (from sphinx->pydata-sphinx-theme~=0.7.1) (2.0.0)
Requirement already satisfied: alabaster<0.8,>=0.7 in ./.venv/lib/python3.9/site-packages (from sphinx->pydata-sphinx-theme~=0.7.1) (0.7.12)
Requirement already satisfied: Pygments>=2.0 in ./.venv/lib/python3.9/site-packages (from sphinx->pydata-sphinx-theme~=0.7.1) (2.10.0)
Requirement already satisfied: sphinxcontrib-devhelp in ./.venv/lib/python3.9/site-packages (from sphinx->pydata-sphinx-theme~=0.7.1) (1.0.2)
Requirement already satisfied: babel>=1.3 in ./.venv/lib/python3.9/site-packages (from sphinx->pydata-sphinx-theme~=0.7.1) (2.9.1)
Requirement already satisfied: sphinxcontrib-serializinghtml>=1.1.5 in ./.venv/lib/python3.9/site-packages (from sphinx->pydata-sphinx-theme~=0.7.1) (1.1.5)
Requirement already satisfied: snowballstemmer>=1.1 in ./.venv/lib/python3.9/site-packages (from sphinx->pydata-sphinx-theme~=0.7.1) (2.1.0)
Requirement already satisfied: packaging in ./.venv/lib/python3.9/site-packages (from sphinx->pydata-sphinx-theme~=0.7.1) (21.2)
Requirement already satisfied: sphinxcontrib-qthelp in ./.venv/lib/python3.9/site-packages (from sphinx->pydata-sphinx-theme~=0.7.1) (1.0.3)
Requirement already satisfied: requests>=2.5.0 in ./.venv/lib/python3.9/site-packages (from sphinx->pydata-sphinx-theme~=0.7.1) (2.26.0)
Requirement already satisfied: pytz>=2015.7 in ./.venv/lib/python3.9/site-packages (from babel>=1.3->sphinx->pydata-sphinx-theme~=0.7.1) (2021.3)
Requirement already satisfied: MarkupSafe>=2.0 in ./.venv/lib/python3.9/site-packages (from Jinja2>=2.3->sphinx->pydata-sphinx-theme~=0.7.1) (2.0.1)
Requirement already satisfied: certifi>=2017.4.17 in ./.venv/lib/python3.9/site-packages (from requests>=2.5.0->sphinx->pydata-sphinx-theme~=0.7.1) (2021.10.8)
Requirement already satisfied: charset-normalizer~=2.0.0 in ./.venv/lib/python3.9/site-packages (from requests>=2.5.0->sphinx->pydata-sphinx-theme~=0.7.1) (2.0.7)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in ./.venv/lib/python3.9/site-packages (from requests>=2.5.0->sphinx->pydata-sphinx-theme~=0.7.1) (1.26.7)
Requirement already satisfied: idna<4,>=2.5 in ./.venv/lib/python3.9/site-packages (from requests>=2.5.0->sphinx->pydata-sphinx-theme~=0.7.1) (3.3)
Requirement already satisfied: pyparsing<3,>=2.0.2 in ./.venv/lib/python3.9/site-packages (from packaging->sphinx->pydata-sphinx-theme~=0.7.1) (2.4.7)
Installing collected packages: six, pydata-sphinx-theme, libsass, sphinx-book-theme
Successfully installed libsass-0.21.0 pydata-sphinx-theme-0.7.2 six-1.16.0 sphinx-book-theme-0.0.11
WARNING: You are using pip version 21.2.3; however, version 21.3.1 is available.
You should consider upgrading via the '/home/kousu/src/neuropoly/t2/.venv/bin/python3 -m pip install --upgrade pip' command.

What is going on??
If I download the wheel directly from pypi and examine it, I find that it's pinned to
Requires-Dist: pydata-sphinx-theme (~=0.6.0)

which must explain pip's weird behaviour.
curl sphinx-book-theme-0.1.6.whl | unzip
$ curl -JLO https://files.pythonhosted.org/packages/7e/8d/fd2d209e83ee5491b658d079a3f27f66ee444fb02d88a3c8f5e64f8d8fa5/sphinx_book_theme-0.1.6-py3-none-any.whl
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 92129  100 92129    0     0   533k      0 --:--:-- --:--:-- --:--:--  535k
(.venv) $ unzip sphinx_book_theme-0.1.6-py3-none-any.whl
Archive:  sphinx_book_theme-0.1.6-py3-none-any.whl
  inflating: sphinx_book_theme/__init__.py
  inflating: sphinx_book_theme/footer.html
  inflating: sphinx_book_theme/launch.py
  inflating: sphinx_book_theme/layout.html
  inflating: sphinx_book_theme/sidebar.html
  inflating: sphinx_book_theme/theme.conf
  inflating: sphinx_book_theme/topbar.html
  inflating: sphinx_book_theme/_templates/prev-next.html
  inflating: sphinx_book_theme/_templates/sbt-sidebar-footer.html
  inflating: sphinx_book_theme/_templates/sbt-sidebar-nav.html
  inflating: sphinx_book_theme/_templates/sidebar-logo.html
  inflating: sphinx_book_theme/static/__init__.py
  inflating: sphinx_book_theme/static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js
  inflating: sphinx_book_theme/static/sphinx-book-theme.css
  inflating: sphinx_book_theme/static/sphinx-book-theme.e2363ea40746bee74734a24ffefccd78.css
  inflating: sphinx_book_theme/static/images/logo_binder.svg
  inflating: sphinx_book_theme/static/images/logo_colab.png
  inflating: sphinx_book_theme/static/images/logo_jupyterhub.svg
  inflating: sphinx_book_theme/topbar/download.html
  inflating: sphinx_book_theme/topbar/fullscreen.html
  inflating: sphinx_book_theme/topbar/launchbuttons.html
  inflating: sphinx_book_theme/topbar/repobuttons.html
  inflating: sphinx_book_theme/translations/README.md
  inflating: sphinx_book_theme/translations/__init__.py
  inflating: sphinx_book_theme/translations/_convert.py
  inflating: sphinx_book_theme/translations/locales/__init__.py
  inflating: sphinx_book_theme/translations/locales/ar/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/bg/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/bn/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/ca/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/cs/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/da/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/de/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/el/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/eo/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/es/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/et/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/fi/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/fr/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/hr/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/id/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/it/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/iw/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/ja/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/ko/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/lt/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/lv/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/ml/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/mr/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/ms/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/nl/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/no/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/pl/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/pt/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/ro/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/ru/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/sk/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/sl/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/sr/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/sv/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/ta/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/te/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/tg/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/th/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/tl/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/tr/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/uk/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/ur/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/vi/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/zh-cn/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme/translations/locales/zh-tw/LC_MESSAGES/booktheme.mo
  inflating: sphinx_book_theme-0.1.6.dist-info/LICENSE
  inflating: sphinx_book_theme-0.1.6.dist-info/METADATA
  inflating: sphinx_book_theme-0.1.6.dist-info/WHEEL
  inflating: sphinx_book_theme-0.1.6.dist-info/entry_points.txt
  inflating: sphinx_book_theme-0.1.6.dist-info/top_level.txt
  inflating: sphinx_book_theme-0.1.6.dist-info/RECORD
(.venv) $ cat sphinx_book_theme-0.1.6.dist-info/METADATA
Metadata-Version: 2.1
Name: sphinx-book-theme
Version: 0.1.6
Summary: Jupyter Book: Create an online book with Jupyter Notebooks
Home-page: https://jupyterbook.org/
Author: Project Jupyter Contributors
Author-email<EMAIL_ADDRESS>License: BSD
Project-URL: Documentation, https://jupyterbook.org
Project-URL: Funding, https://jupyter.org/about
Project-URL: Source, https://github.com/jupyter/jupyter-book/
Project-URL: Tracker, https://github.com/jupyter/jupyter-book/issues
Keywords: reproducible science environments scholarship notebook
Platform: UNKNOWN
Requires-Python: >=3.6
Description-Content-Type: text/markdown
Requires-Dist: beautifulsoup4 (<5,>=4.6.1)
Requires-Dist: click (~=7.1)
Requires-Dist: docutils (<0.17,>=0.15)
Requires-Dist: pydata-sphinx-theme (~=0.6.0)
Requires-Dist: pyyaml
Requires-Dist: sphinx (<5,>=3)
Requires-Dist: importlib-resources (<3.5,>=3.0) ; python_version < "3.7"
Provides-Extra: code_style
Requires-Dist: pre-commit (~=2.7.0) ; extra == 'code_style'
Provides-Extra: live-dev
Requires-Dist: sphinx-autobuild ; extra == 'live-dev'
Requires-Dist: web-compile (~=0.2.1) ; extra == 'live-dev'
Provides-Extra: sphinx
Requires-Dist: ablog (~=0.10.13) ; extra == 'sphinx'
Requires-Dist: ipywidgets ; extra == 'sphinx'
Requires-Dist: folium ; extra == 'sphinx'
Requires-Dist: numpy ; extra == 'sphinx'
Requires-Dist: matplotlib ; extra == 'sphinx'
Requires-Dist: myst-nb (~=0.13) ; extra == 'sphinx'
Requires-Dist: nbclient ; extra == 'sphinx'
Requires-Dist: pandas ; extra == 'sphinx'
Requires-Dist: plotly ; extra == 'sphinx'
Requires-Dist: sphinx (~=4.0) ; extra == 'sphinx'
Requires-Dist: sphinx-design ; extra == 'sphinx'
Requires-Dist: sphinx-copybutton ; extra == 'sphinx'
Requires-Dist: sphinx-togglebutton (>=0.2.1) ; extra == 'sphinx'
Requires-Dist: sphinx-thebe ; extra == 'sphinx'
Requires-Dist: sphinxcontrib-bibtex (~=2.2) ; extra == 'sphinx'
Requires-Dist: sphinxext-opengraph ; extra == 'sphinx'
Provides-Extra: testing
Requires-Dist: coverage ; extra == 'testing'
Requires-Dist: myst-nb (~=0.13) ; extra == 'testing'
Requires-Dist: pytest (~=6.0.1) ; extra == 'testing'
Requires-Dist: pytest-cov ; extra == 'testing'
Requires-Dist: pytest-regressions (~=2.0.1) ; extra == 'testing'
Requires-Dist: sphinx-thebe ; extra == 'testing'

# sphinx-book-theme

[![codecov][codecov-badge]][codecov-link] [![Documentation Status][rtd-badge]][rtd-link] [![PyPI][pypi-badge]][pypi-link]

**An interactive book theme for Sphinx**.

This is a lightweight Sphinx theme designed to mimic the look-and-feel of an
interactive book. It has the following primary features:

* **Bootstrap 4**
  for visual elements and functionality.
* **Flexible content layout** that is inspired by beautiful online books,
  such as [the Edward Tufte CSS guide](https://edwardtufte.github.io/tufte-css/)
* **Visual classes designed for Jupyter Notebooks**. Cell inputs, outputs,
  and interactive functionality are all supported.
* **Launch buttons for online interactivity**. For pages that are built with
  computational material, connect your site to an online BinderHub for interactive content.

## Get started

To get started with `sphinx-book-theme`, first install it with `pip`:

pip install sphinx-book-theme

then, activate the theme in your Sphinx configuration (`conf.py`):

...
html_theme = "sphinx_book_theme"
...

This will activate the Sphinx Book Theme for your documentation. Note that you may
need to change your `html_theme_options` configuration depending on your previous
theme. See the pages to the left for information about what you can configure with
`sphinx-book-theme`.

## Documentation

See [the Sphinx Book Theme documentation](https://sphinx-book-theme.readthedocs.io/en/latest/)
for more information.

[codecov-badge]: https://codecov.io/gh/executablebooks/sphinx-book-theme/branch/master/graph/badge.svg
[codecov-link]: https://codecov.io/gh/executablebooks/sphinx-book-theme

[rtd-badge]: https://readthedocs.org/projects/sphinx-book-theme/badge/?version=latest
[rtd-link]: https://sphinx-book-theme.readthedocs.io/en/latest/?badge=latest

[pypi-badge]: https://img.shields.io/pypi/v/sphinx-book-theme.svg
[pypi-link]: https://pypi.org/project/sphinx-book-theme

And if I examine the sdist I find indeed it declares that dep, and also that it is 0.1.6:
# setup.py
        "pydata-sphinx-theme~=0.6.0",

# __init__.py
__version__ = "0.1.6"

(.venv) $ curl -JLO https://files.pythonhosted.org/packages/84/65/2304f4100023a6008afe4e5a3520f180a0f9fe670e9f3f34c634434aa933/sphinx-book-theme-0.1.6.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 60390  100 60390    0     0   248k      0 --:--:-- --:--:-- --:--:--  249k
(.venv) [kousu@requiem t2]$ tar -zxvf sphinx-book-theme-0.1.6.tar.gz
sphinx-book-theme-0.1.6/
sphinx-book-theme-0.1.6/CHANGELOG.md
sphinx-book-theme-0.1.6/CONTRIBUTING.md
sphinx-book-theme-0.1.6/LICENSE
sphinx-book-theme-0.1.6/MANIFEST.in
sphinx-book-theme-0.1.6/PKG-INFO
sphinx-book-theme-0.1.6/README.md
sphinx-book-theme-0.1.6/setup.cfg
sphinx-book-theme-0.1.6/setup.py
sphinx-book-theme-0.1.6/sphinx_book_theme/
sphinx-book-theme-0.1.6/sphinx_book_theme/__init__.py
sphinx-book-theme-0.1.6/sphinx_book_theme/_templates/
sphinx-book-theme-0.1.6/sphinx_book_theme/_templates/prev-next.html
sphinx-book-theme-0.1.6/sphinx_book_theme/_templates/sbt-sidebar-footer.html
sphinx-book-theme-0.1.6/sphinx_book_theme/_templates/sbt-sidebar-nav.html
sphinx-book-theme-0.1.6/sphinx_book_theme/_templates/sidebar-logo.html
sphinx-book-theme-0.1.6/sphinx_book_theme/footer.html
sphinx-book-theme-0.1.6/sphinx_book_theme/launch.py
sphinx-book-theme-0.1.6/sphinx_book_theme/layout.html
sphinx-book-theme-0.1.6/sphinx_book_theme/sidebar.html
sphinx-book-theme-0.1.6/sphinx_book_theme/static/
sphinx-book-theme-0.1.6/sphinx_book_theme/static/__init__.py
sphinx-book-theme-0.1.6/sphinx_book_theme/static/images/
sphinx-book-theme-0.1.6/sphinx_book_theme/static/images/logo_binder.svg
sphinx-book-theme-0.1.6/sphinx_book_theme/static/images/logo_colab.png
sphinx-book-theme-0.1.6/sphinx_book_theme/static/images/logo_jupyterhub.svg
sphinx-book-theme-0.1.6/sphinx_book_theme/static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js
sphinx-book-theme-0.1.6/sphinx_book_theme/static/sphinx-book-theme.css
sphinx-book-theme-0.1.6/sphinx_book_theme/static/sphinx-book-theme.e2363ea40746bee74734a24ffefccd78.css
sphinx-book-theme-0.1.6/sphinx_book_theme/theme.conf
sphinx-book-theme-0.1.6/sphinx_book_theme/topbar/
sphinx-book-theme-0.1.6/sphinx_book_theme/topbar/download.html
sphinx-book-theme-0.1.6/sphinx_book_theme/topbar/fullscreen.html
sphinx-book-theme-0.1.6/sphinx_book_theme/topbar/launchbuttons.html
sphinx-book-theme-0.1.6/sphinx_book_theme/topbar/repobuttons.html
sphinx-book-theme-0.1.6/sphinx_book_theme/topbar.html
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/README.md
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/__init__.py
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/_convert.py
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/__init__.py
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ar/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ar/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ar/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/bg/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/bg/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/bg/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/bn/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/bn/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/bn/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ca/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ca/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ca/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/cs/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/cs/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/cs/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/da/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/da/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/da/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/de/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/de/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/de/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/el/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/el/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/el/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/eo/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/eo/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/eo/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/es/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/es/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/es/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/et/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/et/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/et/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/fi/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/fi/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/fi/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/fr/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/fr/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/fr/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/hr/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/hr/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/hr/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/id/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/id/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/id/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/it/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/it/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/it/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/iw/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/iw/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/iw/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ja/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ja/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ja/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ko/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ko/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ko/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/lt/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/lt/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/lt/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/lv/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/lv/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/lv/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ml/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ml/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ml/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/mr/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/mr/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/mr/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ms/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ms/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ms/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/nl/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/nl/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/nl/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/no/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/no/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/no/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/pl/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/pl/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/pl/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/pt/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/pt/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/pt/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ro/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ro/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ro/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ru/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ru/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ru/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/sk/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/sk/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/sk/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/sl/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/sl/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/sl/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/sr/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/sr/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/sr/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/sv/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/sv/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/sv/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ta/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ta/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ta/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/te/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/te/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/te/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/tg/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/tg/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/tg/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/th/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/th/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/th/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/tl/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/tl/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/tl/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/tr/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/tr/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/tr/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/uk/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/uk/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/uk/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ur/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ur/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/ur/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/vi/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/vi/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/vi/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/zh-cn/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/zh-cn/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/zh-cn/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/zh-tw/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/zh-tw/LC_MESSAGES/
sphinx-book-theme-0.1.6/sphinx_book_theme/translations/locales/zh-tw/LC_MESSAGES/booktheme.mo
sphinx-book-theme-0.1.6/sphinx_book_theme.egg-info/
sphinx-book-theme-0.1.6/sphinx_book_theme.egg-info/PKG-INFO
sphinx-book-theme-0.1.6/sphinx_book_theme.egg-info/SOURCES.txt
sphinx-book-theme-0.1.6/sphinx_book_theme.egg-info/dependency_links.txt
sphinx-book-theme-0.1.6/sphinx_book_theme.egg-info/entry_points.txt
sphinx-book-theme-0.1.6/sphinx_book_theme.egg-info/requires.txt
sphinx-book-theme-0.1.6/sphinx_book_theme.egg-info/top_level.txt
sphinx-book-theme-0.1.6/web-compile-config.yml
(.venv) $ cat sphinx-book-theme-0.1.6/setup.py
from setuptools import setup, find_packages
from pathlib import Path

lines = Path("sphinx_book_theme").joinpath("__init__.py")
for line in lines.read_text().split("\n"):
    if line.startswith("__version__ ="):
        version = line.split(" = ")[-1].strip('"')
        break

setup(
    name="sphinx-book-theme",
    version=version,
    python_requires=">=3.6",
    author="Project Jupyter Contributors",
<EMAIL_ADDRESS>    url="https://jupyterbook.org/",
    project_urls={
        "Documentation": "https://jupyterbook.org",
        "Funding": "https://jupyter.org/about",
        "Source": "https://github.com/jupyter/jupyter-book/",
        "Tracker": "https://github.com/jupyter/jupyter-book/issues",
    },
    # this should be a whitespace separated string of keywords, not a list
    keywords="reproducible science environments scholarship notebook",
    description="Jupyter Book: Create an online book with Jupyter Notebooks",
    long_description=Path("./README.md").read_text(),
    long_description_content_type="text/markdown",
    license="BSD",
    packages=find_packages(),
    install_requires=[
        "beautifulsoup4>=4.6.1,<5",
        "click~=7.1",
        "docutils>=0.15,<0.17",
        'importlib-resources>=3.0,<3.5; python_version < "3.7"',
        "pydata-sphinx-theme~=0.6.0",
        "pyyaml",
        "sphinx>=3,<5",
    ],
    extras_require={
        "code_style": ["pre-commit~=2.7.0"],
        "sphinx": [
            "ablog~=0.10.13",
            "ipywidgets",
            "folium",
            "numpy",
            "matplotlib",
            "myst-nb~=0.13",
            "nbclient",
            "pandas",
            "plotly",
            "sphinx~=4.0",  # Force Sphinx to be the latest version
            "sphinx-design",
            "sphinx-copybutton",
            "sphinx-togglebutton>=0.2.1",
            "sphinx-thebe",
            "sphinxcontrib-bibtex~=2.2",
            "sphinxext-opengraph",
        ],
        "testing": [
            "coverage",
            "myst_nb~=0.13",
            "pytest~=6.0.1",
            "pytest-cov",
            "pytest-regressions~=2.0.1",
            "sphinx_thebe",
        ],
        "live-dev": ["sphinx-autobuild", "web-compile~=0.2.1"],
    },
    entry_points={"sphinx.html_themes": ["sphinx_book_theme = sphinx_book_theme"]},
    include_package_data=True,
)
(.venv) $ cat sphinx-book-theme-0.1.6/sphinx_book_theme/__init__.py
"""A lightweight book theme based on the pydata sphinx theme."""
import os
from pathlib import Path

try:
    import importlib.resources as resources
except ImportError:
    # python < 3.7
    import importlib_resources as resources

from bs4 import BeautifulSoup as bs
from docutils.parsers.rst.directives.body import Sidebar
from docutils import nodes
from sphinx.application import Sphinx
from sphinx.locale import get_translation
from sphinx.util import logging

from .launch import add_hub_urls
from . import static as theme_static

__version__ = "0.1.6"
"""sphinx-book-theme version"""

SPHINX_LOGGER = logging.getLogger(__name__)
MESSAGE_CATALOG_NAME = "booktheme"

def get_html_theme_path():
    """Return list of HTML theme paths."""
    theme_path = os.path.abspath(Path(__file__).parent)
    return theme_path

def add_static_paths(app):
    """Ensure CSS/JS is loaded."""
    app.env.book_theme_resources_changed = False

    output_static_folder = Path(app.outdir) / "_static"
    theme_static_files = resources.contents(theme_static)

    if (
        app.config.html_theme_options.get("theme_dev_mode", False)
        and output_static_folder.exists()
    ):
        # during development, the JS/CSS may change, if this is the case,
        # we want to remove the old files and ensure that the new files are loaded
        for path in output_static_folder.glob("sphinx-book-theme*"):
            if path.name not in theme_static_files:
                app.env.book_theme_resources_changed = True
                path.unlink()
        # note sphinx treats theme css different to regular css
        # (it is specified in theme.conf), so we don't directly use app.add_css_file
        for fname in resources.contents(theme_static):
            if fname.endswith(".css"):
                if not (output_static_folder / fname).exists():
                    (output_static_folder / fname).write_bytes(
                        resources.read_binary(theme_static, fname)
                    )
                    app.env.book_theme_resources_changed = True

    # add javascript
    for fname in resources.contents(theme_static):
        if fname.endswith(".js"):
            app.add_js_file(fname)

def update_all(app, env):
    """During development, if CSS/JS has changed, all files should be re-written,
    to load the correct resources.
    """
    if (
        app.config.html_theme_options.get("theme_dev_mode", False)
        and env.book_theme_resources_changed
    ):
        return list(env.all_docs.keys())

def add_to_context(app, pagename, templatename, context, doctree):

    # TODO: remove this whenever the nav collapsing functionality is in the PST
    def sbt_generate_nav_html(
        level=1,
        include_item_names=False,
        with_home_page=False,
        prev_section_numbers=None,
        show_depth=1,
    ):
        # Config stuff
        config = app.env.config
        if isinstance(with_home_page, str):
            with_home_page = with_home_page.lower() == "true"

        # Convert the pydata toctree html to beautifulsoup
        toctree = context["generate_nav_html"](
            startdepth=level - 1,
            kind="sidebar",
            maxdepth=4,
            collapse=False,
            includehidden=True,
            titles_only=True,
        )
        toctree = bs(toctree, "html.parser")

        # Add the master_doc page as the first item if specified
        if with_home_page:
            # Pull metadata about the master doc
            master_doc = config["master_doc"]
            master_doctree = app.env.get_doctree(master_doc)
            master_url = context["pathto"](master_doc)
            master_title = list(master_doctree.traverse(nodes.title))
            if len(master_title) == 0:
                raise ValueError(f"Landing page missing a title: {master_doc}")
            master_title = master_title[0].astext()
            li_class = "toctree-l1"
            if context["pagename"] == master_doc:
                li_class += " current"
            # Insert it into our toctree
            ul_home = bs(
                f"""
            <ul class="nav bd-sidenav">
                <li class="{li_class}">
                    <a href="{master_url}" class="reference internal">{master_title}</a>
                </li>
            </ul>""",
                "html.parser",
            )
            toctree.insert(0, ul_home("ul")[0])

        # Open the navbar to the proper depth
        for ii in range(int(show_depth)):
            for checkbox in toctree.select(
                f"li.toctree-l{ii} > input.toctree-checkbox"
            ):
                checkbox.attrs["checked"] = None

        return toctree.prettify()

    context["sbt_generate_nav_html"] = sbt_generate_nav_html

    # Update the page title because HTML makes it into the page title occasionally
    if pagename in app.env.titles:
        title = app.env.titles[pagename]
        context["pagetitle"] = title.astext()

    # Add a shortened page text to the context using the sections text
    if doctree:
        description = ""
        for section in doctree.traverse(nodes.section):
            description += section.astext().replace("\n", " ")
        description = description[:160]
        context["page_description"] = description

    # Add the author if it exists
    if app.config.author != "unknown":
        context["author"] = app.config.author

    # Add HTML context variables that the pydata theme uses that we configure elsewhere
    # For some reason the source_suffix sometimes isn't there even when doctree is
    if doctree and context.get("page_source_suffix"):
        config_theme = app.config.html_theme_options
        repo_url = config_theme.get("repository_url", "")
        # Only add the edit button if `repository_url` is given
        if repo_url:
            branch = config_theme.get("repository_branch")
            if not branch:
                # Explicitly check in cae branch is ""
                branch = "master"
            relpath = config_theme.get("path_to_docs", "")
            org, repo = repo_url.strip("/").split("/")[-2:]
            context.update(
                {
                    "github_user": org,
                    "github_repo": repo,
                    "github_version": branch,
                    "doc_path": relpath,
                }
            )
    else:
        # Disable using the button so we don't get errors
        context["theme_use_edit_page_button"] = False

    # Make sure the context values are bool
    btns = [
        "theme_use_edit_page_button",
        "theme_use_repository_button",
        "theme_use_issues_button",
        "theme_use_download_button",
        "theme_use_fullscreen_button",
    ]
    for key in btns:
        if key in context:
            context[key] = _string_or_bool(context[key])

    translation = get_translation(MESSAGE_CATALOG_NAME)
    context["translate"] = translation
    # this is set in the html_theme
    context["theme_search_bar_text"] = translation(
        context.get("theme_search_bar_text", "Search the docs ...")
    )

def update_thebe_config(app, env, docnames):
    """Update thebe configuration with SBT-specific values"""
    theme_options = env.config.html_theme_options
    if theme_options.get("launch_buttons", {}).get("thebe") is True:
        if not hasattr(env.config, "thebe_config"):
            SPHINX_LOGGER.warning(
                (
                    "Thebe is activated but not added to extensions list. "
                    "Add `sphinx_thebe` to your site's extensions list."
                )
            )
            return
        # Will be empty if it doesn't exist
        thebe_config = env.config.thebe_config
    else:
        return

    if not theme_options.get("launch_buttons", {}).get("thebe"):
        return

    # Update the repository branch and URL
    # Assume that if there's already a thebe_config, then we don't want to over-ride
    if "repository_url" not in thebe_config:
        thebe_config["repository_url"] = theme_options.get("repository_url")
    if "repository_branch" not in thebe_config:
        branch = theme_options.get("repository_branch")
        if not branch:
            # Explicitly check in case branch is ""
            branch = "master"
        thebe_config["repository_branch"] = branch

    # Update the selectors to find thebe-enabled cells
    selector = thebe_config.get("selector", "") + ",.cell"
    thebe_config["selector"] = selector.lstrip(",")

    selector_input = (
        thebe_config.get("selector_input", "") + ",.cell_input div.highlight"
    )
    thebe_config["selector_input"] = selector_input.lstrip(",")

    selector_output = thebe_config.get("selector_output", "") + ",.cell_output"
    thebe_config["selector_output"] = selector_output.lstrip(",")

    env.config.thebe_config = thebe_config

def _string_or_bool(var):
    if isinstance(var, str):
        return var.lower() == "true"
    elif isinstance(var, bool):
        return var
    else:
        return var is None

class Margin(Sidebar):
    """Goes in the margin to the right of the page."""

    optional_arguments = 1
    required_arguments = 0

    def run(self):
        """Run the directive."""
        if not self.arguments:
            self.arguments = [""]
        nodes = super().run()
        nodes[0].attributes["classes"].append("margin")

        # Remove the "title" node if it is empty
        if not self.arguments:
            nodes[0].children.pop(0)
        return nodes

def setup(app: Sphinx):
    app.connect("env-before-read-docs", update_thebe_config)

    # Configuration for Juypter Book
    app.connect("html-page-context", add_hub_urls)

    app.connect("builder-inited", add_static_paths)
    app.connect("env-updated", update_all)

    # add translations
    package_dir = os.path.abspath(os.path.dirname(__file__))
    locale_dir = os.path.join(package_dir, "translations", "locales")
    app.add_message_catalog(MESSAGE_CATALOG_NAME, locale_dir)

    app.add_html_theme("sphinx_book_theme", get_html_theme_path())
    app.connect("html-page-context", add_to_context)

    app.add_directive("margin", Margin)

    # Update templates for sidebar
    app.config.templates_path.append(os.path.join(package_dir, "_templates"))

    return {
        "parallel_read_safe": True,
        "parallel_write_safe": True,
    }

Link to your repository or website
No response
Steps to reproduce
pip install sphinx-book-theme
The version of Python you're using
3.9.7
Your operating system
ArchLinux
Versions of your packages
No response
Additional context
No response

Heya, the upgraded to pydata-sphinx-theme 0.17, hasn't released yet. It's still pinned to 0.16: https://github.com/executablebooks/sphinx-book-theme/blob/835ed92f057fd54a94c4c96437529937eb2d4ae0/setup.py#L35

I'm going to close this as a duplicate of #423

Oh. Okay.
So for dealing with #427 is the only option in the meantime to set sphinx~=4.2.0 in my setup.py?


[MOSIP-30699] Added checking for docker user

ARG container_user=mosip
ARG container_user_group=mosip
ARG container_user_uid=1001
ARG container_user_gid=1001
RUN groupadd -g ${container_user_gid} ${container_user_group}
&& useradd -u ${container_user_uid} -g ${container_user_group} -s /bin/sh -m ${container_user}
WORKDIR /home/${container_user}
RUN chown -R ${container_user}:${container_user} /home/${container_user}
USER ${container_user_uid}:${container_user_gid}
We need to check if all these are present.. any one missing means it may not have user level access.
You can try to short the check and apply the same.


Heatmap not drawn for the complete page

Hi,
Is it normal that the heat map is not drawn for the whole page?
If I run the script, only the top of the page (on screen) is used to draw the heat map. Even scrolling down an then re-running the script does not draw the heatmap on that part of the screen. The only time the map is drawn completely is when I zoom out the page.
Gr.,
Wilfried

$("body").append("");
Gr.,
Wilfried

Hi Wilfried,
thanks for fixing that :-)
I used a workaround for that problem before... simply zoom out until the whole page is visible. Then I use Fireshot to create a screenshot of the page which gives you the full resolution.
But obviously your fix is better!
Dominik

fixed by wbytebier


Versioning Works

This is an issue for discussing work versioning logic. See previous discussion here.

Metadata that cannot change between versions

Visibility Settings: It should not be possible for one version of a work to be public while another version is "PSU only". That would mean different users are seeing different versions of the same work, which could lead to confusion. If this kind of functionality is needed, users can create a separate work.

(? License: You should not be able to change the license between versions. This would seriously complicate the issue of working out permissions and right. )

It may make sense to store these kinds of metadata at the work level rather than the version level.

Need more logic around what makes a version and what constitutes a new version.


Support for pseudo source types

A feature idea came in on Ryver to allow some extensions to be seen as pseudo source.
For example, perhaps we have a member/streamfile/local with extension: dtaara and inside of it is a set of commands to create and change a data area:
CRTDTAARA DTAARA(...) ...
CHGDTAARA ....

When the 'Run Action' command is run on a pseudo source type, a new option would show up, perhaps something like 'Execute Pseudo Source' which would run each command top to bottom.
We kind of already do this with the code-for-ibmi.cl.runSelected command.

Things to consider:

How to tell the runtime which command errors to ignore? Perhaps we don't want the entire script to stop if one command fails
How do we show all the outputs from each command that runs?

I wonder if we can use the decoration API to highlight commands that run successfully in green, and vice-versa in red


Pop-out is not loading the document in another tab.

Hi,
Thanks for the nice library.
I am struggling with the pop-out feature, when clicking on pop-out icon it opens the new tab but no file is getting opened & the page title is displayed as "undefined".
But when I am doing reload to same page it's actually loading all the contents & having below error in the console.
It would be great if you can help me for this.
m=main:55 Uncaught GZ {message: "Did not receive drive#about kind when fetching import map:undefined", stack: "CustomError: Did not receive drive#about kind when…AC2dHMIzHFdmk9QxJ-IhWCmkUp3RltSU3A/m=main:98:264)"}
(anonymous) @ m=main:55
setTimeout (async)
Ca @ m=main:55
(anonymous) @ m=main:106
Oc @ m=main:98
Promise.then (async)
Kc @ m=main:98
Nc @ m=main:98
$c @ m=main:105
Qc @ m=main:104
Rc.SL @ m=main:103
k @ m=main:104
e.$n @ cb=gapi.loaded_0?le=ili,ipu:230
Ok @ cb=gapi.loaded_0?le=ili,ipu:233
Jk @ cb=gapi.loaded_0?le=ili,ipu:233
_.uk.Mt @ cb=gapi.loaded_0?le=ili,ipu:232
sk @ cb=gapi.loaded_0?le=ili,ipu:225
Promise.then (async)
nk @ cb=gapi.loaded_0?le=ili,ipu:225
_.rk @ cb=gapi.loaded_0?le=ili,ipu:225
Kk @ cb=gapi.loaded_0?le=ili,ipu:232
tk @ cb=gapi.loaded_0?le=ili,ipu:231
(anonymous) @ cb=gapi.loaded_0?le=ili,ipu:226
d @ cb=gapi.loaded_0?le=ili,ipu:984
(anonymous) @ cb=gapi.loaded_0?le=ili,ipu:983
(anonymous) @ cb=gapi.loaded_0?le=ili,ipu:854
u.__cb @ cb=gapi.loaded_0?le=ili,ipu:341
d @ cb=gapi.loaded_0?le=ili,ipu:335
b @ cb=gapi.loaded_0?le=ili,ipu:330
m=main:55 Uncaught {result: {…}, body: "{\n "error": {\n  "errors": [\n   {\n    "domain": "gl… "code": 401,\n  "message": "Login Required"\n }\n}\n", headers: {…}, status: 401, statusText: null}

Hi @rvmore, this packages is just a wrapper for in your case the google viewer in an iframe. So it's probable something in the google viewer that causes the problem.

Hi @rvmore, this packages is just a wrapper for in your case the google viewer in an iframe. So it's probable something in the google viewer that causes the problem.

Thanks @Marcelh1983 for your quick reply.
Is there any way to hide this "Pop out" button completely?

@rvmore, no that is no possible. It's rendered by the google vier in the iframe. I tried some things to add an overlay to the buttons but I regret adding this functionality because it's more of a hack that works as long as google keeps placing the button at that excat position.


Insider: Search - Exclude settings and ignore files options not shown

Issue Type: Bug
When going to the Search pane, the gear to expand the Exclude settings and Ignore files doesn't show anything.
 The ... button above the include/exclude box does that.
I recently switched this from dedicated include/exclude boxes to a single box that can take positive or negated (with !) patterns. Maybe that's causing the confusion.

@roblourens: Ah yeah, that's somewhat confusing. Having to put the includes and excludes in the same small text box is a bit user unfriendly, not to mention hard to read or parse.
Also, the hover text on the gear says "Use Exclude Settings and Ignore Files", which I guess is different than what you said above?

@roblourens, it was really useful to have two separate boxes for "Use Exclude Settings" and "Use Ignore Files". They are different things and deserve two separate boxes.

@auygun agreed. It would be nice if there was an option in user preferences to toggle between the current single-bar UI and the one that shows 2 separate bars for include/exclude.

Ok, so you have a lot going on there in a very small space.
You have the toggle box [Gear Image] for switching on the use of [Ignore Files and Exclude Settings]. Also you have started to use the ! within the [files to include/exclude], which is subtle if you don't know to look for it (The example doesn't work since it is hard to see). So what may seem obvious to you, may not seem the same for some of user base.
Anyway, tiny grumble in an otherwise great piece of software.
PS - The ignore though very useful, it would be great if there was a way of specifying how results appeared, based upon their directory. I don;t really want to exclude results, but it would be great to be able to say the results from certain directories appeared at the bottom of the results.


Cannot add a foreign key to a new table

Ubuntu 20.04

Version <IP_ADDRESS>202200327

MySQL 5.7

connector-j/8.0

Creating two new tables, if the second has to be related to the first by a foreign key, the table does not appear in the list.

Create New table A with a field called id
Create a second table with field called aTableID
Try to add a foreign Key: the table A does not appear in the list

tried to refresh connection without any luck. Has to restart dbeaver

Hello @lucian0c
Unfortunately, I can't reproduce your issue.

Please provide more info.

How were the tables created? Via DBeaver UI tools (like "Create table" in the Database Navigator tree) or manually in SQL Editor?
Have you tried to refresh the Tables list or Database in the Database Navigator tree? After table creation.
Maybe you have any error logs? You can read more about DBeaver logs here: https://github.com/dbeaver/dbeaver/wiki/Log-files


[OS X] Installer doesn't work

Since last update, running the installer from latest release, the HEAD or using #336 (Fix OS X Installer, Fix Typo) doesn't work.
❯ ./install.sh
(node:3249) fs: re-evaluating native module sources is not supported. If you are using the graceful-fs module, please update it to a more recent version.
BetterDiscord Simple Installer v0.3 for Discord 0.0.284 by Jiiks.
If Discord has updated then download the latest installer.
The following directories will be deleted if they exists: discorpath/app, discordpath/node_modules/BetterDiscord, is this ok? Y/NY
Looking for discord resources at: /Applications/Discord.app/Contents/Resources
Discord resources found at: /Applications/Discord.app/Contents/Resources
Looking for app folder
Deleting /Applications/Discord.app/Contents/Resources/app folder.
Deleted /Applications/Discord.app/Contents/Resources/app folder.
Looking for app archive
App archive found at: /Applications/Discord.app/Contents/Resources/app.asar
Extracting app archive
Copying BetterDiscord
fs.js:916
  return binding.mkdir(pathModule._makeLong(path),
                 ^

Error: ENOENT: no such file or directory, mkdir '/Applications/Discord.app/Contents/Resources/node_modules/BetterDiscord'
    at Error (native)
    at Object.fs.mkdirSync (fs.js:916:18)
    at /Users/kody/Desktop/BD0.2.8OSX/index.js:84:16
    at FSReqWrap.cb [as oncomplete] (fs.js:251:19)

There's no node_modules folder inside Contents/Resources/.

This was over a month and a half ago, but for anyone who is still getting this you can checkout #369 . You'll need to move/copy around some files locally for the scripts to run like the release.
My node was so old that I had to update it to support es6 arrow functions. If you get unrecognize token ...  around something that reads like (exists) => { then that's you. I did it this way https://davidwalsh.name/upgrade-nodejs
full instructs from scratch. Start wherever you need, or just copy paste the whole thing...
git clone https://github.com/Jiiks/BetterDiscordApp
cd BetterDiscordApp
echo "installer needs these"
npm install asar wrench
echo "Get muh fork"
git remote add kgan https://github.com/KGan/BetterDiscordApp
git fetch --all
git checkout kgan/fix-installer-mkdir
echo "Most likely you'll start here"
cd Installers/Node
cp ../../splice .
mkdir BetterDiscord
cp -r ../../{betterdiscord.js,lib,package.json} BetterDiscord/
sh install.sh

@KGan: I'd suggest doing git pull khan fix-installer-mkdir instead of doing a checkout there, to merge with the current master. Also, this needs a fix with the _index variable, like I said in #369.


Updated CN translation of boolean.md according to the new EN doc.

Updated CN translation of boolean.md according to the new EN doc.
closes #729

Please revise according to the comments. Thank you!

Done! Please check once @YiyunNi

@YiyunNi thanks :)


Carousel stuttering with many items when setting state on scroll

Bug is related to

[ ] embla-carousel (core package)
[x] embla-carousel-react
[ ] embla-carousel-vue
[ ] embla-carousel-svelte
[ ] embla-carousel-autoplay
[ ] embla-carousel-auto-height
[ ] embla-carousel-class-names
[ ] embla-carousel-docs (documentation website)

Embla Carousel version

v7.1.0

Describe the bug
I'm trying to eliminate the stuttering issue that seems to appear whenever I set a state on scroll, particularly the setSlidesInView one, in the codesandbox I provided.
Being it a lighter version of my actual code, in this example the issue starts manifesting with way more items (~1500) than I have (~100).
If I comment out that setSlidesInView either in my code or in the example, the carousel will work just perfectly fine.
I wonder if there is a way to get around this issue I'm facing as I think I've tried them all, among throttle, flushSync and what not, to no avail.
The goal is to lower the opacity of the immediate slide out of the view.
I appreciate any kind of help and/or any suggestions on how I can improve my code. Thanks!
CodeSandbox

https://codesandbox.io/s/embla-carousel-opacity-react-forked-ghjton

Steps to reproduce

Click on the right arrow multiple times.

Expected behavior

The carousel will stutter

Hi @fabz1001,
This is not a bug with Embla. Setting the React slidesInView state every time the scroll event fires will re-render the component every single time, even when slides in view haven't changed, because embla.slidesInView() returns a new array every time. So React will check the reference between arrays and re-render even though the actual slidesInView content hasn't changed. Arrays are compared by reference so:
[] === [] // is false
[0, 1, 2] === [0, 1, 2] // is false

Here's a different approach. It doesn't update any slidesInView state. Instead, it just toggles the slide --hidden classes directly. If you're still experiencing performance problems, you can throttle your scroll logic.
Another approach would be to use IntersectionObserver instead of embla.slidesInView().
Let me know how it goes.
Best,
David

Hi @davidjerleke,
First of all, I do apologize for posting this as a bug since, as you said, this is not.
🎉  I have applied the fix you suggested and it seems much smoother indeed!
And yes, they're a lot of slides. However, in my case I have much less of them but definitely more complex and heavy, so I had to exaggerate a bit to make the issue more evident in the sandbox :)
I have another question but I will post it in a more appropriate place.
Thank you again David, Embla rocks!

Hi @fabz1001,

First of all, I do apologize for posting this as a bug since, as you said, this is not.

No worries, I just wanted to point that out based on my reasoning 🙂.

I have applied the fix you suggested and it seems much smoother indeed!

Which fix did you go with? I think IntersectionObserver will yield the smoothest behavior.

And yes, they're a lot of slides. However, in my case I have much less of them but definitely more complex and heavy, so I had to exaggerate a bit to make the issue more evident in the sandbox :)

I see! Thanks for clarifying. I get why you did that now 👍.
Best,
David

I went for the class toggling + throttling solution.
I am using the IntersectionObserver for an infinite loading kind of logic already (It's something I have to optimize as well. I will create a stripped down version as soon as possible but in a different section).
I will surely try it also for the opacity one but a bit later, as I have another priority for now :)
I will keep you posted!
Thank you,
Fabio

Closing this issue then. Cheers!

Hi @davidjerleke 🙂
I am pleased to inform you that the suggested IntersectionObserver approach is actually working very well 🏆.
For accessibility purposes I am setting and removing some attributes instead of toggling a hidden class.
I will just need to find a clean way to set tabIndex to -1 for any inner clickable elements as well.
I'll leave my codesandbox here for any possible users who wish to implement a similar feature.
Have a great day! 🙌

I'm glad to hear that @fabz1001 🎉. And thanks for sharing your solution 👍. I'm sure that someone will find it useful.
Cheers,
David


Auto renew ca certificate

Adds a new event handler in the DiscoveryServiceCertificate controller to trigger a reconcile of any certificate that has its issuer certificate modified. After this, it is safe to enable auto-renewal of the discovery service CA certificate.
/kind feature
/assign
/priority important-longterm
Note for reviewers: https://github.com/3scale-ops/marin3r/pull/149 needs to be merged first and then I will rebase.

@raelga @slopezz already rebased, can be reviewed

/lgtm

/ok-to-test


today displaying as tomarrow

check tomorrow if the current day is still the next day

changed weak formatted date to unix


Migrate backend and UI to an async lib

Our current backend module is inspired from the Will of Steel API Wrapper which uses a synchronous library (requests) for processing HTTP Requests to the API.
But, using a async library such as aiohttp would be the best on this project.
I'm not 100% sure but I do believe requests module will block the tkinter loop for the time it's processing, which could lead to lag/hang on the application.
I will be making a PR for this issue, or if anyone wants to take it up, feel free!

This will also require porting the main GUI to an async library such as:

async-tkinter-loop
asynctkinter

or potentially use tkinter-async-execute for any requests to the API? TAE does not require us to change what we currently have (even though it's not a lot). All we would have to change is the functions we use from the backend, which if I'm not wrong we don't use any.
I'm confused on what approach to move forward with for this. Let me know your opinion @y345-git @Were-Woof

At a glance I'm happy with all of these options, though I'll need to look in more detail to have a final answer.
If those don't work out, a solution I used on a previous object to solve a similar issue was the inbuilt threading library, however these other library options should be explored first since if we get them working they are a better solution.

Did you get a chance to look at them? @Were-Woof

Yep, I'm thinking either asynctkinter or tkinter-async-execute, though either of those options work for me

Implemented with 1b9e343

Commit ID: 1b9e343
Commit: feat: Add aiohttp for async HTTP requests in API class
Commit Verified: ✅
PR Check Bypassed - commit on branch main
Full Commit ID: 1b9e34322a42717f371fa1f9a43b28a6ff87e59e
Permanent commit link: https://github.com/WillofSteel-Devs/app/commit/1b9e34322a42717f371fa1f9a43b28a6ff87e59e


grnh.se

Energized Protection - block ⚡

Let's make an annoyance free, better open internet, altogether!

Issue Submit Form

  Provide the following infos properly, which will help us to resolve your issue quickly.

Issue(s):
Type x in between [ ] and make sure there isn't any space between brackets. Example; for Your Selected Issue(s), type like this - [x]
You can select more than one category of issues if you need to!

[x] Whitelist
[ ] Blacklist
[ ] App Broken
[ ] Website Broken
[ ] Request
[ ] Other Issue

Pack(s):
Write the name of the pack(s) you are using.

Pack(s) Name:  Ultimate basic

Extension(s):
Also name the extension(s) if you are using any. If you don't then leave it blank.

Extension(s) Name:

Domain(s):
If you are submitting this issue for whitelist/blacklist issue, send us the domain(s) for whitelisting/blacklisting here. Kindly use the Code Tag to prevent tracking.

Domain(s):

grnh.se

Your Config:
Just to ensure there is no issues or conflicts with other app/software/magisk module/extension/source list.
Make sure you are running Energized Protection Service only.

Client: PiHole

Version: 5.0

Details:
Write us a lil bit more about your issue or query. You can attach any screen shot or log of the issue or advert, this will help to highlight it.

Your Issue Detail:
grnh.se is a URL shortener service for greenhouse.io
Based on you not blocking some other URL shortening services, as well as not blocking greenhouse.io, I was wondering if this may have been a false positive
Though I do agree that some URL shortening services may havesome level of click tracking.

Please note this is from Airelle's poorly maintained list. I recommend @AdroitAdorKhan to remove this list as it has many false positives. I have emailed Airelle many times, and have never received a single reponse.

Thank you for making Energized Protection great, with your kind help!
A project by Ador with ❤

@p1r473 this doesn't seem right! we are not using any of Airelle's lists in our regular packs. Only his Porn list in Porn pack. Also, the domain you mentioned, is currently not blocked in any of our lists. Which source are you using? and can you check you are using official EPRO pack from original source?

Sorry, seems to be a manual error on my part. Will reopen if I can replicate.


FloatingOverlay locksScroll problem if useTransitionStyles used to mount component

Describe the bug
FloatingOverlay locksScroll problem if useTransition used to mount upper component, and if I want to to close modal and right away open confirmation modal it will not locksroll on next modal. Next modal opens faster than previuos unmount, and lockSroll is removed by previous modal unmount.
  const { styles: backdropTransitionStyles, isMounted } = useTransitionStyles(context, {
    initial: transitionStyles[variant].backdrop,
    duration: variantTransitionDelays[variant].backdrop,
  });

    isMounted && (
      <FloatingPortal>
        <FloatingOverlay style={backdropTransitionStyles} lockScroll>
...

To repoduce:
bing onClose callabck with open another component. that onclose closes and open another component.
Possbile fix:
Some context provider of group of the floating modals?

modal usage for example
<CombinePackagesModal
isOpen={isOpen}
packages={packages}
pricePerPackage={pricePerPackage}
onClose={() => setIsOpen(false)}
onSave={myOrdersApi.consolidate}
onConfirmationOpen={() => setIsConfirmationOpen(true)}
titleTextKey="MyPackages.ConsolidateModal.Title"
subtitleKey="MyPackages.ConsolidateModal.Subtitle"
agreementTextKey="MyPackages.ConsolidateModal.Agreement"
expressProcessingPrices={expressProcessingPrices}
expressProcessingEnabled={true}
/>

I think there needs to be a global set or map that holds currently mounted components and only removes the lock once there are none left mounted. That is similar to how the aria-hidden package works.

@atomiks This PR loses paddingRight for body (compensation for scrollbar) if second modal activated right away after close
https://github.com/floating-ui/floating-ui/pull/2508

Actually I think I might know why - it's because it's applying a 0 paddingRight (instead of removing it) since that's what's being measured due to there being no scrollbar from the previous lock.


blocker: user login system is broken

create a new user and give him the username "johndoe"
set his password to "test"
try to login

result: one cannot login with johndoe, but OpenSlides created his login info correctly:

The whole user login system seems to be broken because for many users I get the same problem. This makes OpenSlides 2.0 quite unusable.

OK, it seems that as soon as one specifies a preset password, a user cannot log in!
It is even worse because if a user forgot his password and the admin presses "reset" to generate a new password. The password will be deleted but no new one will be created. it is simply empty.
This is a nightmare since there is no way to make it possible that the user can log in.

It is even more severe: Create a new user, then edit it and press "reset" behind the password field. As result the user won't be able to log in.
So whenever one enters manually a password or presses "reset" the user cannot log in.

What about the following:

Edit a user
Change its default password but dont click reset
Just click save
Then open the edit form again and click reset without editing the default password any more.

This should work but there might a bug nevertheless.

Edit a user
Change its default password but dont click reset

Whenever I modify the field for the user password the user can no longer log in. The reset button also changes the password field and therefore triggers the same bug as I now found out.

Just click save

OK I have now given the password "test". The user can still not log in.

Then open the edit form again and click reset without editing the default password any more.

The I get the info that the password has been reset but I can still see in the login info PDF that the password is still "test". Now the user can log in with "test". What a weird bug and very hard to get it  it took me about an hour and dozens of login attempts. A MUST-FIX for 2.0.1!

I don't understand the bug. I tested theses variants with the current master:

Create new user: first name "Max", last name "Mustermann", no other data.
Generate list of access data: the pdf shows the username ("Max Mustermann") and the generated password ("BPYepD6D").
Max can successfully login with username and password (tested in a private browser window).
Edit user Max: The default password field shows the generated password. Correct. Now Change the default password to "test". Click [Reset] button. Message "Password successfully resetted to: test" is shown. Save the edit dialog.
Max can successfully login with username ("Max Mustermann") and the changed password ("test"). Correct.

@donovaly So I can't see any bug (or blocker) here...

@donovaly Please accept the pending github OpenSlides-team invitation so that we can assign issues to you.

@donovaly Please accept the pending github OpenSlides-team invitation so that we can assign issues to you.

I did not receive an invitation. Please re-invite me.

I don't understand the bug. I tested theses variants with the current master:
Edit user Max: The default password field shows the generated password. Correct. Now Change the default password to "test".

Do nothing more than to write in "test"  and to click save. Then the user cannot log in despite the password PDF says correctly that it is now "test".

Click [Reset] button.

Then and only then it will work. But this is nasty. I spent now so much time with this issue but never came to the idea that one needs to press reset after (sic!) the password has been changed.
As one has already changed the password it must be possible that this is enough - and the PDF shows already the changed password. So it is still a bug that the PDF shows a password that is in fact not the password.
Message "Password successfully resetted to: test" is shown. Save the edit dialog.
Max can successfully login with username ("Max Mustermann") and the changed password ("test"). Correct.

I did not receive an invitation. Please re-invite me.

Done. Please check your emails.

Ok, I understand: The [Reset] button within the user edit form is not very self-explaining.  Especially if you change the password and want to reset it in one step.
Any idea how we can improve the password reset process for the admin?
Maybe we should outsource the reset action into a new dialog (e.g. only a input field for the new password and a button to reset the default password to this entered password?) What do you mean?

What about this: make the background color of the password field red unless the reset button is pressed. Also "pulse" the button to clarify that this needs to be pressed.
I added now also a note in the manual.

Good idea. I'll try it.

See #412.


Rename .php_cs -> .php-cs-fixer.dist.php

Fix deprecation warning by renaming the config file:
  15.95 > php-cs-fixer fix --diff --verbose '--dry-run'
  16.10 You are running PHP CS Fixer v2, which is not maintained anymore. Please update to v3.
  16.10 You may find an UPGRADE guide at https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/v3.3.0/UPGRADE-v3.md .
  16.10 If you need help while solving warnings, ask at https://gitter.im/PHP-CS-Fixer, we will help you!
  16.10
  16.10 PHP CS Fixer 2.19.3 Testament by Fabien Potencier and Dariusz Ruminski
  16.10 Runtime: PHP 7.4.30
  16.10 Loaded config default from "/opt/composer/v1/.php_cs".
  16.14 ......
  16.26 Legend: ?-unknown, I-invalid file syntax (file ignored), S-skipped (cached or empty file), .-no changes, F-fixed, E-error
  16.26
  16.26 Checked all files in 0.134 seconds, 14.000 MB memory used
  16.26
  16.26 Detected deprecations in use:
  16.26 - Configuration file `.php_cs` is deprecated, rename to `.php-cs-fixer.php`.

From https://github.com/dependabot/dependabot-core/actions/runs/3040792095/jobs/4897247001#step:6:6736
The warning suggests to rename to php-cs-fixer.php. However, looking
at https://github.com/keradus/PHP-CS-Fixer/blob/master/UPGRADE-v3.md I
see that is the recommended file name for the local development config file. The
distributed one should be .php-cs-fixer.dist.php, so I used that
instead. More details on the distinction between the two types of files
here: https://github.com/FriendsOfPHP/PHP-CS-Fixer/pull/5607

Confirmed in https://github.com/dependabot/dependabot-core/actions/runs/3041101428/jobs/4897886119#step:4:6715 that it's using the new config file location:
Loaded config default from "/opt/composer/v1/.php-cs-fixer.dist.php".


Fix Copy-DbaDatabase instance names and tests

Changes proposed in this pull request:

Updated Copy-DbaDatabase tests with additional steps.
Updated Copy-DbaDatabase to support naming conventions used in the project.

How to test this code:

[ ] Verify appveyor comes back successful for all commands.

Has been tested on minimum requirements:

[ ]  Powershell 3
[ ]  Windows 7
[ ]  SQL Server 2000

Has been tested on maximum requirements:

[ ]  SQL Server vNext
[ ]  Windows 10
[ ]  Azure Database

Tests for tester:

[ ] Working/useful help content, including link to command on dbatools web site
[ ] All examples work as advertised
[ ] Does not contain template content
[ ] Does not contain excessive/unnecessary amounts of comments
[ ] Works remotely
[ ] Works locally
[ ] Works on lower versions or throws error specifying version not supported
[ ] Works with named instances
[ ] Works with clustered instances
[ ] Handles offline/read only databases
[ ] Supports multiple servers (at the command line or piped from Get-SqlRegisteredServerName)
[ ] No un-handled errors which stop the command working with multiple servers

Please do not merge this until all tests pass from before, I would like to restore the ones on Copy-DbaDatabase while ensuring the Restore-DbaDatabase tests are working.
One thing I noticed is that Pester has a before each test but not an after all the things command because each test is basically tested in isolation.
This might mean a god cleanup step would be to run Get-DbaDatabase -NoSystemDb | Remove-DbaDatabase, but I need to do some additional checking because it appears that Restore-DbaDatbase is doing that, and yet the restore process may be failing due to existing backups.

Redid with working dev branch and PR'd with https://github.com/sqlcollaborative/dbatools/pull/1753


Parent component activate hook can't be used in conjunction with child required props.

When using 'activate' hook on a parent component, the child components will throw vue errors/warnings if they have required props. For example the parent is doing some async data fetching which resolves the activate hook once loaded. Any child that has a 'required' prop dependant on that data prior to the 'activate' hook being resolved will throw a vue error.
I am not sure that this is a bug as this makes logical sense based off 'activates' description but this does make async loading and required props a little difficult to deal with.

You can add v-if on the child components so that they only get instantiated after your data is fetched. This behavior is unlikely to change in the short term since it's potentially breaking.


Can't ignore imported files

I usually split my *.less files, importing everything in a single file. I just want that file parsed as *.css, not all the imported ones. Is this possible?

The underlying LESS implementation (https://github.com/oyejorge/less.php) is capable of that.
At the moment a simple extension whitelist is used (see: https://github.com/bcremer/sculpin-less-bundle/blob/master/LessConverter.php#L47).
This whitelist could be extended to a per file whitelist.
If one would like to implement that a new configuration node has to be added here
https://github.com/bcremer/sculpin-less-bundle/blob/master/DependencyInjection/Configuration.php#L19
and here https://github.com/bcremer/sculpin-less-bundle/blob/master/DependencyInjection/SculpinLessExtension.php#L23.
The actual filtering could be done here: https://github.com/bcremer/sculpin-less-bundle/blob/master/LessConverter.php#L47.
So it's possible to implement but it is not (yet).
Feel free to submit a pull request :)

Should be implemented now. Example usage: https://github.com/shopware/devdocs/commit/64a3b68fb43e2e5cf1ace9b7cfacba8542dd6419