ckanext-search-tweaks 0.6.2__py3-none-any.whl → 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. ckanext/__init__.py +0 -1
  2. ckanext/search_tweaks/advanced_search/assets/advanced-search.css +0 -4
  3. ckanext/search_tweaks/advanced_search/plugin.py +11 -0
  4. ckanext/search_tweaks/advanced_search/templates/advanced_search/search_form.html +5 -3
  5. ckanext/search_tweaks/config_declaration.yaml +24 -0
  6. ckanext/search_tweaks/field_relevance/plugin.py +0 -2
  7. ckanext/search_tweaks/field_relevance/templates/search_tweaks/field_relevance/promote.html +1 -1
  8. ckanext/search_tweaks/field_relevance/views.py +18 -5
  9. ckanext/search_tweaks/interfaces.py +1 -3
  10. ckanext/search_tweaks/plugin.py +0 -1
  11. ckanext/search_tweaks/query_popularity/config_declaration.yaml +29 -0
  12. ckanext/search_tweaks/query_popularity/logic/schema.py +1 -0
  13. ckanext/search_tweaks/query_popularity/score.py +2 -1
  14. ckanext/search_tweaks/query_relevance/__init__.py +38 -13
  15. ckanext/search_tweaks/query_relevance/boost.py +75 -0
  16. ckanext/search_tweaks/query_relevance/cli.py +20 -38
  17. ckanext/search_tweaks/query_relevance/config.py +29 -0
  18. ckanext/search_tweaks/query_relevance/config_declaration.yaml +16 -0
  19. ckanext/search_tweaks/query_relevance/plugin.py +8 -37
  20. ckanext/search_tweaks/query_relevance/score.py +17 -50
  21. ckanext/search_tweaks/query_relevance/storage.py +79 -137
  22. ckanext/search_tweaks/spellcheck/helpers.py +6 -2
  23. ckanext/search_tweaks/tests/conftest.py +13 -0
  24. ckanext/search_tweaks/tests/query_relevance/test_plugin.py +5 -5
  25. ckanext/search_tweaks/tests/query_relevance/test_search.py +84 -0
  26. ckanext/search_tweaks/tests/query_relevance/test_storage.py +23 -99
  27. ckanext/search_tweaks/tests/spellcheck/test_plugin.py +4 -2
  28. {ckanext_search_tweaks-0.6.2.dist-info → ckanext_search_tweaks-1.0.0.dist-info}/METADATA +122 -124
  29. ckanext_search_tweaks-1.0.0.dist-info/RECORD +58 -0
  30. {ckanext_search_tweaks-0.6.2.dist-info → ckanext_search_tweaks-1.0.0.dist-info}/WHEEL +1 -1
  31. ckanext_search_tweaks-0.6.2.dist-info/RECORD +0 -52
  32. {ckanext_search_tweaks-0.6.2.dist-info → ckanext_search_tweaks-1.0.0.dist-info}/entry_points.txt +0 -0
  33. {ckanext_search_tweaks-0.6.2.dist-info → ckanext_search_tweaks-1.0.0.dist-info/licenses}/LICENSE +0 -0
  34. {ckanext_search_tweaks-0.6.2.dist-info → ckanext_search_tweaks-1.0.0.dist-info}/top_level.txt +0 -0
@@ -30,6 +30,7 @@ class TestDidYouMeanSnippet:
30
30
  snippet = BeautifulSoup(tk.render("search_tweaks/did_you_mean.html"))
31
31
  helper.assert_called()
32
32
  link = snippet.select_one("a")
33
+ assert link
33
34
  assert link.text.strip() == expected
34
35
  assert "q=" + expected in link["href"]
35
36
 
@@ -37,6 +38,7 @@ class TestDidYouMeanSnippet:
37
38
  @pytest.mark.ckanext_search_tweaks_modified_schema
38
39
  @pytest.mark.ckan_config("ckan.plugins", "search_tweaks search_tweaks_spellcheck")
39
40
  @pytest.mark.usefixtures("with_plugins", "clean_db", "clean_index")
41
+ @pytest.mark.skip(reason="Result might be unpredicatble, requires refactoring")
40
42
  class TestHelper:
41
43
  def test_recommendations(self):
42
44
  Dataset(title="Pick this")
@@ -49,7 +51,7 @@ class TestHelper:
49
51
 
50
52
  assert helper("pic", 3) == [
51
53
  "pick",
52
- ] # min_hits fucked up because of single-term match
54
+ ] # min_hits messed up because of single-term match
53
55
  assert helper("pic", 1) == ["pick"]
54
56
 
55
57
  def test_show_only_more_results(self, ckan_config, monkeypatch):
@@ -62,7 +64,7 @@ class TestHelper:
62
64
  assert helper("pock", 1) == ["pick"]
63
65
  assert helper("pick", 3) == [
64
66
  "pock",
65
- ] # min_hits fucked up because of single-term match
67
+ ] # min_hits messed up because of single-term match
66
68
 
67
69
  monkeypatch.setitem(ckan_config, CONFIG_SHOW_ONLY_MORE, "off")
