Code Monkey home page Code Monkey logo

chroma-feedback's People

Contributors

henryruhs avatar jqassar avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

chroma-feedback's Issues

Fix Bamboo project and plan API calls

The Bamboo producer has discrepancies in how it parses results coming from a project (a collection of plans) versus a single plan.

Assume a Bamboo project (key ACME) with three plans within it (keys ANVIL, BOMB, DYNAMITE). A user can ask the API for results from the ACME project, or pull an individual build result calling for ACME-ANVIL.

Expected behavior for this use case:

  • Using the project slug (--bamboo-slug ACME) returns three build status messages, one for each plan in ACME.
  • Using the plan slug (--bamboo-slug ACME-ANVIL) returns one build status message for the latest build of the ANVIL plan.

Observed behavior:

  • Using the project slug (--bamboo-slug ACME) returns only the first build plan result within it, even if it contains multiple plans.
  • Using the plan slug acts as it should. However, the API call needs to be changed (see below).

Cause:

The data normalization is returning only the first result of the call to the results API, rather than iterating over the entire result. This in and of itself is easy to fix, but it leads to a second issue: Once the entire result set is shown, the project shows all build status messages, but the plan shows 25 (the default) builds, which is also unhelpful. This is because the API being used currently works for both projects and plans.

Solution:

In all cases, the data normalization needs to be changed to iterate over the entire result object. But what should that object be?

The results API has many formats. ../result/ACME and ../result/ACME-ANVIL both return a similar data structure (returning 25 results.result objects), but take different qualifiers and parameters. In order to get all results for a project but only the latest result for a plan, a third call, ../result/ACME-ANVIL-latest, must be used. Its data structure is that of a single result object, which means the producer's behavior has to change slightly as well.

Windows compatibility

  • No executable being created - fixed since 10.1.0

The setup tools entry point approach has the benefit that on windows an .exe will be created that can be double clicked and invoked like a regular windows program

entry_points =
{
     'console_scripts':
     [
          'chroma-feedback = package.module:func',
     ]
}
  • Color codes and symbol (check is just a box) not working - fixed since 10.1.0
