Skip to main content

One of two strings can change into the other when absorbing the difference among them. Remote strings could be synchronized through minimum data.

Project description

StrDiff

One of two strings can change into the other when absorbing the difference among them.

import json
from StrDiffSynch import StrDiff

data1 = json.dumps({"name": "davis", "other": {"age": 18}})
data2 = json.dumps({"name": "davis", "age": 18})
diff = StrDiff(data1, data2)
assert data1 + diff == data2
assert diff + data1 == data2

SynchBox

This class is used for synchronizing big string but not big enough to have to be stored in a database, among two endpoints.

import asyncio

from StrDiffSynch import SynchBox

# LOCAL
# Define a SynchBox instance to contain the string
synch_box = SynchBox('This is big data.')
# update the containing string
synch_box.local_str = 'This is another big data.'
# If a request with the remote string hash value comes to ask to synchronize the string at the remote endpoint, local endpoint handles the request.
# REMOTE
synch_box2 = SynchBox('')
remote_str_hash = synch_box2.local_str_hash
# request though the web
# LOCAL
remote_synch_data = synch_box.handle_remote_synch_command(remote_str_hash)
# response through the web
# REMOTE
# Because no synchronization has happened, remote_synch_data would be the raw big string, 'This is another big data.' as demonstration.
synch_box2.handle_local_synch_command(remote_synch_data)
assert 'This is another big data.' == remote_synch_data == synch_box2.local_str

# Now repeat
# REMOTE
remote_str_hash = synch_box2.local_str_hash
# request though the web
# LOCAL
remote_synch_data = synch_box.handle_remote_synch_command(remote_str_hash)
# response through the web
# REMOTE
# Well now that initial synchronization has happened, SynchBox will try to find the difference information between these two copy , which is usually much smaller than the raw string.
assert type(remote_synch_data) != str and any(['h' == i[0] for i in remote_synch_data])
synch_box2.handle_local_synch_command(remote_synch_data)  # At this step,there is nothing to change in fact.
assert synch_box2.local_str == synch_box.local_str

# Now repeat
# LOCAL
# make some change
synch_box.local_str += 'u28dy2'
# REMOTE
remote_str_hash = synch_box2.local_str_hash
# request though the web
# LOCAL
remote_synch_data = synch_box.handle_remote_synch_command(remote_str_hash)
# response through the web
# REMOTE
assert type(remote_synch_data) != str and any(['h' == i[0] for i in remote_synch_data])
old_str = synch_box2.local_str
synch_box2.handle_local_synch_command(remote_synch_data)  # At this step,changes happen.
assert synch_box2.local_str == synch_box.local_str != old_str

# Now repeat
# Vice versa, REMOTE could synchronizes LOCAL.
# REMOTE
# make some change
synch_box2.local_str = synch_box2.local_str[0:3] + synch_box2.local_str[-3:]
# LOCAL
str_hash = synch_box.local_str_hash
# request though the web
# REMOTE
synch_data = synch_box2.handle_remote_synch_command(str_hash)
# response through the web
# LOCAL
assert type(synch_data) != str and any(['h' == i[0] for i in synch_data])
old_str = synch_box.local_str
synch_box.handle_local_synch_command(synch_data)  # At this step,changes happen.
assert synch_box2.local_str == synch_box.local_str != old_str

# A bad situation
# REMOTE
remote_str_hash = synch_box2.local_str_hash
# request though the web
# LOCAL
remote_synch_data = synch_box.handle_remote_synch_command(remote_str_hash)
# response through the web
# REMOTE
assert type(remote_synch_data) != str and any(['h' == i[0] for i in remote_synch_data])
# Before the difference information synchronization data comes, the string with the hash value remote_str_hash changes for some reason.
synch_box2.local_str = 'Hello world'
# The coming information can't be handled.
try:
    synch_box2.handle_local_synch_command(remote_synch_data)
except AssertionError:
    print('Fail to handle_local_synch_command')


# If you want to automatically handle this bad situation, you can pass the keyword parameter strdiff_add_error_handler to handle_local_synch_command, to be called to fetch the raw string.
# For example,
# def fetch_raw_string():
#     return requests.get('http://www.baidu.com/raw-string')
# We will demonstrate easily.
def fetch_raw_string():
    return synch_box.local_str


synch_box2.handle_local_synch_command(remote_synch_data, fetch_raw_string)  # At this step,changes happen
assert synch_box2.local_str == synch_box.local_str


# If you are using this module in a coroutine function, to request you can pass a coroutine function as the error handler,
# for example:
# async def fetch_raw_string():
#     async with aiohttp.ClientSession().get('http://www.baidu.com/raw-string') as r:
#         return await r.text()
# We will demonstrate easily.
async def fetch_raw_string():
    return synch_box.local_str


async def main():
    handle_local_synch_command_res = synch_box2.handle_local_synch_command(remote_synch_data, fetch_raw_string)
    # try to await the result only when necessary.
    if type(handle_local_synch_command_res) == asyncio.Task:
        await handle_local_synch_command_res
    assert synch_box2.local_str == synch_box.local_str


asyncio.get_event_loop().run_until_complete(main())

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

StrDiffSynch-2.0.1.tar.gz (5.9 kB view details)

Uploaded Source

Built Distribution

StrDiffSynch-2.0.1-py3-none-any.whl (7.4 kB view details)

Uploaded Python 3

File details

Details for the file StrDiffSynch-2.0.1.tar.gz.

File metadata

  • Download URL: StrDiffSynch-2.0.1.tar.gz
  • Upload date:
  • Size: 5.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.0.post20200714 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.7.7

File hashes

Hashes for StrDiffSynch-2.0.1.tar.gz
Algorithm Hash digest
SHA256 6af8707b6239ca904eb9452c0c63daba014e18e77e0152eb7945a94d828974f9
MD5 c5b7035006301d251c9171e918e3bedd
BLAKE2b-256 7b59ed0fbcab997bb5443e06309a526026f24a9aae7b779a984e0c1c8f31960f

See more details on using hashes here.

File details

Details for the file StrDiffSynch-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: StrDiffSynch-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 7.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.0.post20200714 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.7.7

File hashes

Hashes for StrDiffSynch-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 54a72c6a391cf43bd17cde69cc0ef1550a6392d352c76e9506b5eb96b7d776f1
MD5 ff58eb1b3d0f47c6e851badaf9d12fe0
BLAKE2b-256 414d5f954d718d81f0e2c493040568fed29b589297b087583caee9187d404cb3

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page