A working Flask app
							parent
							
								
									1e7fa3310a
								
							
						
					
					
						commit
						4d955389bc
					
				@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					# https://github.com/bazelbuild/rules_python#Migrating-from-the-bundled-rules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# We will use the future interface for Python Rules in Bazel I am not focusing on
 | 
				
			||||||
 | 
					# a hermetic build yet.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					http_archive(
 | 
				
			||||||
 | 
					    name = "rules_python",
 | 
				
			||||||
 | 
					    sha256 = "9fcf91dbcc31fde6d1edb15f117246d912c33c36f44cf681976bd886538deba6",
 | 
				
			||||||
 | 
					    strip_prefix = "rules_python-0.8.0",
 | 
				
			||||||
 | 
					    url = "https://github.com/bazelbuild/rules_python/archive/refs/tags/0.8.0.tar.gz",
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# PIP STUFFS https://github.com/bazelbuild/rules_python#using-the-packaging-rules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					load("@rules_python//python:pip.bzl", "pip_install")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Create a central external repo, @my_deps, that contains Bazel targets for all the
 | 
				
			||||||
 | 
					# third-party packages specified in the requirements.txt file.
 | 
				
			||||||
 | 
					pip_install(
 | 
				
			||||||
 | 
					    name = "my_py_app_deps",
 | 
				
			||||||
 | 
					    requirements = "//third_party_py:requirements.txt",
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					#import <stdio.h>
 | 
				
			||||||
 | 
					int main()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    char name[10] = "Laura";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    printf("Hello %s!\n", name);
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					genrule(
 | 
				
			||||||
 | 
					    name = "foo",
 | 
				
			||||||
 | 
					    srcs = [],
 | 
				
			||||||
 | 
					    outs = ["foo.txt"],
 | 
				
			||||||
 | 
					    cmd = "sleep 3 && echo 'Hello Bazel!' > $@ ",
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# This is a comment?
 | 
				
			||||||
 | 
					genrule(
 | 
				
			||||||
 | 
					    name = "bar",
 | 
				
			||||||
 | 
					    srcs = [],
 | 
				
			||||||
 | 
					    outs = ["bar.txt"],
 | 
				
			||||||
 | 
					    cmd = "printenv > $@ ",
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					Just an example of a Rule producing a file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					https://bazel.build/reference/be/general#genrule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					See also: https://bazel.build/reference/be/make-variables
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					bazel build //gen_package:foo
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					bazel build //gen_package:foo
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					This entire workspace should be ignored by the workspace at this git repo root.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This means this entire tree can be committed to our version control system without it and it's containing packages from being reviewed by the workspace in the repo root.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					As far as I can tell if you want to use this sub workspace you have to cd to this dir.
 | 
				
			||||||
@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					# Load Deps
 | 
				
			||||||
 | 
					load("@my_py_app_deps//:requirements.bzl", "requirement")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					py_binary(
 | 
				
			||||||
 | 
					    name = "main",
 | 
				
			||||||
 | 
					    srcs = ["main.py"],
 | 
				
			||||||
 | 
					    deps = [
 | 
				
			||||||
 | 
					        "//py_project:calculator",
 | 
				
			||||||
 | 
					        requirement("Flask"),
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					This app is a simple flask application. It specifies Flask as a dependency which is provided in the `third_party_py` package at the root of our workspace. We also rely on `py_project:calculator` target. This is possible because we have set the visibility for this project `py_library` to public.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In the `WORKSPACE` file we have specified an `external` repo called `my_py_app_deps` this is where all of our pip installed libs
 | 
				
			||||||
 | 
					will be downloaded, and converted into Bazel packages automatically.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					drewbednar@MacBook-Pro learn_bazel % ls ./bazel-learn_bazel/external/my_py_app_deps
 | 
				
			||||||
 | 
					BUILD.bazel              pypi__click              pypi__itsdangerous       pypi__werkzeug
 | 
				
			||||||
 | 
					WORKSPACE                pypi__flask              pypi__jinja2             pypi__zipp
 | 
				
			||||||
 | 
					annotations.json         pypi__importlib_metadata pypi__markupsafe         requirements.bzl
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Executing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can run the built Flask app with:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					FLASK_ENV="development" bazel run my_py_app:main
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					from flask import Flask
 | 
				
			||||||
 | 
					from random import randint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from py_project.calculator import Calculator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app = Flask(__name__)
 | 
				
			||||||
 | 
					my_calculator = Calculator()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@app.route("/")
 | 
				
			||||||
 | 
					def index():
 | 
				
			||||||
 | 
					    num1 = randint(0, 100)
 | 
				
			||||||
 | 
					    num2 = randint(0, 100)
 | 
				
			||||||
 | 
					    _sum = my_calculator.add(num1, num2)
 | 
				
			||||||
 | 
					    message = f" {num1} + {num2} = {_sum}"
 | 
				
			||||||
 | 
					    return message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 | 
					    app.run()
 | 
				
			||||||
@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					py_library(
 | 
				
			||||||
 | 
					    name = "calculator",
 | 
				
			||||||
 | 
					    srcs = ["calculator.py"],
 | 
				
			||||||
 | 
					    # visibility
 | 
				
			||||||
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					py_test(
 | 
				
			||||||
 | 
					    name = "calculator_test",
 | 
				
			||||||
 | 
					    srcs = ["calculator_test.py"],
 | 
				
			||||||
 | 
					    deps = [
 | 
				
			||||||
 | 
					        # These are dependencies spelled out as targets?
 | 
				
			||||||
 | 
					        "//py_project:calculator",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					# Pyproject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This package gives us two targets `calculator` and `calculator_test`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Tests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					bazel test py_project/...
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					class Calculator:
 | 
				
			||||||
 | 
					    def add(self, x, y):
 | 
				
			||||||
 | 
					        return x+y
 | 
				
			||||||
@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					from calendar import c
 | 
				
			||||||
 | 
					import unittest
 | 
				
			||||||
 | 
					from py_project.calculator import Calculator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestCalculator(unittest.TestCase):
 | 
				
			||||||
 | 
					    def test_sum(self):
 | 
				
			||||||
 | 
					        calc = Calculator()
 | 
				
			||||||
 | 
					        self.assertEqual(calc.add(3, 4), 7)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # def test_sub(self):
 | 
				
			||||||
 | 
					    #     calc = Calculator()
 | 
				
			||||||
 | 
					    #     self.assertEqual(calc.sub(4, 2), 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 | 
					    unittest.main()
 | 
				
			||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					Flask==2.1.1
 | 
				
			||||||
					Loading…
					
					
				
		Reference in New Issue