• bosco

    fixed underscore

    Your_pyto_textview.__py_view__.TextView.objc_class.partial_methods.keys())
    

    posted in Pythonista read more
  • bosco

    @cvp try this: print(Your_pyto_textview.py_view.TextView.objc_class.partial_methods.keys())

    posted in Pythonista read more
  • bosco

    @felciano There appear to be 2 issues.

    • Dropbox version 11.7.0 crashes when using the appex module.
    • The keychain module does not work with the appex module.

    You will need to use Dropbox 6.4.0 and you will need to store your refresh_token somewhere else besides keychain.

    You can modify dropboxlogin like this:

    #refresh_token = keychain.get_password('dropbox', 'refresh_token')
    refresh_token = "your_refresh_token"
    

    You can then remove the dropbox folders from site-packages-3 or try this script which removes site-packages-3 from sys.path when running from a share sheet and temporarily reverts back to dropbox 6.4.0.

    import sys
    import appex
    import console
    
    print('file', appex.get_file_path())
    
    def test():
        print(sys.path[1])
        if appex.is_running_extension():  # if share sheet  
            sys.path.remove(sys.path[1])  # remove site-packages-3 from sys.path  
        import dropbox
        print('dropbox version', str(dropbox.__version__))
    
        import dropboxlogin
        dropbox_client = dropboxlogin.get_client()
        print('Getting account info...')
        account_info = dropbox_client.users_get_current_account()
        print('linked account:', account_info)
        
    test()
        
    

    If you are just trying to upload a file from a share sheet, this script does not use the dropbox module:

    import sys, os, json, shutil
    import appex
    import console
    import keychain
    import requests
    from requests.auth import HTTPBasicAuth
    
    app_key = "your_app_key"
    app_secret = "your_app_secret"
    refresh_token = "your_refresh_token"
    
    def dropbox_token(refresh_token):
        data = {'refresh_token': refresh_token, 'grant_type': 'refresh_token'}
        try:
            r = requests.post('https://api.dropbox.com/oauth2/token', data=data,
                auth = HTTPBasicAuth(app_key, app_secret))
            result = r.json()
        except:
            print(str(sys.exc_info()))
            return { 'refresh_token': None, 'access_token': None, 'error': {'.tag': str(sys.exc_info())} }
    
        #print('dbx:', result)
        return result
        
    def upload_file(source_filename, path):
        with open(source_filename, 'rb') as f:
            data = f.read()
    
        parms = {}
        parms['path'] =  path
        parms['mode'] =  'overwrite'
        print (json.dumps(parms))
        headers = {'Authorization': 'Bearer %s' % (access_token,),'Dropbox-API-Arg': json.dumps(parms),'Content-Type': 'application/octet-stream' }
        url = 'https://content.dropboxapi.com/2/files/upload'
        try:
            r = requests.post(url, stream=True, headers=headers, data=data)
        except:
            print("Exception requests: %s" % str(sys.exc_info()))
        result = r.json()
        return result
        
    local_path = os.path.expanduser('~/Documents/tmp')
    access_token = dropbox_token(refresh_token)['access_token']
    
    files = appex.get_file_paths()
    if files != None and files != []:
        for i in range(len(files)):
            print('Input path: %s' % files[i])
            basename = os.path.basename(files[i])
            filename=os.path.join(local_path, basename)
            shutil.copy(files[i], filename)
            upload_file(basename, '/remote/dropbox/path/' + basename)
    
    

    posted in Pythonista read more
  • bosco

    I have created a modified version of dropboxlogin.py that generates short-lived access tokens. So far, it seems to work with dropbox version 6.4.0 that is provided with Pythonista.

    First run will authorize your application and store a long-lived refresh token in your device keychain.

    # simple test app
    import dropboxlogin
    dropbox_client = dropboxlogin.get_client()
    print('Getting account info...')
    account_info = dropbox_client.users_get_current_account()
    print('linked account:', account_info)
    

    Useful links:
    Migrating App access tokens
    Dropbox OAuth Guide

    I was able to update dropbox to the latest version with this work around script which downloads the dropbox wheel and unzips the contents in site-packages. I had to use Stash pip to install the requests, six and stone. I'm still testing to see if it is better to stick with the original Pythonista dropbox version or to use the upgraded versions of dropbox, requests and six.

    # workaround to install latest dropbox in pythonista
    # install requirements using stash pip
    # pip install requests
    # pip install six
    # pip install stone
    
    import sys, os
    import requests
    from zipfile import ZipFile
    
    sitepath = os.path.expanduser('~/Documents/site-packages-3')
    os.chdir(sitepath)
    from zipfile import ZipFile
    url = 'https://files.pythonhosted.org/packages/ef/64'
    url += '/2ef3c03ac039f9e5f29c0f557dc3f276241ef3c1627903a5f6a8c289cf24/'
    url += 'dropbox-11.7.0-py3-none-any.whl'
    dest_path = './dropbox.zip'
    r = requests.get(url)
    
    with open(dest_path, 'wb') as f:
        f.write(r.content)
        print('download complete...')
    
    with ZipFile(dest_path, 'r') as zip:
        # extracting all the files
        print('Extracting all the files now...')
        zip.extractall()
        print('Done!')
    
    os.remove(dest_path)
    

    posted in Pythonista read more
  • bosco

    @ccc This link is for Microsoft OneDrive. My Dropbox space is limited.

    The original link is a more permanent and reliable alias to this URL.

    https://onedrive.live.com/?authkey=!AC94lHutmY315L4&id=98B88F62EF7BB2B3!125&cid=98B88F62EF7BB2B3

    posted in Pythonista read more
  • bosco

    I believe this is a copy of the last XCode Template modified by @coltonboyd. I have only used it to run the simulator with the latest version of XCode. It throws some warnings, but works for testing.
    https://1drv.ms/u/s!ArOye-9ij7iY2GkveJR7rZmN9eS-?e=b37KZi

    posted in Pythonista read more
  • bosco

    @ihf This script appears to work with python 2 or 3. Try changing #!python3 to #python2. It shouldn't be using simplejson, since json is a core python module. I see now that the your error may be a problem with your requests package. LIne 42 which reads result = r.json coverts the result to json. Line 41 contains json.dumps(data), which converts the arguemnts to a string.

    @enceladus Thanks for creating the gist.

    posted in Pythonista read more
  • bosco

    @enceladus Please go ahead and make a gist. I hope contribute more in the future when I have more time. Thanks!

    posted in Pythonista read more

Internal error.

Oops! Looks like something went wrong!