68
70
  assert helper("pock", 1) == ["pick"]
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: ckanext-search-tweaks
3
- Version: 0.6.2
3
+ Version: 1.0.0
4
4
  Author-email: DataShades <datashades@linkdigital.com.au>, Sergey Motornyuk <sergey.motornyuk@linkdigital.com.au>
5
5
  Maintainer-email: DataShades <datashades@linkdigital.com.au>
6
6
  License: AGPL
@@ -8,15 +8,20 @@ Project-URL: Homepage, https://github.com/DataShades/ckanext-search-tweaks
8
8
  Keywords: CKAN
9
9
  Classifier: Development Status :: 4 - Beta
10
10
  Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
11
- Classifier: Programming Language :: Python :: 3.8
12
- Classifier: Programming Language :: Python :: 3.9
13
11
  Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
14
  Description-Content-Type: text/markdown
15
15
  License-File: LICENSE
16
16
  Requires-Dist: freezegun
17
- Requires-Dist: typing-extensions >=4.0.0
18
- Requires-Dist: ckanext-toolbelt >=0.4.11
19
- Provides-Extra: advanced-search
17
+ Requires-Dist: typing_extensions>=4.0.0
18
+ Requires-Dist: ckanext-toolbelt>=0.6.6
19
+ Provides-Extra: dev
20
+ Requires-Dist: pytest-ckan; extra == "dev"
21
+ Requires-Dist: pytest-freezegun; extra == "dev"
22
+ Requires-Dist: pytest-factoryboy; extra == "dev"
23
+ Requires-Dist: pytest-rerunfailures; extra == "dev"
24
+ Dynamic: license-file
20
25
 
