1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415
|
7.2
- support and test against Python 3.13 and Django 5.1/5.2 (thx to Stu Tomlinson)
- updated md5 to set usedforsecurity for FIPS compliance (Logan Bibby)
- skip ArrayField in exact conds
7.1
- support and test against Python 3.12 and Django 5.0
- prevent dups in conjs and disjs by using proper data-structures (thx Sergey Prokopiev for a test)
- unpin funcy major version
- fixed conj keys TTL in Redis 7.x
- updated and cleaned up tests
7.0.2
- fixed .aggregate()
- fixed big memory usage during migrations
- fixed INSIDEOUT in older redises
- better handle model families with abstracts in them
- allow funcy 2.0+
7.0.1
- made it work with Redis 6.x and older again
- handle abstract models better
- some docs improvements
7.0
- support Django 4.2b and 5.0a
- added a new insideout mode
- made join invalidation more granular
Backwards incompatible changes:
- dropped Python 3.5, 3.6 and Django 2.1, 2.2, 3.0 and 3.1 support
- removed CACHEOPS_LRU
- removed CacheopsRedis, should inherit redis.Redis instead
6.2
- support Python 3.11 and Django 4.1
- added command to clear stale cacheops keys (Bruno Alla)
- fixed `invalidate_m2o` for polymorphic models (#430) (Andrey Alekseev)
- updated README: TOC, link to the post, some explanations
6.1
- support Django 3.2 and 4.0 (thx to Olivér Kecskeméty)
- do not gulp commit errors (Oleg Yamnikov)
- fixed precall key when a prefix is defined (Peter Baumgartner)
- fixed m2o/m2m queries invalidation on object deletion (thx to Sergey Tikhonov)
6.0
- support and test against Python 3.9 and Django 3.1/3.2
- added custom serializers support (thx to Arcady Usov)
- support callable extra in @cached_as() and friends
- made simple cache obey prefix
- skip JSONFields for purposes of invalidation
- configure skipped fields by internal types, classes still supported
- handle `DatabaseError` on transaction cleanup (Roman Gorbil)
- do not query old object if cacheops is disabled
- do not fetch deferred fields during invalidation, fixes #387
Backwards incompatible changes:
- callable `extra` param, including type, now behaves differently
- simple cache now uses prefix
5.1
- support subqueries in annotations (Jeremy Stretch)
- included tests into distro (John Vandenberg)
- fixed .invalidated_update(), if updated QuerySet had related fields selected (M1hacka)
- fixed possible deadlock in .invalidated_update() (M1hacka)
- fixed filtering with expressions
- fixed queries filtering in Exists (thx to Axel Wegener)
- updated min redis-py to 3.0.0
5.0.1
- fixed reverse o2o invalidation (thx to John Anderson)
- fixed unstable cache key when field validors are used
- guard against non-integer timeouts
5.0
- support Python 3.8 and Django 3.0 (thx to Misha Kalyna)
- improve model fields stamping (Alex Lokhman)
- disabled postponed invalidation when no_invalidation is applied (Vladimir)
- fixed custom manager derived from BaseManager (Eric Plaster)
Backwards incompatible changes:
- dropped Python 2.7 and Djangos before 2.1
- Redis 4.0+ required
4.2
- support Django 2.1 and 2.2
- added keep_fresh option to @cached_as (George Lee)
- pass CACHEOPS_SENTINEL options through (David Fuentes Baldomir)
- made SKIP_FIELDS and LONG_DISJUCTION configurable (Nic Wolff)
- fixed .aggregate() over .annotate() fields in Django 2.2
- fixed .bulk_create() in Django 2.2 (Grzegorz Szczepanczyk)
- fixed test database to work in environments without /dev/shm (George Lee)
- fixed proxy/abstract model bug
- added test case for issue #312 (Andy Tzeng)
- some warnings and doc-strings improvements
4.1
- use UNLINK instead of DEL when available, use Redis 4.0+ for that
- request m2m objects for invalidation using correct db
- fixed caching counts, aggregates and exists in writes,
dirty transactions and while cacheops is disabled
- fixed various multidb/invalidation issues (Svan70)
- fixed db in .invalidated_update()
- fixed possible key disrepancy in cache_on_save with multidb
- fixed jinja2 support in Python 3
- documented CACHEOPS_CLIENT_CLASS
4.0.7
- fixed RawSQL() and Subquery() (thx to thakryptex)
- made the Redis client class configurable (Nic Wolff)
- package is now also distributed as a universal wheel (Jon Dufresne)
4.0.6
- fixed m2m invalidation issue with certain configs
- fixed catastrophic backtracking in template extensions
4.0.5
- fixed db selection in invalidation fetch and .invalidated_update() when router fails (M1ha Shvn)
- fixed unlickely "_clone() unexpected keyword '_cacheprofile'" error
- fixed LookupError bug
- fixed .meta.concrete_model not set bug
- fixed docs on template tags
4.0.4
- fixed caching while app registry not ready
- fixed random ordered dicts producing varying SQL for same query
4.0.3
- configure via Sentinel (Tapo4ek)
4.0.2
- fixed caching django migrations
4.0.1
- do not prevent fast path deletes on not cached models
- minor optimization
4.0
- added cache key prefix function
- added .aggregate() caching
- support QuerySet.union() and friends
- added cache_invalidated signal (thx to Kimmo Kiiski)
- cache .first() and .last() on 'get' op
- correctly skip or show nice error message on non-django models/managers
- allow cleaning file cache in non default place
- cache keys no longer change on fields reorder
- fixed .invalidated_update() on updated object versions
- fixed template tags in Django 2.0
- fixed deprecation warnings in Python 3
- use module global CACHEOPS_DEBUG to cache evolving code
- minor optimizations
Backwards incompatible changes:
- dropped Django 1.7 support
- dropped write_only flag
- dropped implicit write_only in .get_or_create(), .select_for_update() and friends
- .iterator() is never cached now
- invalidate_all() works immediately even in transaction
- @cached_as(timeout=0) no longer means timeout is ignored/derived from querysets,
use timeout=None instead.
3.2.1
- fixed CACHEOPS_DEGRADE_ON_FAILURE=True
3.2
- support Django 1.11
- support Python 3.6
- preliminary support for Django 2.0
- support multidb nested transactions
- fixed pk with default (leonardo orozco)
3.1.3
- better dirty sql heuristic
- fixed on commit sequence issue (thx to Irae Hueck Costa)
- fixed dup field__eq queries (Michał Ochman)
3.1.2
- fixed querysets with custom .iterator() (like django-polymorphic)
- support no argument @cached_view
- check that sample is passed into @cached_as()
3.1.1
- fixed unexpected dirty transaction
- fixed a bug with destroying manager
- fixed CACHEOPS setting and upper-case app labels
3.1
- added locking to combat dog-pile effect
- handle transactions smarter (ihucos)
- handle functions in @cached_as() and @cached() args
- do not allow unknown kwargs in @cached_as()
3.0.1
- support Django 1.10 (worked before, but now it's official)
- accept empty CACHEOPS_REDIS setting
- fixed ImportError in cleanfilecache command (Roman)
3.0
- support PyPy
- support Python 3.5
- support Django 1.9
- added transparent transaction handling (Joel Hillacre)
- added .invalidated_update()
- added cache_read signal (Joona Pääkkönen)
- added CACHEOPS_ENABLED setting
- invalidate on intermediate tables in long joins
- support settings override
- made CACHEOPS keys case insensitive
- allow redis connection settings to be specified by a URL (Tim Savage)
- fixed router support
- fixed clone cache settings affecting original queryset
- more fixes for non-ascii in str params
- calc func cache keys smarter
- no_invalidation optimizations
Backwards incompatible changes:
- Django 1.6 and earlier no longer supported
- dropped old CACHEOPS setting format
- removed CACHEOPS_FAKE setting
- removed .cached_call() from basic and file caches
- disabled cacheops for fake migration models
2.4.5
- backport: disabled cacheops for fake migration models
- disabled cacheops for south models
- fixed get_queryset() on custom qs rename bug
2.4.3
- fixed .get() on reverse fk related manager
- fixed memory leak on migrations
2.4.2
- fixed .values() and .values_list() in Django 1.9
- stopped sharing cache between proxies and base
2.4.1
- export FileCache and RedisCache from cacheops
- allow non-ascii in str params
- fixed subqueries with different db
2.4
- added @decorator_tag to easily create cached template tags
- create redis client lazily
- let invalidate @cached_view()
- support template responses used by generic CBV
- support argumentless no parentheses form for @cached and @cached_view
- removed unneeded invalidation calls in .bulk_create()
- allow decorating built-in and external functions
- added .cached_call() to simple and file cache
- added key_func argument to @cached_as()
- check that timeout is specified in CACHEOPS setting
- fixed m2m invalidation on reverse changes
- fixed passing kwargs in @cached_as()
- fixed @cached with no parentheses
- fixed .bulk_create() API in Django 1.4
2.3.2
- made cacheops invalidate before other post_* signals (Emil Stenström)
- fixed invalidation on proxy/base model changes
- added no_invalidation to fake cacheops
- test against MySQL
2.3.1
- updated support for Django 1.8 (Andriy Sokolovskiy)
- fixed bulk_create() to return objects instead of None (Ilya Baryshev)
2.3
- Django 1.8 support and preliminary Django 1.9 support
- made 'ops' config option to accept single string
- added invalidate_fragment()
- added a way to get/set/delete function cache easily
- added redis.TimeoutError to degradation handling (George Kappel)
- fixed invalidation on QuerySet.bulk_create(),
worked only from Manager previously
- fixed .bulk_create() API to comply with Django
- minor optimizations
2.2.1
- fixed thread local error
- fixed ops = 'all' both in config and .cache()
2.2
- switched to new CACHEOPS setting style
- added CACHEOPS_DEFAULTS setting
- work as LRU cache
- cache .exists() calls in Django 1.6+
- invalidate on .bulk_create()
- added no_invalidation context manager/decorator
- documented local_get and cache_on_save
- fixed saving objects with F-expression fields (Fedor Nasyrov)
- fixed queries with Django 1.7 transforms
- fixed binary fields in python 3
- stopped using simplejson
- simpler queryset key calculation,
third party fields should be more compatible now
- removed bogus clone param from .nocache() call
2.1.1
- fixed bug in m2m invalidation
- fixed bug with null geometry fields
- fixed unpickling objects with BinaryFields
2.1
- support Django 1.7
- do not fetch from cache when doing .select_for_update() and similar,
but do write to cache if it's enabled
- fixed inherited models exception in admin,
multi-table models are still not really supported!
- fixed fake cacheops
- fixed deprecation warning in Django 1.6 admin
2.0
- conditions on related models will now invalidate queryset
- m2m invalidation is much more granular
- removed requirement that timeout should not be greater than default
- lua scripting is used to save and invalidate cache, making things faster
- better invalidation for complex and custom fields
- silent stringify of unknown objects by default
- support caching django.contrib.gis queries (koodjo)
- cacheops is now thread-safe
- added a way to no-op cacheops
- added @cached_view() and @cached_view_as()
- pass several samples for @cached_as() and @cached_view_as()
- fixed working with querysets created by non-patched constructor (#3 and dups)
- fixed invalidate_model() for proxy models
- fixed deepcopy(queryset) bug
- fixed possible collisions when cached functions passed complex structured arguments
- fixed StringifyError on timedelta (mpyatishev)
Backwards incompatible changes:
- filters on TextFields no longer affect invalidation
- @cached_as() cache key will now depend on function arguments
- @cached_as() and @cached() will now depend on function line in a code,
permitting usage of lambdas and same named methods without passing extra
- @cached_as() and @cached() will now take timeout as first argument and extra as second.
Anyway using them as keyword arguments is recommended
- Django 1.2 no longer supported
- Redis 2.6+ is required
1.3.1
- fixed bug with negating "some"-conditions
- fixed bug with schemes unsync when invalidating model
Backwards incompatible changes:
- reverted .cache(write_only=...) behaviour to enable caching for all ops
- .cache(timeout=...) call will enable caching for all ops
1.3.0
- support generic relations (erthalion)
- support filtering by time equality
- optimizations for python 3
Backwards incompatible changes:
- .cache(write_only=...) doesn't enable caching for all ops anymore (not really intended)
1.2.1
- set six minimum version right (crazyzubr)
1.2
- Python 3 support
1.1.1
- fixed Django 1.5- compatibility (aykutozat)
1.1
- Django 1.6+ support
- added Django template tags
- fixed caching querysets combined with | and & operators
1.0.3
- added db_agnostic option to cache profile
- partial support for Django 1.6+
1.0.2
- fixed cached_on_save
- fixed .inplace() altering cache key
1.0.1
- .delete() method for simple cache
- .invalidate() method for @cached() and file_cache.cached() functions
1.0.0
- defend against model changes corrupting cache (ttyS15)
- support F-expressions (Yuego)
- fixed local_get with unhashable arg TypeError
- fixed caching of raw queries (Yuego)
0.9.9
- fixed file cache md5 reference
0.9.8
- support isnull lookup for better invalidation
- fixed 'Query' has no len()
- dumped django.utils.hashcompat in favor of hashlib
0.9.7
- support for flex models
- support @cached_as(SomeModel)
- file cache default dir changed to /tmp/cacheops_file_cache
- better support for tuples in extra param in @cached and jinja2 tags
0.9.6
- support gracefull degradation on redis fail (Beres Botond)
0.9.5
- support for proxy models
0.9.4
- fixed occasional redis 100% cpu use (tumb1er)
0.9.3
- invalidate and cleanfilecache commands added to dist
- django 1.5 compatability (jhpinson)
0.9.2
- compatability with latest redis-py
- many other bug fixes
- minor optimizations
- better docs, including PERFORMANCE section
... lost in ancient history ...
|