Jump to content
Cybrosis

Storing static data as JSON -> script

Recommended Posts

Hey all!

 

I'm making great progress on the workflow i'm working on, but I have hit a roadblock trying to move a large dictionary of settings out of a python script into...somewhere else.

 

I need to be able to add to and change this data, and it really clutters the script it's running in, so I would love to try to move it into a JSON object in the workflow itself and then import it as a dictionary into the script.  I'm running into an error when I try to read the os.environ variable into python.  Has anyone done anything like this, or does anyone know a better way to store a bbunch of data for my scripts to read?

 

Thanks!

 

Chris

Share this post


Link to post

A little more info.  Here's the workflow JSON I'm using in the workflow.  I tested the "foo" variable, and I can read it just fine.  It's the tableDict variable that doesn't want to read into python:

 

{
  "alfredworkflow" : {
    "arg" : "{query}",
    "variables" : {
      "foo" : "bar",
      "tableDict" : {
        "rack" : {
          "title_field" : "sys_class_name",
          "primary_search_field" : "name",
          "prefix" : "",
          "table" : "cmdb_ci_rack",
          "instance" : "datacenter",
          "subtitle_field" : "dv_location"
        },
        "ci" : {
          "title_field" : "sys_class_name",
          "primary_search_field" : "name",
          "prefix" : "",
          "table" : "cmdb_ci",
          "instance" : "datacenter",
          "subtitle_field" : ""
        }
      }
    }
  }
}

 

Share this post


Link to post

A bit more info.  I've tried various methods to read this info into python.  Even trying to print the variable gives me an error:

 

import os

print("imported var foo is a " + str(type(os.environ['foo']))) # this totally works

print("imported var tableDict is a " + str(type(os.environ['tableDict']))) # this totally doesn't

 

Error:

Quote

imported var foo is a <type 'str'>

[2019-02-05 11:45:03][ERROR: input.scriptfilter] Code 1: Traceback (most recent call last):

  File "/Users/*****/Library/Caches/com.runningwithcrayons.Alfred-3/Workflow Scripts/5A6C1B81-78E5-42B0-9512-5DFD13560853", line 20, in <module>

    print("imported var tableDict is a " + str(type(os.environ['tableDict'])))

  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/UserDict.py", line 23, in __getitem__

    raise KeyError(key)

KeyError: 'tableDict'

[2019-02-05 11:55:24][ERROR: input.scriptfilter] JSON error: JSON text did not start with array or object and option to allow fragments not set. in JSON:

 

Edited by Cybrosis

Share this post


Link to post

Workflow (and environment) variables can only be strings, not lists or dicts. You can't nest any more objects beneath variables.


You could try serialising tableDict to a JSON string, or save the data to disk and just pass a key.

Share this post


Link to post

Is there a way to integrate that into the workflow itself?  I guess some sort of "set config" option that just opens the config file in the default text editor?  I would rather not convert to a string; the option to have the options in a separate file on disk seems much more elegant.

Share this post


Link to post
4 hours ago, Cybrosis said:

opens the config file in the default text editor

 

open -t {{path_to_file}}

Share this post


Link to post
On 2/6/2019 at 6:17 PM, Cybrosis said:

I guess some sort of "set config" option that just opens the config file in the default text editor?

 

It's hard to say without knowing more about exactly what you're trying to achieve. In most cases, opening a config file in the default editor is a bad idea: the default macOS editor is TextEdit, and it defaults to "smart" quotes, which will screw up most source code. I would only recommend opening the config file directly if your workflow is aimed at users likely to have associated a real editor with JSON/YAML/TOML/<your format here> files.

 

So if your workflow isn't aimed at developers, it's probably better to just reveal the file in Finder: then it's the user's fault if they screw it up by opening it in TextEdit.

 

Alfred does have a decent AppleScript settings API, but it's based on workflow/environment variables, which are strings. Here's the skinny on workflow/environment variables in Alfred.

 

You can store JSON in Alfred's variables, which can be a handy way to pass stuff between workflow elements, but you're probably better off having your workflow handle its own configuration via a file in the alfred_workflow_data directory.

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...