21
26
  [![Tests](https://github.com/DataShades/ckanext-search-tweaks/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/DataShades/ckanext-search-tweaks/actions)
22
27
 
@@ -30,8 +35,8 @@ Compatibility with core CKAN versions:
30
35
 
31
36
  | CKAN version | Compatible? |
32
37
  |-----------------|-------------|
33
- | 2.8 and earlier | no |
34
- | 2.9 | yes |
38
+ | 2.9 and earlier | no |
39
+ | 2.10+ | yes |
35
40
 
36
41
 
37
42
  ## Installation
@@ -65,9 +70,6 @@ available. Bellow are listed all the plugins with their side effects.
65
70
  | [search_tweaks_query_relevance](#search_tweaks_query_relevance) | Promote datasets that were visited most frequently for the current search query |
66
71
  | [search_tweaks_field_relevance](#search_tweaks_field_relevance) | Promote dataset depending on value of it's field |
67
72
  | [search_tweaks_spellcheck](#search_tweaks_spellcheck) | Provides "Did you mean?" feature |
68
- <!--
69
- | [search_tweaks_advanced_search](#search_tweaks_advanced_search) | Basic configuration of ckanext-composite-search's search form |
70
- -->
71
73
 
72
74
  ### <a id="search_tweaks"></a> search_tweaks
73
75
 
@@ -79,16 +81,18 @@ extension is enabled.
79
81
  - Enables `ckanext.search_tweaks.iterfaces.ISearchTweaks` interface with the
80
82
  following methods:
81
83
 
82
- def get_search_boost_fn(self, search_params: dict[str, Any]) -> Optional[str]:
83
- """Returns optional boost function that will be applied to the search query.
84
- """
85
- return None
84
+ ```python
85
+ def get_search_boost_fn(self, search_params: dict[str, Any]) -> Optional[str]:
86
+ """Returns optional boost function that will be applied to the search query.
87
+ """
88
+ return None
86
89
 
87
- def get_extra_qf(self, search_params: dict[str, Any]) -> Optional[str]:
88
- """Return an additional fragment of the Solr's qf.
89
- This fragment will be appended to the current qf
90
- """
91
- return None
90
+ def get_extra_qf(self, search_params: dict[str, Any]) -> Optional[str]:
91
+ """Return an additional fragment of the Solr's qf.
92
+ This fragment will be appended to the current qf
93
+ """
94
+ return None
95
+ ```
92
96
 
93
97
  #### CLI
94
98
 
@@ -99,30 +103,31 @@ following methods:
99
103
 
100
104
  #### Config settings
101
105
 
102
- # Rewrite the default value of the qf parameter sent to Solr
103
- # (optional, default: value of ckan.lib.search.query.QUERY_FIELDS).
104
- ckanext.search_tweaks.common.qf = title^5 text
106
+ ```ini
107
+ # Rewrite the default value of the qf parameter sent to Solr
108
+ # (optional, default: value of ckan.lib.search.query.QUERY_FIELDS).
109
+ ckanext.search_tweaks.common.qf = title^5 text
105
110
 
106
- # Search by misspelled queries.
107
- # (optional, default: false).
108
- ckanext.search_tweaks.common.fuzzy_search.enabled = on
111
+ # Search by misspelled queries.
112
+ # (optional, default: false).
113
+ ckanext.search_tweaks.common.fuzzy_search.enabled = on
109
114
 
110
- # Maximum number of misspelled letters. Possible values are 1 and 2.
111
- # (optional, default: 1).
112
- ckanext.search_tweaks.common.fuzzy_search.distance = 2
115
+ # Maximum number of misspelled letters. Possible values are 1 and 2.
116
+ # (optional, default: 1).
117
+ ckanext.search_tweaks.common.fuzzy_search.distance = 2
113
118
 
114
- # Use `boost` instead of `bf` when `edismax` query parser is active
115
- # (optional, default: true).
116
- ckanext.search_tweaks.common.prefer_boost = no
119
+ # Use `boost` instead of `bf` when `edismax` query parser is active
120
+ # (optional, default: true).
121
+ ckanext.search_tweaks.common.prefer_boost = no
117
122
 
118
- # MinimumShouldMatch used in queries
119
- # (optional, default: 1).
120
- ckanext.search_tweaks.common.mm = 2<-1 5<80%
121
-
122
- # Keep original query when using fuzzy search, e.g. "(hello~2) OR (hello)" if true
123
- # (optional, default: true).
124
- ckanext.search_tweaks.common.fuzzy_search.keep_original
123
+ # MinimumShouldMatch used in queries
124
+ # (optional, default: 1).
125
+ ckanext.search_tweaks.common.mm = 2<-1 5<80%
125
126
 
127
+ # Keep original query when using fuzzy search, e.g. "(hello~2) OR (hello)" if true
128
+ # (optional, default: true).
129
+ ckanext.search_tweaks.common.fuzzy_search.keep_original
130
+ ```
126
131
 
127
132
  ---
128
133
 
@@ -132,57 +137,41 @@ Increase relevance of datasets for particular query depending on number of
132
137
  direct visits of the dataset after running this search. I.e, if user searches
133
138
  for `something` and then visits dataset **B** which is initially displayed in a
134
139
  third row of search results, eventually this dataset will be displayed on the
135
- second or even on the first row. This is implemented in three stages. On the
136
- first stage, statistics collected and stored inside storage(redis, by default)
137
- and then this statistics converted into numeric solr field via cronjob.
138
- Finally, Solr's boost function that scales number of visits and improves score
139
- for the given query is applied during search.
140
-
141
- Following steps are required in order to configure this plugin:
142
-
143
- - Add field that will store statistics to schema.xml(`query_relevance_` prefix
144
- can be changed via config option):
145
-
146
- <dynamicField name="query_relevance_*" type="int" indexed="true" stored="true"/>
140
+ second or even on the first row.
147
141
 
148
- - Configure a cronjob which will update search-index periodically:
149
-
150
- 0 0 * * * ckan search-index rebuild
142
+ This is implemented in two stages:
143
+ - In the first stage, statistics are collected and stored in Redis.
144
+ - During search, we apply Solr's boost function to scale the dataset score based on the number of visits.
151
145
 
152
146
  #### CLI
153
147
 
154
- relevance query align - remove old data from storage. Actual result of this command depends
155
- on storage backend, that is controlled by config. At the momment, only `redis-daily` backend
156
- is affected by this command - all records older than `query_relevance.daily.age` days are removed.
148
+ ```
149
+ relevance query export - export statistics as CSV.
157
150
 
158
- relevance query export - export statistics as CSV.
151
+ relevance query import - import statistics from CSV. Note, records that are already in storage but
152
+ are not listed in CSV won't be removed. It must be done manually
159
153
 
160
- relevance query import - import statistics from CSV. Note, records that are already in storage but
161
- are not listed in CSV won't be removed. It must be done manually
154
+ relevance query reset - reset all the query relevance scores
155
+ ```
162
156
 
163
157
 
164
158
  #### Config settings
165
159
 
166
- # Which backend to use in order to collect information about dataset
167
- # relevance for the particular search query. Possible values are:
168
- # "redis-permanent", "redis-daily"
169
- # (optional, default: redis-daily).
170
- ckanext.search_tweaks.query_relevance.backend = redis-permanent
171
-
172
- # How long(in days) information about dataset visits will be stored in order to
173
- # update relevance of dataset in search query.
174
- # (optional, default: 90).
175
- ckanext.search_tweaks.query_relevance.daily.age = 90
160
+ ```ini
161
+ # Minimum boost to apply to a search query
162
+ # (optional, default: 1).
163
+ ckanext.search_tweaks.query_relevance.min_boost = 1
176
164
 
177
- # Solr boost function with $field placeholder that will be replaced by
178
- # the correspoinding field name
179
- # (optional, default: "scale(def($field,0),1,1.2)").
180
- ckanext.search_tweaks.query_relevance.boost_function = recip($field,1,1000,1000)
165
+ # Maximum boost to apply to a search query. Set more to promote datasets higher
166
+ # (optional, default: 1.5).
167
+ ckanext.search_tweaks.query_relevance.max_boost = 2
181
168
 
182
- # Prefix of the numeric field defined in Solr schema. This field will hold
183
- # dataset's relevance for the given query.
184
- # (optional, default: query_relevance_).
185
- ckanext.search_tweaks.query_relevance.field_prefix = custom_score_
169
+ # Maximum number of boosts to apply to a search query
170
+ # Set more to promote more datasets at once. Note, that a higher
171
+ # number of boosts may increase the query time.
172
+ # (optional, default: 60).
173
+ ckanext.search_tweaks.query_relevance.max_boost_count = 60
174
+ ```
186
175
 
187
176
  ---
188
177
  ### <a id="search_tweaks_field_relevance"></a> search_tweaks_field_relevance
@@ -198,17 +187,20 @@ line of code.
198
187
 
199
188
  #### Config settings
200
189
 
201
- # Solr boost function for static numeric field
202
- # (optional, default: None).
203
- ckanext.search_tweaks.field_relevance.boost_function = pow(promoted_level,2)
190
+ ```ini
191
+ # Solr boost function for static numeric field
192
+ # (optional, default: None).
193
+ ckanext.search_tweaks.field_relevance.boost_function = pow(promoted_level,2)
204
194
 
205
- # Field with dataset promotion level
206
- # (optional, default: promotion_level).
207
- ckanext.search_tweaks.field_relevance.blueprint.promotion.field_name = promotion
195
+ # Field with dataset promotion level
196
+ # (optional, default: promotion_level).
197
+ ckanext.search_tweaks.field_relevance.blueprint.promotion.field_name = promotion
198
+
199
+ # Register pacakge promotion route
200
+ # (optional, default: False).
201
+ ckanext.search_tweaks.field_relevance.blueprint.promotion.enabled = true
202
+ ```
208
203
 
209
- # Register pacakge promotion route
210
- # (optional, default: False).
211
- ckanext.search_tweaks.field_relevance.blueprint.promotion.enabled = true
212
204
 
213
205
  #### Auth functions
214
206
 
@@ -227,42 +219,54 @@ use it:
227
219
  name="spellcheck" class="solr.SpellCheckComponent">` section and add the
228
220
  following item under it:
229
221
 
230
- <lst name="spellchecker">
231
- <str name="name">did_you_mean</str>
232
- <str name="field">did_you_mean</str>
233
- <str name="buildOnCommit">false</str>
234
- </lst>
222
+ ```xml
223
+ <lst name="spellchecker">
224
+ <str name="name">did_you_mean</str>
225
+ <str name="field">did_you_mean</str>
226
+ <str name="buildOnCommit">false</str>
227
+ </lst>
228
+ ```
235
229
 
236
230
  - Add cron job that will update suggestions dictionary periodically:
237
231
 
238
- ckan search-tweaks spellcheck rebuild
232
+ ```sh
233
+ ckan search-tweaks spellcheck rebuild
234
+ ```
239
235
 
240
236
  - `solrconfig.xml`. Add spellcheck component to the search handler (`<requestHandler
241
237
  name="/select" class="solr.SearchHandler">`):
242
238
 
243
- <arr name="last-components">
244
- <str>spellcheck</str>
245
- </arr>
239
+ ```xml
240
+ <arr name="last-components">
241
+ <str>spellcheck</str>
242
+ </arr>
243
+ ```
246
244
 
247
245
  - Define spellcheck field in the schema. If you want to use an existing
248
246
  field(`text` for example), change `<str name="field">did_you_mean</str>`
249
247
  value inside `solrconfig.xml` to the name of the selected field instead.
250
248
 
251
- <field name="did_you_mean" type="textgen" indexed="true" multiValued="true" />
249
+ ```xml
250
+ <field name="did_you_mean" type="textgen" indexed="true" multiValued="true" />
251
+ ```
252
252
 
253
253
  - **Note:** skip if you've decided to use an existing field in the previous step.
254
254
  <br/>
255
255
  Copy meaningfull values into this field:
256
256
 
257
- <copyField source="title" dest="did_you_mean"/>
258
- <copyField source="notes" dest="did_you_mean"/>
259
- <copyField source="res_name" dest="did_you_mean"/>
260
- <copyField source="res_description" dest="did_you_mean"/>
261
- <copyField source="extras_*" dest="did_you_mean"/>
257
+ ```xml
258
+ <copyField source="title" dest="did_you_mean"/>
259
+ <copyField source="notes" dest="did_you_mean"/>
260
+ <copyField source="res_name" dest="did_you_mean"/>
261
+ <copyField source="res_description" dest="did_you_mean"/>
262
+ <copyField source="extras_*" dest="did_you_mean"/>
263
+ ```
262
264
 
263
265
  After that you have to restart Solr service and rebuild search index:
264
266
 
265
- ckan search-index rebuild
267
+ ```sh
268
+ ckan search-index rebuild
269
+ ```
266
270
 
267
271
  Now you can use `spellcheck_did_you_mean` template helper that returns better
268
272
  search query when available instead of the current one. Consider including
@@ -270,39 +274,33 @@ search query when available instead of the current one. Consider including
270
274
 
271
275
  #### Config settings
272
276
 
273
- # Do not show suggestions that have fewer results than current query
274
- # (optional, default: true).
275
- ckanext.search_tweaks.spellcheck.more_results_only = off
277
+ ```ini
278
+ # Do not show suggestions that have fewer results than current query
279
+ # (optional, default: true).
280
+ ckanext.search_tweaks.spellcheck.more_results_only = off
276
281
 
277
- # How many different suggestions you expect to see for query
278
- # (optional, default: 1).
279
- ckanext.search_tweaks.spellcheck.max_suggestions = 3
282
+ # How many different suggestions you expect to see for query
283
+ # (optional, default: 1).
284
+ ckanext.search_tweaks.spellcheck.max_suggestions = 3
285
+ ```
280
286
 
281
287
  #### CLI
282
288
 
283
289
  spellcheck rebuild - rebuild/reload spellcheck dictionary.
284
290
 
285
291
  ---
286
- <!--
287
- ### <a id="search_tweaks_advanced_search"></a> search_tweaks_advanced_search
288
-
289
- Configure `ckanext-composite-search` for the basic usage. One need
290
- `composite_search default_composite_search` plugins enabled in order to use
291
- this plugin. It registers `advanced_search/search_form.html` snippet which can
292
- be just used instead of `search_input` block of CKAN's
293
- `snippets/search_form.html`. It can take a number of parameters, check its
294
- content for details.
295
- -->
296
292
 
297
293
  ## Developer installation
298
294
 
299
295
  To install ckanext-search-tweaks for development, activate your CKAN virtualenv and
300
296
  do:
301
297
 
302
- git clone https://github.com/DataShades/ckanext-search-tweaks.git
303
- cd ckanext-search-tweaks
304
- python setup.py develop
305
- pip install -r dev-requirements.txt
298
+ ```sh
299
+ git clone https://github.com/DataShades/ckanext-search-tweaks.git
300
+ cd ckanext-search-tweaks
301
+ python setup.py develop
302
+ pip install -r dev-requirements.txt
303
+ ```
306
304
 
307
305
 
308
306
  ## Tests
@@ -0,0 +1,58 @@
1
+ ckanext/__init__.py,sha256=bA4GtkniRdq2--6cjASDLRM4gCsX_ysGJkaTMSmIQY8,202
2
+ ckanext/search_tweaks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ ckanext/search_tweaks/cli.py,sha256=Pex34fMESkVycy6kOfODtNmHh8nPMvzFKTeZD0txLvc,308
4
+ ckanext/search_tweaks/config.py,sha256=NX7rsslGJyxQ8xTZidy9fI-SDkJ4lX4oLTX54lVLGI0,941
5
+ ckanext/search_tweaks/config_declaration.yaml,sha256=XrlvWGhlnVPGTJfbRj4Fxf0o8Q9UiS1bYKolnAoY8bg,644
6
+ ckanext/search_tweaks/interfaces.py,sha256=hzk5RvBWUgLEedYGi7i-d7NxcbOWH45g3kiPQGFIEyU,859
7
+ ckanext/search_tweaks/plugin.py,sha256=L7zXLwMT38ipG-dNn-UHrxhoLfKVtKTXPaIy5MGsclI,3329
8
+ ckanext/search_tweaks/shared.py,sha256=9aWN_OXB5-h99lecnZVoZpLY6F8hbIRNX6WUQaoOoYI,325
9
+ ckanext/search_tweaks/advanced_search/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ ckanext/search_tweaks/advanced_search/plugin.py,sha256=Vf4w23VonG4anHBW-7QpPTT5Afw5cGrt6cL2LyaLqkk,3566
11
+ ckanext/search_tweaks/advanced_search/assets/advanced-search.css,sha256=PfoqFHogxxY-FHfmAYwLF2YpIqaGzl9xDKUbKwhi0sk,532
12
+ ckanext/search_tweaks/advanced_search/assets/advanced-search.js,sha256=rkgprbv9fUnWoxgISXmoxHkSC4Z9OLXgZoOIICpn9X8,2328
13
+ ckanext/search_tweaks/advanced_search/assets/webassets.yml,sha256=g0NMsLyHzslxtkIXRFj_Vf-SU6b8MYlBiuHc50SQiAo,439
14
+ ckanext/search_tweaks/advanced_search/templates/advanced_search/search_form.html,sha256=c4PNY-HLcoLUrXVoOs3qsdEhaT7hsB4JzVUIp7ggee0,4387
15
+ ckanext/search_tweaks/field_relevance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ ckanext/search_tweaks/field_relevance/plugin.py,sha256=XlKLsttiijUTVicNPdOqtNU7x9Pt_Ax5ArKxuQWAWCs,1317
17
+ ckanext/search_tweaks/field_relevance/views.py,sha256=GGE29mrdT42CufEzdEgX2HMxi77VeKpXrGmWgWFDBbY,3444
18
+ ckanext/search_tweaks/field_relevance/assets/search-tweaks-reflect-range-in-label.js,sha256=WFAzPBvzf6SWaEAQJTxiEGhZm-65o676MN6KttCpvbo,490
19
+ ckanext/search_tweaks/field_relevance/assets/webassets.yml,sha256=PGr_EC4jOTABCRc3JCIAqYCzCMNgGG1KYE6Ua0S0vfk,184
20
+ ckanext/search_tweaks/field_relevance/templates/search_tweaks/field_relevance/promote.html,sha256=yMoVwcpiSl7XM-EaoznDe5MiRY3G1zcBywAI1IZhKj4,1144
21
+ ckanext/search_tweaks/query_popularity/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ ckanext/search_tweaks/query_popularity/config.py,sha256=O-YptWOeDQ6tyVLZ10D3dVs5tGhjOoOtFY3Xw_InmjA,858
23
+ ckanext/search_tweaks/query_popularity/config_declaration.yaml,sha256=asztZ5jFcfOQoS0Wq-pC41scC3w2ahNEP2AhIMMO2PM,866
24
+ ckanext/search_tweaks/query_popularity/plugin.py,sha256=ih9c7CrI-A1ilfe9I1Hb_3BdMOnzNsTyMfJA7c0Qs8A,1391
25
+ ckanext/search_tweaks/query_popularity/score.py,sha256=OEwO8BREcn56lmtvuv5kzHnDJ1ziaX9Wz_iuWGYs5aM,1079
26
+ ckanext/search_tweaks/query_popularity/logic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
+ ckanext/search_tweaks/query_popularity/logic/action.py,sha256=uG6IdAX2b8YztmcxiAho3A6-S41IPrRhvyV36CAM95g,1422
28
+ ckanext/search_tweaks/query_popularity/logic/auth.py,sha256=6jddjTxo9NX_a-_jQz_8Mj7273zfkfZz1_BOW6JzHm0,670
29
+ ckanext/search_tweaks/query_popularity/logic/schema.py,sha256=x1n-oLAI1IXdEm4WDzs4Mq5Ztrf8TLLIa6CHaZSc8tA,302
30
+ ckanext/search_tweaks/query_relevance/__init__.py,sha256=KGaxX2ttGBdCwCRFNc1adSsEbLXAJgFjQBXlEV2MGYw,2077
31
+ ckanext/search_tweaks/query_relevance/boost.py,sha256=hCswLDzwxVymeQXXf63EwpZC5tovI46288zl5CLVaU4,1965
32
+ ckanext/search_tweaks/query_relevance/cli.py,sha256=-WzLEAGqUlXGqmLPxJ8c-6oOCqc1i0wCWNEBJhdThXg,1698
33
+ ckanext/search_tweaks/query_relevance/config.py,sha256=Jxpxt7kZ6NTmirNKClBB-nLf12vBPkUldUZeFoSoQ_c,758
34
+ ckanext/search_tweaks/query_relevance/config_declaration.yaml,sha256=HMz_pP_bzI3GjJCROL5fpGBlESGuNqZyUUEyFYws80s,569
35
+ ckanext/search_tweaks/query_relevance/plugin.py,sha256=1Ynqaqrr-TBRoxCuMXnTds-B7HWKVBVLcBUr-twum6k,1426
36
+ ckanext/search_tweaks/query_relevance/score.py,sha256=q5e8lSTJb4vvvmNyj5lHHMpgocixafsJOVt_RFo5uJ4,1129
37
+ ckanext/search_tweaks/query_relevance/storage.py,sha256=Iskir3fgwWhEprQt5xEPRpYWC70rsNXEHS4SslKpqvM,3101
38
+ ckanext/search_tweaks/spellcheck/__init__.py,sha256=Af3LHk9L82QtAh4q7C3srzCwJiF6WCtxe4CFTPKhFMQ,1401
39
+ ckanext/search_tweaks/spellcheck/cli.py,sha256=X1HAXhElqJ6Hrc30USxXG50F-1RS0uvxP2tr3S6jnK0,250
40
+ ckanext/search_tweaks/spellcheck/helpers.py,sha256=K8ciOZrFYx_6PPRxvQQgUYkPil0oqTktURged_Uhk-I,4486
41
+ ckanext/search_tweaks/spellcheck/plugin.py,sha256=lKRNAl5V9REnjTNOhC9e4AfGLAw3wm3oQTwjS8hGofY,592
42
+ ckanext/search_tweaks/spellcheck/templates/search_tweaks/did_you_mean.html,sha256=5IAoogXrnYb8KecOLaPKQUerYCwkbEP5SQVjekeduHM,654
43
+ ckanext/search_tweaks/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ ckanext/search_tweaks/tests/conftest.py,sha256=76xLSBLTP2cN9-gMWdY1-5EWLt5iDHE8W3t1wCPhxaU,987
45
+ ckanext/search_tweaks/tests/test_plugin.py,sha256=WVnGzQP5nHzIht7PJEEIFrJ92tq5XuivQ0o8UNiRXSs,4763
46
+ ckanext/search_tweaks/tests/query_relevance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
+ ckanext/search_tweaks/tests/query_relevance/test_plugin.py,sha256=gdf_-fojz8TPSkp2Ebxe6c0gIJHI3xDuttE3bnmRkO0,2247
48
+ ckanext/search_tweaks/tests/query_relevance/test_score.py,sha256=RwG_o8QyW3BZBx3J5Cs1UUkMHi0DGR-mWvlSlk3ibaU,1140
49
+ ckanext/search_tweaks/tests/query_relevance/test_search.py,sha256=SqLmrnWKH2yz_PGe_PX4f6HFaBA8vUhsq6msejCfsSM,2868
50
+ ckanext/search_tweaks/tests/query_relevance/test_storage.py,sha256=za9mgPTb-cQXpk73dP2jEoR_740FTl3x1Ba3lRLUpUA,954
51
+ ckanext/search_tweaks/tests/spellcheck/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
+ ckanext/search_tweaks/tests/spellcheck/test_plugin.py,sha256=LBUX3Xe6_o5MBwK5V1POMSPnT0WpPdJvb7axh3Ha1ko,2617
53
+ ckanext_search_tweaks-1.0.0.dist-info/licenses/LICENSE,sha256=2lWcRAHjsQhqavGNnR30Ymxq3GJ9BaYL_dnfGO_-WFA,34500
54
+ ckanext_search_tweaks-1.0.0.dist-info/METADATA,sha256=QbxuCs5e7A6TwW_wGbV0xczmtbuJIhLH2_xxPfYFf1E,10758
55
+ ckanext_search_tweaks-1.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
56
+ ckanext_search_tweaks-1.0.0.dist-info/entry_points.txt,sha256=0hvD0BILJCAPZBOTH28bAMN8XCbPrltTZ6Q8-mUZGyE,615
57
+ ckanext_search_tweaks-1.0.0.dist-info/top_level.txt,sha256=5yjNwq-s42weaiMMUuA5lZ45g99ANsfcRBCvac1JMS4,8
58
+ ckanext_search_tweaks-1.0.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,52 +0,0 @@
1
- ckanext/__init__.py,sha256=xsigU4VzvLfcHEa08OUsv-05ZXU-qwjs3Y3f6PWA7fY,203
2
- ckanext/search_tweaks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- ckanext/search_tweaks/cli.py,sha256=Pex34fMESkVycy6kOfODtNmHh8nPMvzFKTeZD0txLvc,308
4
- ckanext/search_tweaks/config.py,sha256=NX7rsslGJyxQ8xTZidy9fI-SDkJ4lX4oLTX54lVLGI0,941
5
- ckanext/search_tweaks/interfaces.py,sha256=pOu2PyMVxu7XDyGCvP42upm5N4Ws1KR0qzyW8wE2CGY,869
6
- ckanext/search_tweaks/plugin.py,sha256=Bk1ejlTsKxUcIjckuzQBj_nwUbIz7H5t-AwqtmCvaIw,3330
7
- ckanext/search_tweaks/shared.py,sha256=9aWN_OXB5-h99lecnZVoZpLY6F8hbIRNX6WUQaoOoYI,325
8
- ckanext/search_tweaks/advanced_search/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- ckanext/search_tweaks/advanced_search/plugin.py,sha256=yYjC-ow-fFfvUOGJfsl3OpkifdrcqA_kWI9j-9lyVhI,3242
10
- ckanext/search_tweaks/advanced_search/assets/advanced-search.css,sha256=KlBYOihUJepiu2iiGcRjIWZltogEqI8iGbO-28Wgnqw,584
11
- ckanext/search_tweaks/advanced_search/assets/advanced-search.js,sha256=rkgprbv9fUnWoxgISXmoxHkSC4Z9OLXgZoOIICpn9X8,2328
12
- ckanext/search_tweaks/advanced_search/assets/webassets.yml,sha256=g0NMsLyHzslxtkIXRFj_Vf-SU6b8MYlBiuHc50SQiAo,439
13
- ckanext/search_tweaks/advanced_search/templates/advanced_search/search_form.html,sha256=QlKCxEUDGP1g4oZEOKAGSuopjrJsbcgK2cs28k3X4Vc,4266
14
- ckanext/search_tweaks/field_relevance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- ckanext/search_tweaks/field_relevance/plugin.py,sha256=f5VQcu5PfBncXM6WVLsMDze9fQe20LmNvot51mui3Jg,1338
16
- ckanext/search_tweaks/field_relevance/views.py,sha256=Qt8YuryPaDlwNKN8yfdQg0M1B8o9kYAeOXyvsAger2o,3089
17
- ckanext/search_tweaks/field_relevance/assets/search-tweaks-reflect-range-in-label.js,sha256=WFAzPBvzf6SWaEAQJTxiEGhZm-65o676MN6KttCpvbo,490
18
- ckanext/search_tweaks/field_relevance/assets/webassets.yml,sha256=PGr_EC4jOTABCRc3JCIAqYCzCMNgGG1KYE6Ua0S0vfk,184
19
- ckanext/search_tweaks/field_relevance/templates/search_tweaks/field_relevance/promote.html,sha256=uqB9Wf7OJzF3-Ep6VZwe3bYICdzy0JhJPJzNPuMLBr0,1118
20
- ckanext/search_tweaks/query_popularity/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
- ckanext/search_tweaks/query_popularity/config.py,sha256=O-YptWOeDQ6tyVLZ10D3dVs5tGhjOoOtFY3Xw_InmjA,858
22
- ckanext/search_tweaks/query_popularity/plugin.py,sha256=ih9c7CrI-A1ilfe9I1Hb_3BdMOnzNsTyMfJA7c0Qs8A,1391
23
- ckanext/search_tweaks/query_popularity/score.py,sha256=JfOiR7yj22euNrIX3T_VYjzB7ilGpDmr4hmXFHfsSAc,1052
24
- ckanext/search_tweaks/query_popularity/logic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- ckanext/search_tweaks/query_popularity/logic/action.py,sha256=uG6IdAX2b8YztmcxiAho3A6-S41IPrRhvyV36CAM95g,1422
26
- ckanext/search_tweaks/query_popularity/logic/auth.py,sha256=6jddjTxo9NX_a-_jQz_8Mj7273zfkfZz1_BOW6JzHm0,670
27
- ckanext/search_tweaks/query_popularity/logic/schema.py,sha256=rgjmRyGb7zlBOLZo284XcH9F6VepmIv5yvoxTGxLByA,301
28
- ckanext/search_tweaks/query_relevance/__init__.py,sha256=mGpZuwY8UwPMuxjNLhGVYoaXPfLx5UPMixpldIjZuSY,1467
29
- ckanext/search_tweaks/query_relevance/cli.py,sha256=7wU3nWdCQNaUi2O_zARy7usvUysE-wnp5h_yRlw7nAo,2576
30
- ckanext/search_tweaks/query_relevance/plugin.py,sha256=W9qmwWD_wThedqpLNgxNY--N0TsHtPDoW4EfcbaWGhw,2448
31
- ckanext/search_tweaks/query_relevance/score.py,sha256=hfrfgNP5OUf7YBBDuFFBZb66ixpiAlnM-KAXzUVexXc,1811
32
- ckanext/search_tweaks/query_relevance/storage.py,sha256=7SP1arTjTvbHrWDZhzu9E0pWxk4ygz3NcpDk7P4YODk,4852
33
- ckanext/search_tweaks/spellcheck/__init__.py,sha256=Af3LHk9L82QtAh4q7C3srzCwJiF6WCtxe4CFTPKhFMQ,1401
34
- ckanext/search_tweaks/spellcheck/cli.py,sha256=X1HAXhElqJ6Hrc30USxXG50F-1RS0uvxP2tr3S6jnK0,250
35
- ckanext/search_tweaks/spellcheck/helpers.py,sha256=khlpo5acwxUZ4lDNH9V3EP1BAvLf1-Z6UY_dQCPqOow,4397
36
- ckanext/search_tweaks/spellcheck/plugin.py,sha256=lKRNAl5V9REnjTNOhC9e4AfGLAw3wm3oQTwjS8hGofY,592
37
- ckanext/search_tweaks/spellcheck/templates/search_tweaks/did_you_mean.html,sha256=5IAoogXrnYb8KecOLaPKQUerYCwkbEP5SQVjekeduHM,654
38
- ckanext/search_tweaks/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- ckanext/search_tweaks/tests/conftest.py,sha256=Moxwo1WE8Yl6su50C7bqG6IEH3t38UW4PtfHe1SiiAk,662
40
- ckanext/search_tweaks/tests/test_plugin.py,sha256=WVnGzQP5nHzIht7PJEEIFrJ92tq5XuivQ0o8UNiRXSs,4763
41
- ckanext/search_tweaks/tests/query_relevance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
- ckanext/search_tweaks/tests/query_relevance/test_plugin.py,sha256=RBraEO6_LMvHx9ekDz_h8LgtpEJV8BkR3q-9QotRGWA,2196
43
- ckanext/search_tweaks/tests/query_relevance/test_score.py,sha256=RwG_o8QyW3BZBx3J5Cs1UUkMHi0DGR-mWvlSlk3ibaU,1140
44
- ckanext/search_tweaks/tests/query_relevance/test_storage.py,sha256=xBHB69zHE301mHlUB2hz0RXJaqFrhRMesAz2LNYNFE0,2825
45
- ckanext/search_tweaks/tests/spellcheck/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
- ckanext/search_tweaks/tests/spellcheck/test_plugin.py,sha256=4pocLV8uzea2ua8LUTC3IXlyYc3oKbhApODA1uWHNFU,2517
47
- ckanext_search_tweaks-0.6.2.dist-info/LICENSE,sha256=2lWcRAHjsQhqavGNnR30Ymxq3GJ9BaYL_dnfGO_-WFA,34500
48
- ckanext_search_tweaks-0.6.2.dist-info/METADATA,sha256=IIGP0lRm0r51UeLK7khGVxxzVKzyJVY_ba2AvLPIVy8,12249
49
- ckanext_search_tweaks-0.6.2.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
50
- ckanext_search_tweaks-0.6.2.dist-info/entry_points.txt,sha256=0hvD0BILJCAPZBOTH28bAMN8XCbPrltTZ6Q8-mUZGyE,615
51
- ckanext_search_tweaks-0.6.2.dist-info/top_level.txt,sha256=5yjNwq-s42weaiMMUuA5lZ45g99ANsfcRBCvac1JMS4,8
52
- ckanext_search_tweaks-0.6.2.dist-info/RECORD,,