←[0;32m✔←[0m Build of redaxmedia/chroma-feedback on buddy passed
  • Update to fixed busylight version - related to JnyJny/busylight#56
  • Add is_windows() to busylight powered devices

Jenkins producer needs revision

  1. Test latest Jenkins via Docker
  2. Update to route /job/jobName/lastBuild/api/json
  3. Add patched unit testing to fulfill API contract

Keep alive feature

Once you run chroma-feedback as an service, it might exit once API is not accessible or no devices have been detected.

There should be an --keep-alive argument to bypass automated exiting.

Support for Philips Hue

This projects original goal is the support of Razer devices under Linux using openrazer.

It would be an easy task to implement Philips Hue support using phue ... I don't own Philips Hue devices at the moment, therefore I can't test my software against it and need a third party for testing.

There is an Bridge API Emulator for testing.

Take action

Please upvote this issue to let me know your interest in Philips Hue support or send a pull request.

Implementation guid

  1. Replace openrazer with phue for rapid prototyping
  2. Revert everything as we know it is working
  3. Add some api.py wrapper to handle both libraries
  4. Use the API wrapper inside device.py
  5. Import phue inside core.py
  6. Error handling and messages should be generalized

JSONDecodeError error using AppVeyor

The AppVeyor provider is not fail save as AppVeyor does not return the correct status codes.

Issue on the AppVeyor's side has been opened appveyor/website#424

Command

chroma-feedback --provider=appveyor --slug=invalid/invalid/invalid

Error

simplejson.scanner.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Retry for requests

Once the connection is lost via VPN or whatsoever, the request should recover from that an retry every 10 seconds.

None CI inputs

Hello,

I'm wondering if you would accept PR about none CI inputs ?
Here some example:

  • Desktop notifications (using dbus, like flashing if I got a new notification on my desktop)
  • Terminal plugins (ie Terminator plugin which could change the color of something if the current focused terminal is running a root user)
  • Color thresholds based on the number of emails
  • Any other idea ???

This is awesome

First off this is awesome, am annoyed I didn't think of it first ;-)

Just in case you wanted to expand to other devices, device.fx.has('static') will return true if it supports static, as some mice and devices dont always support the same thing sadly.

Its nice to see some good applications of the python library 😄

Do we need logo_{effect} and scroll_{effect} or is this included by {effect} call

@jqassar First of all, the OR you added have been rewritten to more readable conditions:

Commit: defffdd

def static_device(device : Any, state : Dict[str, Any]) -> bool:
	if device.has('brightness'):
		device.brightness = state['brightness'][0]
	if device.fx.has('logo_static'):
		return device.fx.misc.logo.static(state['rgb'][0], state['rgb'][1], state['rgb'][2])
	if device.fx.has('scroll_static'):
		return device.fx.misc.scroll_wheel.static(state['rgb'][0], state['rgb'][1], state['rgb'][2])
	if device.fx.has('static'):
		return device.fx.static(state['rgb'][0], state['rgb'][1], state['rgb'][2])
	return False

This brought me to the point that we properly just need the basic {effect} call as they properly contain the logo_{effect} and scroll_{effect}:

def static_device(device : Any, state : Dict[str, Any]) -> bool:
	if device.has('brightness'):
		device.brightness = state['brightness'][0]
	if device.fx.has('static'):
		return device.fx.static(state['rgb'][0], state['rgb'][1], state['rgb'][2])
	return False

I push this to the master - please test the code with your devices.

Commit: 617421d

Filter CircleCI pipelines to monitor my own pipelines

To fully fit my needs, I'd like to be able to only have the status of my own pipelines (we are a lot to trigger builds in my organization, and I don't really care if my colleague's build fails).

Luckily it seems very easy to implement so I can develop it if you want!

Would it be okay for you if I added a circle-only-mine=true|false parameter?

Need an image showing the feedback in action

The term capture in the README.md doesn't really show what this project does. As a matter of fact, I'm not certain what it does.

It would be good to add a photo/animated GIF of the keyboard, that matches what the terminal capture shows.

Improve Wiz Light integration

  • Use the get_bulbtype() for get_light_name() once the PR is merged
  • Remove hack to test connection in api.py

Related issue: sbidy/pywizlight#35 and sbidy/pywizlight#37

api = wizlight(ip, connect_on_init = True)
def get_light_name(light : Any) -> str:
	loop = asyncio.get_event_loop()
	bulb = loop.run_until_complete(light.get_bulbtype())
	return bulb.name

Modernize Travis Producer

  • Move chroma-feedback repository to travis.com
  • Add api.travis.com as the default url
  • Support for access token as of new API limitations (max retries are quite low)

Apple Silicon compatibility

There are issues installing latest Chroma Feedback > 10 that is using PyQt5 as there are no ARM wheels for PyQt5 present at the moment. There is no chance to work arround this using homebrew and pip with --no-deps flag.

 File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 126, in prepare_metadata_for_build_wheel
        hook = backend.prepare_metadata_for_build_wheel
    AttributeError: module 'sipbuild.api' has no attribute 'prepare_metadata_for_build_wheel'
    
    During handling of the above exception, another exception occurred:

That's why a pip install chroma-feedbackinstalls a Chroma Feedback 9.x.x release that does not contain all features.

Integrate PyQt5 library

  1. Replace the hacky and linux-only Appindicator3 systray
  2. Replace PIL and use QPixmap with QPainter
  3. Provide actions: Refresh, Start, Stop, Exit
  4. Add status icon next to each build
  5. Replace hacky os._exit with sys.exit and remove disabled protected-access in pylint
  6. Exit via CLI without waiting for the loop to be finished
  7. Combine the systray report and consumer report dicts by splitting them into status, message and prefix

POC

#!/usr/bin/env python3

import sys
from random import randint
from time import sleep

from PyQt5.QtCore import QTimer, Qt
from PyQt5.QtGui import QIcon, QPainter, QBrush, QPixmap, QColor
from PyQt5.QtWidgets import QApplication, QSystemTrayIcon, qApp, QMenu

SYSTRAY = None
TIMER = None


def create_icon(r, g, b) -> QIcon:
	pixmap = QPixmap(100, 100)
	pixmap.fill(Qt.transparent)
	painter = QPainter(pixmap)
	painter.setBrush(QBrush(QColor(r, g, b), Qt.SolidPattern))
	painter.drawEllipse(20, 20, 60, 60)
	painter.end()
	return QIcon(pixmap)


def create_menu(result = 0):
	global SYSTRAY

	menu = QMenu()
	resulticon = menu.addAction(str(result))
	changeicon = menu.addAction("Refresh (fire run)")
	starticon = menu.addAction("Start Timer")

	starticon.setIcon(create_icon(0, 255, 255))
	starticon.setIconVisibleInMenu(True)

	stopicon = menu.addAction("Stop Timer")
	exitAction = menu.addAction("Exit")

	changeicon.triggered.connect(run)
	starticon.triggered.connect(start_timer)
	stopicon.triggered.connect(stop_timer)
	exitAction.triggered.connect(qApp.quit)
	SYSTRAY.setContextMenu(menu)


def update_icon(result = 0):
	global SYSTRAY

	icon = create_icon(255, 0, 0)
	if result == 1:
		icon = create_icon(255, 0, 255)
	if result == 2:
		icon = create_icon(0, 255, 0)
	SYSTRAY.setIcon(QIcon(icon))
	

def refresh():
	global SYSTRAY

	SYSTRAY.hide()
	SYSTRAY.show()


def start_timer():
	global TIMER

	print('try to start timer')

	try:
		loop()
	except:
		print('could not start timer')


def stop_timer():
	global TIMER

	print('try to stop timer')

	try:
		if TIMER is not None:
			TIMER.stop()
		create_menu(99)
		update_icon(99)
		refresh()
	except:
		print('could not stop timer')



def init():
	global SYSTRAY

	app = QApplication(sys.argv)
	SYSTRAY = QSystemTrayIcon(QIcon(create_icon(255, 255, 255)))

	create_menu()
	update_icon()
	refresh()

	loop()

	SYSTRAY.show()
	sys.exit(app.exec_())


def loop():
	global TIMER

	TIMER = QTimer()
	TIMER.timeout.connect(run)
	TIMER.start(5000)


def run():
	print('doing heavy processing of stuff...')
	sleep(2)
	result = randint(1, 2)
	print('the result is: ' + str(result))
	create_menu(result)
	update_icon(result)
	refresh()

init()

Add producer: Terraform Cloud/Enterprise

Basic information:

  • Terraform Cloud accounts are free; you can make test scaffolding quite easily.
  • The API for Cloud and Enterprise is equivalent.
  • In TFC, an account has one or more organizations . Each organization has one or more workspaces. Each workspace can have one or more runs.
  • There isn't a 'slug' per se, but we can emulate one with the 'typical' format (org/workspace).
  • All API calls require a bearer token which you can generate from your account settings. The details of the headers to set are in the implementation. The token should be, at a minimum, available as an environment variable (TFE_TOKEN).

Build statuses:
There are many statuses in Terraform. Arranged in 'order' they look mostly like this:

		# Statuses with a '*' require manual intervention in TFE.
		'pending': 'process',				# Not running yet
		'plan-queued': 'process',			# Waiting to plan
		'planning': 'process',				# Checking infrastructure
		'canceled': 'failed',				# Run was cancelled
		'discarded': 'errored',				# Plan finished but was not applied
		'planned': 'process',				# Plan succeeded, needs approval *
		'planned-and-finished': 'passed',	# No changes, infrastructure OK
		'none': 'passed',					# Never run
		'cost-estimating': 'process',		# If you have it, TF estimates cost
		'cost-estimated': 'process', 		# of infrastructure.  Automatic...
		'policy-checking': 'process',		# Sentinel policies are run
		'policy-soft-failed': 'process', 	# A soft failure can be approved *
		'policy-override': 'process', 		# Applying over soft-fail policy
		'policy-checked': 'process', 		# Automatic, proceed to pre-apply
		'confirmed': 'process',				# Plan was confirmed, apply is next
		'apply-queued': 'process',			# Waiting to apply
		'applying': 'process',				# Apply in process
		'errored': 'failed',				# Apply had an error
		'applied': 'passed'					# Apply successful

Note the asterisked statuses. They are points which require manual intervention before proceeding (if the workspace is configured that way). Because of this, I feel it necessary to add another color/effect combination to reflect the 'Needs Confirmation' status this returns in the UI. This effect will be applied to the blink1/Razer Chroma consumers initially and is currently working.

API calls (taken from my implementation, so I'll remove the big docblock):

        # 
	# You can either query a workspace by id (ws-<hexstring>) or by org/ws name.
	# You can query an entire organization with just the orgname, as well.
        # 
	# 1) Single status: organizations/<organization>/workspaces/<workspace name>
	# 	- data.id - This is the workspace id (in ws-blahblah format)
	#       If you use ?include=current.run, you also get another tree:
	#       - included[0].attributes.status: <the status>
	#       Note that data holds a dict and included a list of dicts.
	#   2) Single status: workspaces/<ws-idstring>
        #     This returns the same data as 1 and is parsed equivalently.
        #     Since the caller passes in the ID, rather than return a name we call the slug 'org/ws-id...'
	#   3) Multiple status: organizations/<organization>/workspaces
	#	Here, getting every workspace status is a pain, because it
	#	paginates and the include only gives run IDs without the
	#	attached workspace.  They *do* correlate, however, with a
	#      list of attribute dicts and a list of included dicts, so we
	#	should be able to map 1:1 between:
	#	- data[n].attributes.name
	#      - included[n].attributes.status
	#	up to the pagination limit.
	#
	#	There is also a meta-information in the response which gives aggregate statuses.
	#	- meta.status-counts
        #      
        #     If we use this, we can see totals and parse, but chroma-feedback's output would only
        #     be a single line ('blah has status blah').

Tasks:

  • Add producer code
  • Add producer tests
  • Add alternate color combination for 'warning' status
  • Add ability to pass effect states to consumers (and optionally parse them)
  • Parse warning status in consumers

Razer Chroma consumer fails API call for failed status with certain devices

Background:

When testing chroma-feedback with various output devices, I was able to successfully test status notifications using both the blink1 consumer. However, with my particular device (the newer version of the Razer Mamba Wireless mouse), the Razer Chroma consumer has slightly inconsistent outputs.

(IMPORTANT DISCLAIMER: Making this mouse work requires a custom build of openrazer which adds the device, located here: openrazer/openrazer@master...crian:feature_mamba_wireless)

With the Bamboo producer (fixed version 7.0.1-beta), the behavior I expect is:

  • Plan slug (ACME-BUILD), successful status: Solid green logo and scroll wheel.
  • Plan slug (ACME-BUILD), failed status: Pulsing red logo and scroll wheel.
  • Project slug (ACME), successful status: Solid green logo and scroll wheel.
  • Project slug (ACME), failed status: Pulsing red logo and scroll wheel.

In all cases, chroma-feedback gives a message: 'Setting Razer Mamba Wireless (Wired) to build (status)'.

Instead, we get the following:

  • Plan slug (ACME-BUILD), successful status: Solid green logo and scroll wheel.
  • Plan slug (ACME-BUILD), failed status: No lighting change or message.
  • Project slug (ACME), successful status: Solid green logo and scroll wheel.
  • Project slug (ACME), failed status: No lighting change or message.

This is happening (I think) because different types of Razer mice have different effects support.
When the build status is marked as 'failed', the current API calls pulsate_device, which the mouse doesn't seem to fully support:

def pulsate_device(device : Any, state : Dict[str, Any]) -> bool:
	if device.has('brightness'):
		device.brightness = state['brightness'][0]
	if device.fx.has('logo') and device.fx.has('scroll'):
                # The new Mamba has logo and scroll, but can't pulsate:
		return device.fx.misc.logo.pulsate(state['rgb'][0], state['rgb'][1], state['rgb'][2]) and device.fx.misc.scroll_wheel.pulsate(state['rgb'][0], state['rgb'][1], state['rgb'][2])
	return device.fx.breath_single(state['rgb'][0], state['rgb'][1], state['rgb'][2])

We can see that the Mamba does have logo and scroll, but it doesn't support the pulsate method. This can be verified using the following command with a supported openrazer build:

python3 -c "from openrazer.client import DeviceManager; a = DeviceManager(); print(a.devices[0].fx.has('scroll'));a.devices[0].fx.misc.logo.pulsate(0,255,0)"
True (but no logo change)

While it would straightforward to just change the method to use breath_single, the problem is that not all mice support that either. According to the driver on the branch:

Mice which support breath effects: Lancehead TE, Mamba Chroma (wireless and wired), Mamba TE, Orochi Wired, Naga Hex V2, Naga Chroma, Deathadder Elite, Diamondback Chroma, Mamba Wireless Receiver (2019 Mamba), Mamba Wireless Wired (2019 Mamba), Deathadder Essential.

Mice which support pulsate effects: Deathadder Chroma, Deathadder 2013, Abyssus V2, Deathadder 3500.

There is no crossover between these capabilities, so the simplest fix may be to test whether the device supports each method and return the proper effect. Testing for the existence of a logo and scroll wheel is not sufficient, it seems.

Support for Corsair

This is the ckb daemon manuel that describes the following commands:

Get all devices:

cat /dev/input/ckb0/connected

Change color:

echo rgb ff0000 > /dev/input/ckb1/cmd

There is an emulator called FaKeyboard for ckb:

Installation:

git clone [email protected]:ckb-next/FaKeyboard.git
cd src
make

Usage:

./hid-keyboard 
sudo usbip attach -r 127.0.0.1 -b 1-1

Cross-Platform consumers

  • Add platform support flag inside each consumer
  • Add "is_mac" detection to helper
  • Show "consumer XXX not supported" error when using consumer that is not compatible

Unable to install it on macOS

I'm not sure you can do anything on this one, or that you actually want to support macOS, but I can't install Chroma Feedback on a M1 MacBook Pro.

Collecting chroma-feedback
  Using cached chroma_feedback-8.1.0-py3-none-any.whl
Collecting blink1==0.3.1
  Using cached blink1-0.3.1-py3-none-any.whl
Requirement already satisfied: pywizlight==0.4.2 in /opt/homebrew/lib/python3.9/site-packages (from chroma-feedback) (0.4.2)
Collecting asyncio==3.4.3
  Using cached asyncio-3.4.3-py3-none-any.whl (101 kB)
Requirement already satisfied: yeelight==0.5.1 in /opt/homebrew/lib/python3.9/site-packages (from chroma-feedback) (0.5.1)
Requirement already satisfied: python-magichue==0.2.8 in /opt/homebrew/lib/python3.9/site-packages (from chroma-feedback) (0.2.8)
Collecting lifxlan==1.2.5
  Using cached lifxlan-1.2.5-py3-none-any.whl
Collecting blinkstick==1.1.8
  Using cached BlinkStick-1.1.8-py3-none-any.whl
Collecting phue==1.1
  Using cached phue-1.1-py3-none-any.whl
Collecting pillow==7.0.0
  Using cached Pillow-7.0.0.tar.gz (38.2 MB)
Requirement already satisfied: requests==2.25.1 in /opt/homebrew/lib/python3.9/site-packages (from chroma-feedback) (2.25.1)
Collecting nanoleafapi==2.0.0
  Using cached nanoleafapi-2.0.0-py3-none-any.whl
Requirement already satisfied: hidapi>=0.7.99 in /opt/homebrew/lib/python3.9/site-packages (from blink1==0.3.1->chroma-feedback) (0.10.1)
Requirement already satisfied: click in /opt/homebrew/lib/python3.9/site-packages (from blink1==0.3.1->chroma-feedback) (7.1.2)
Requirement already satisfied: webcolors in /opt/homebrew/lib/python3.9/site-packages (from blink1==0.3.1->chroma-feedback) (1.11.1)
Requirement already satisfied: pyusb==1.0.0b1 in /opt/homebrew/lib/python3.9/site-packages (from blinkstick==1.1.8->chroma-feedback) (1.0.0b1)
Requirement already satisfied: netifaces in /opt/homebrew/lib/python3.9/site-packages (from lifxlan==1.2.5->chroma-feedback) (0.10.9)
Requirement already satisfied: bitstring in /opt/homebrew/lib/python3.9/site-packages (from lifxlan==1.2.5->chroma-feedback) (3.1.7)
Requirement already satisfied: sseclient in /opt/homebrew/lib/python3.9/site-packages (from nanoleafapi==2.0.0->chroma-feedback) (0.0.27)
Requirement already satisfied: asyncio-dgram in /opt/homebrew/lib/python3.9/site-packages (from pywizlight==0.4.2->chroma-feedback) (1.2.0)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/homebrew/lib/python3.9/site-packages (from requests==2.25.1->chroma-feedback) (1.26.3)
Requirement already satisfied: idna<3,>=2.5 in /opt/homebrew/lib/python3.9/site-packages (from requests==2.25.1->chroma-feedback) (2.10)
Requirement already satisfied: chardet<5,>=3.0.2 in /opt/homebrew/lib/python3.9/site-packages (from requests==2.25.1->chroma-feedback) (4.0.0)
Requirement already satisfied: certifi>=2017.4.17 in /opt/homebrew/lib/python3.9/site-packages (from requests==2.25.1->chroma-feedback) (2020.12.5)
Requirement already satisfied: enum-compat in /opt/homebrew/lib/python3.9/site-packages (from yeelight==0.5.1->chroma-feedback) (0.0.3)
Requirement already satisfied: future in /opt/homebrew/lib/python3.9/site-packages (from yeelight==0.5.1->chroma-feedback) (0.18.2)
Requirement already satisfied: setuptools>=19.0 in /opt/homebrew/lib/python3.9/site-packages (from hidapi>=0.7.99->blink1==0.3.1->chroma-feedback) (53.0.0)
Requirement already satisfied: six in /opt/homebrew/lib/python3.9/site-packages (from sseclient->nanoleafapi==2.0.0->chroma-feedback) (1.15.0)
Building wheels for collected packages: pillow
  Building wheel for pillow (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /opt/homebrew/opt/[email protected]/bin/python3.9 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-install-238vqadw/pillow_473b53d6d6304035a8a2f41bf14b42c2/setup.py'"'"'; __file__='"'"'/private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-install-238vqadw/pillow_473b53d6d6304035a8a2f41bf14b42c2/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-wheel-wtl6ki4a
       cwd: /private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-install-238vqadw/pillow_473b53d6d6304035a8a2f41bf14b42c2/
  Complete output (172 lines):
  running bdist_wheel
  running build
  running build_py
  creating build
  creating build/lib.macosx-11-arm64-3.9
  creating build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/MpoImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageMode.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/PngImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/XbmImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/PcxImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/SunImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageFile.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/SpiderImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/TarIO.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/FitsStubImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/MpegImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/BdfFontFile.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/GribStubImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageStat.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/PixarImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/GimpPaletteFile.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageColor.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ContainerIO.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/MspImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/MicImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/_version.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImtImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/GifImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/PalmImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageQt.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageMath.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/PaletteFile.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/FontFile.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/PdfParser.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ExifTags.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageCms.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/FpxImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageChops.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/BufrStubImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/PSDraw.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/PcdImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageFilter.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageDraw2.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImagePath.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/DcxImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/__init__.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/JpegPresets.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/Hdf5StubImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/features.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageDraw.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/GimpGradientFile.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageWin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/IcoImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/_tkinter_finder.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/EpsImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/TgaImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageMorph.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/Jpeg2KImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/WalImageFile.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/PcfFontFile.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/BlpImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageTk.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/GbrImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageOps.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/PdfImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageShow.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageEnhance.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/WmfImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageGrab.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/WebPImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/FliImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/TiffTags.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/CurImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/_util.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/GdImageFile.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/TiffImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/IptcImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImagePalette.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/BmpImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageTransform.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/IcnsImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/McIdasImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/XpmImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/DdsImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageSequence.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/PyAccess.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/_binary.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/Image.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/__main__.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/XVThumbImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/SgiImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/PsdImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/JpegImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/ImageFont.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/PpmImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  copying src/PIL/FtexImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
  running egg_info
  writing src/Pillow.egg-info/PKG-INFO
  writing dependency_links to src/Pillow.egg-info/dependency_links.txt
  writing top-level names to src/Pillow.egg-info/top_level.txt
  reading manifest file 'src/Pillow.egg-info/SOURCES.txt'
  reading manifest template 'MANIFEST.in'
  warning: no files found matching '*.c'
  warning: no files found matching '*.h'
  warning: no files found matching '*.sh'
  warning: no previously-included files found matching '.appveyor.yml'
  warning: no previously-included files found matching '.coveragerc'
  warning: no previously-included files found matching '.codecov.yml'
  warning: no previously-included files found matching '.editorconfig'
  warning: no previously-included files found matching '.readthedocs.yml'
  warning: no previously-included files found matching 'azure-pipelines.yml'
  warning: no previously-included files matching '.git*' found anywhere in distribution
  warning: no previously-included files matching '*.pyc' found anywhere in distribution
  warning: no previously-included files matching '*.so' found anywhere in distribution
  no previously-included directories found matching '.azure-pipelines'
  no previously-included directories found matching '.travis'
  writing manifest file 'src/Pillow.egg-info/SOURCES.txt'
  running build_ext


  The headers or library files could not be found for zlib,
  a required dependency when compiling Pillow from source.

  Please see the install instructions at:
     https://pillow.readthedocs.io/en/latest/installation.html

  Traceback (most recent call last):
    File "/private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-install-238vqadw/pillow_473b53d6d6304035a8a2f41bf14b42c2/setup.py", line 852, in <module>
      setup(
    File "/opt/homebrew/lib/python3.9/site-packages/setuptools/__init__.py", line 153, in setup
      return distutils.core.setup(**attrs)
    File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/core.py", line 148, in setup
      dist.run_commands()
    File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/dist.py", line 966, in run_commands
      self.run_command(cmd)
    File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/dist.py", line 985, in run_command
      cmd_obj.run()
    File "/opt/homebrew/lib/python3.9/site-packages/wheel/bdist_wheel.py", line 299, in run
      self.run_command('build')
    File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/cmd.py", line 313, in run_command
      self.distribution.run_command(command)
    File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/dist.py", line 985, in run_command
      cmd_obj.run()
    File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/command/build.py", line 135, in run
      self.run_command(cmd_name)
    File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/cmd.py", line 313, in run_command
      self.distribution.run_command(command)
    File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/dist.py", line 985, in run_command
      cmd_obj.run()
    File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/command/build_ext.py", line 340, in run
      self.build_extensions()
    File "/private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-install-238vqadw/pillow_473b53d6d6304035a8a2f41bf14b42c2/setup.py", line 687, in build_extensions
      raise RequiredDependencyException(f)
  __main__.RequiredDependencyException: zlib

  During handling of the above exception, another exception occurred:

  Traceback (most recent call last):
    File "<string>", line 1, in <module>
    File "/private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-install-238vqadw/pillow_473b53d6d6304035a8a2f41bf14b42c2/setup.py", line 907, in <module>
      raise RequiredDependencyException(msg)
  __main__.RequiredDependencyException:

  The headers or library files could not be found for zlib,
  a required dependency when compiling Pillow from source.

  Please see the install instructions at:
     https://pillow.readthedocs.io/en/latest/installation.html


  ----------------------------------------
  ERROR: Failed building wheel for pillow
  Running setup.py clean for pillow
Failed to build pillow
Installing collected packages: pillow, phue, nanoleafapi, lifxlan, blinkstick, blink1, asyncio, chroma-feedback
  Attempting uninstall: pillow
    Found existing installation: Pillow 8.1.2
    Uninstalling Pillow-8.1.2:
      Successfully uninstalled Pillow-8.1.2
    Running setup.py install for pillow ... error
    ERROR: Command errored out with exit status 1:
     command: /opt/homebrew/opt/[email protected]/bin/python3.9 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-install-238vqadw/pillow_473b53d6d6304035a8a2f41bf14b42c2/setup.py'"'"'; __file__='"'"'/private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-install-238vqadw/pillow_473b53d6d6304035a8a2f41bf14b42c2/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-record-7pqpd6ju/install-record.txt --single-version-externally-managed --compile --install-headers /opt/homebrew/include/python3.9/pillow
         cwd: /private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-install-238vqadw/pillow_473b53d6d6304035a8a2f41bf14b42c2/
    Complete output (174 lines):
    running install
    running build
    running build_py
    creating build
    creating build/lib.macosx-11-arm64-3.9
    creating build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/MpoImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageMode.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/PngImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/XbmImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/PcxImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/SunImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageFile.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/SpiderImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/TarIO.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/FitsStubImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/MpegImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/BdfFontFile.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/GribStubImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageStat.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/PixarImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/GimpPaletteFile.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageColor.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ContainerIO.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/MspImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/MicImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/_version.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImtImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/GifImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/PalmImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageQt.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageMath.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/PaletteFile.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/FontFile.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/PdfParser.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ExifTags.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageCms.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/FpxImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageChops.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/BufrStubImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/PSDraw.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/PcdImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageFilter.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageDraw2.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImagePath.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/DcxImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/__init__.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/JpegPresets.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/Hdf5StubImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/features.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageDraw.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/GimpGradientFile.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageWin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/IcoImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/_tkinter_finder.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/EpsImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/TgaImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageMorph.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/Jpeg2KImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/WalImageFile.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/PcfFontFile.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/BlpImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageTk.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/GbrImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageOps.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/PdfImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageShow.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageEnhance.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/WmfImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageGrab.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/WebPImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/FliImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/TiffTags.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/CurImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/_util.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/GdImageFile.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/TiffImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/IptcImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImagePalette.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/BmpImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageTransform.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/IcnsImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/McIdasImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/XpmImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/DdsImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageSequence.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/PyAccess.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/_binary.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/Image.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/__main__.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/XVThumbImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/SgiImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/PsdImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/JpegImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/ImageFont.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/PpmImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    copying src/PIL/FtexImagePlugin.py -> build/lib.macosx-11-arm64-3.9/PIL
    running egg_info
    writing src/Pillow.egg-info/PKG-INFO
    writing dependency_links to src/Pillow.egg-info/dependency_links.txt
    writing top-level names to src/Pillow.egg-info/top_level.txt
    reading manifest file 'src/Pillow.egg-info/SOURCES.txt'
    reading manifest template 'MANIFEST.in'
    warning: no files found matching '*.c'
    warning: no files found matching '*.h'
    warning: no files found matching '*.sh'
    warning: no previously-included files found matching '.appveyor.yml'
    warning: no previously-included files found matching '.coveragerc'
    warning: no previously-included files found matching '.codecov.yml'
    warning: no previously-included files found matching '.editorconfig'
    warning: no previously-included files found matching '.readthedocs.yml'
    warning: no previously-included files found matching 'azure-pipelines.yml'
    warning: no previously-included files matching '.git*' found anywhere in distribution
    warning: no previously-included files matching '*.pyc' found anywhere in distribution
    warning: no previously-included files matching '*.so' found anywhere in distribution
    no previously-included directories found matching '.azure-pipelines'
    no previously-included directories found matching '.travis'
    writing manifest file 'src/Pillow.egg-info/SOURCES.txt'
    running build_ext


    The headers or library files could not be found for zlib,
    a required dependency when compiling Pillow from source.

    Please see the install instructions at:
       https://pillow.readthedocs.io/en/latest/installation.html

    Traceback (most recent call last):
      File "/private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-install-238vqadw/pillow_473b53d6d6304035a8a2f41bf14b42c2/setup.py", line 852, in <module>
        setup(
      File "/opt/homebrew/lib/python3.9/site-packages/setuptools/__init__.py", line 153, in setup
        return distutils.core.setup(**attrs)
      File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/core.py", line 148, in setup
        dist.run_commands()
      File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/dist.py", line 966, in run_commands
        self.run_command(cmd)
      File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/dist.py", line 985, in run_command
        cmd_obj.run()
      File "/opt/homebrew/lib/python3.9/site-packages/setuptools/command/install.py", line 61, in run
        return orig.install.run(self)
      File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/command/install.py", line 546, in run
        self.run_command('build')
      File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/cmd.py", line 313, in run_command
        self.distribution.run_command(command)
      File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/dist.py", line 985, in run_command
        cmd_obj.run()
      File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/command/build.py", line 135, in run
        self.run_command(cmd_name)
      File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/cmd.py", line 313, in run_command
        self.distribution.run_command(command)
      File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/dist.py", line 985, in run_command
        cmd_obj.run()
      File "/opt/homebrew/Cellar/[email protected]/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/command/build_ext.py", line 340, in run
        self.build_extensions()
      File "/private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-install-238vqadw/pillow_473b53d6d6304035a8a2f41bf14b42c2/setup.py", line 687, in build_extensions
        raise RequiredDependencyException(f)
    __main__.RequiredDependencyException: zlib

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-install-238vqadw/pillow_473b53d6d6304035a8a2f41bf14b42c2/setup.py", line 907, in <module>
        raise RequiredDependencyException(msg)
    __main__.RequiredDependencyException:

    The headers or library files could not be found for zlib,
    a required dependency when compiling Pillow from source.

    Please see the install instructions at:
       https://pillow.readthedocs.io/en/latest/installation.html


    ----------------------------------------
  Rolling back uninstall of Pillow
  Moving to /opt/homebrew/lib/python3.9/site-packages/PIL/
   from /opt/homebrew/lib/python3.9/site-packages/~IL
  Moving to /opt/homebrew/lib/python3.9/site-packages/Pillow-8.1.2.dist-info/
   from /opt/homebrew/lib/python3.9/site-packages/~illow-8.1.2.dist-info
ERROR: Command errored out with exit status 1: /opt/homebrew/opt/[email protected]/bin/python3.9 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-install-238vqadw/pillow_473b53d6d6304035a8a2f41bf14b42c2/setup.py'"'"'; __file__='"'"'/private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-install-238vqadw/pillow_473b53d6d6304035a8a2f41bf14b42c2/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/q2/yss7dvv1487gs_jwj90shgnh0000gn/T/pip-record-7pqpd6ju/install-record.txt --single-version-externally-managed --compile --install-headers /opt/homebrew/include/python3.9/pillow Check the logs for full command output.

I checked Pillow installation and everything seems fine :

python3 -m pip install --upgrade Pillow
Requirement already satisfied: Pillow in /opt/homebrew/lib/python3.9/site-packages (8.1.2)

Add local / bridge producer

Let's introduce a local bridge so everyone can build a API locally that is being requested.

API should be so perfect that a normalize is not needed..

Add Buddy CI producer

Buddy offers reliable deployments with build tools and execution scripts. Buddy lets you build apps and run deployments with no risk of breakdown. Lightning speed. MySQL, Redis, MongoDB. Website monitoring. Unit & integration tests. Simple setup.

  1. Authentication

https://buddy.works/docs/api/getting-started/oauth2/introduction

  1. List pipelines of a project and pick the latest

https://buddy.works/docs/api/pipelines/create-manage-pipelines/list-pipelines

  1. List pipeline by id and pick the status

https://buddy.works/docs/api/pipelines/executions/list

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.