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