From 3626bf12f284745da5381c523ad666132e843490 Mon Sep 17 00:00:00 2001 From: Stefan Krawczyk Date: Sun, 28 Dec 2025 20:07:45 +1100 Subject: [PATCH 1/5] Adds apache 2 headers to files under /examples Adds script to check for them and then add then insert them. --- examples/Dockerfile | 17 + examples/LLM_Workflows/GraphRAG/README.md | 19 ++ .../LLM_Workflows/GraphRAG/application.py | 17 + .../LLM_Workflows/GraphRAG/graph_schema.py | 17 + .../LLM_Workflows/GraphRAG/hamilton_ingest.py | 17 + .../LLM_Workflows/GraphRAG/ingest_fighters.py | 17 + .../LLM_Workflows/GraphRAG/ingest_fights.py | 17 + .../GraphRAG/ingest_notebook.ipynb | 7 + .../LLM_Workflows/GraphRAG/notebook.ipynb | 7 + examples/LLM_Workflows/GraphRAG/utils.py | 17 + examples/LLM_Workflows/NER_Example/README.md | 19 ++ .../NER_Example/lancedb_module.py | 17 + .../NER_Example/ner_extraction.py | 17 + .../LLM_Workflows/NER_Example/notebook.ipynb | 7 + examples/LLM_Workflows/NER_Example/run.py | 17 + .../README.md | 19 ++ .../pipeline.py | 17 + .../simple_pipeline.ipynb | 7 + examples/LLM_Workflows/README.md | 19 ++ .../LLM_Workflows/image_telephone/README.md | 19 ++ .../LLM_Workflows/image_telephone/adapters.py | 17 + .../image_telephone/application.py | 17 + .../image_telephone/notebook.ipynb | 7 + .../image_telephone/streamlit.py | 17 + .../knowledge_retrieval/README.md | 19 ++ .../knowledge_retrieval/arxiv_articles.py | 17 + .../knowledge_retrieval/functions.py | 17 + .../knowledge_retrieval/state.py | 17 + .../knowledge_retrieval/summarize_text.py | 17 + .../langchain_comparison/README.md | 19 ++ .../hamilton_anthropic.py | 17 + .../langchain_comparison/hamilton_async.py | 17 + .../langchain_comparison/hamilton_batch.py | 17 + .../hamilton_completion.py | 17 + .../hamilton_fallbacks.py | 17 + .../langchain_comparison/hamilton_invoke.py | 17 + .../langchain_comparison/hamilton_logging.py | 17 + .../langchain_comparison/hamilton_streamed.py | 17 + .../langchain_comparison/lcel_anthropic.py | 17 + .../langchain_comparison/lcel_async.py | 17 + .../langchain_comparison/lcel_batch.py | 17 + .../langchain_comparison/lcel_completion.py | 17 + .../langchain_comparison/lcel_fallbacks.py | 17 + .../langchain_comparison/lcel_invoke.py | 17 + .../langchain_comparison/lcel_logging.py | 17 + .../langchain_comparison/lcel_streamed.py | 17 + .../langchain_comparison/vanilla_anthropic.py | 17 + .../langchain_comparison/vanilla_async.py | 17 + .../langchain_comparison/vanilla_batch.py | 17 + .../vanilla_completion.py | 17 + .../langchain_comparison/vanilla_fallbacks.py | 17 + .../langchain_comparison/vanilla_invoke.py | 17 + .../langchain_comparison/vanilla_logging.py | 17 + .../langchain_comparison/vanilla_streamed.py | 17 + .../llm_logging/summarization.py | 17 + .../LLM_Workflows/modular_llm_stack/README.md | 19 ++ .../modular_llm_stack/data_module.py | 17 + .../modular_llm_stack/embedding_module.py | 17 + .../modular_llm_stack/lancedb_module.py | 17 + .../modular_llm_stack/marqo_module.py | 17 + .../modular_llm_stack/pinecone_module.py | 17 + .../modular_llm_stack/qdrant_module.py | 17 + .../LLM_Workflows/modular_llm_stack/run.py | 17 + .../modular_llm_stack/weaviate_module.py | 17 + .../observability_openllmetry/README.md | 19 ++ .../observability_openllmetry/notebook.ipynb | 7 + .../observability_openllmetry/run.py | 17 + .../LLM_Workflows/pdf_summarizer/README.md | 19 ++ .../pdf_summarizer/backend/Dockerfile | 17 + .../backend/parallel_summarization.py | 17 + .../pdf_summarizer/backend/server.py | 17 + .../pdf_summarizer/backend/summarization.py | 17 + .../pdf_summarizer/frontend/Dockerfile | 17 + .../pdf_summarizer/frontend/app.py | 17 + .../pdf_summarizer/run_on_spark/README.md | 19 ++ .../pdf_summarizer/run_on_spark/run.ipynb | 7 + .../pdf_summarizer/run_on_spark/run.py | 17 + .../run_on_spark/run_with_columns.py | 17 + .../run_on_spark/spark_pdf_pipeline.py | 17 + .../run_on_spark/summarization.py | 17 + .../retrieval_augmented_generation/README.md | 19 ++ .../backend/Dockerfile | 17 + .../backend/ingestion.py | 17 + .../backend/retrieval.py | 17 + .../backend/server.py | 17 + .../backend/vector_db.py | 17 + .../build_app.sh | 17 + .../frontend/Dockerfile | 17 + .../frontend/Information.py | 17 + .../frontend/client.py | 17 + .../frontend/pages/1_Ingestion.py | 17 + .../frontend/pages/2_Retrieval.py | 17 + .../scraping_and_chunking/README.md | 19 ++ .../scraping_and_chunking/doc_pipeline.py | 17 + .../scraping_and_chunking/notebook.ipynb | 7 + .../scraping_and_chunking/run.py | 17 + .../scraping_and_chunking/run_dask.py | 17 + .../scraping_and_chunking/run_ray.py | 17 + .../scraping_and_chunking/spark/README.md | 19 ++ .../spark/doc_pipeline.py | 17 + .../spark/notebook.ipynb | 7 + .../spark/spark_pipeline.py | 17 + examples/README.md | 19 ++ examples/airflow/Dockerfile | 17 + examples/airflow/README.md | 19 ++ .../hamilton/absenteeism_prediction_dag.py | 17 + .../dags/hamilton/hamilton_how_to_dag.py | 17 + .../plugins/absenteeism/evaluate_model.py | 17 + .../plugins/absenteeism/prepare_data.py | 17 + .../plugins/absenteeism/train_model.py | 17 + .../plugins/function_modules/data_loaders.py | 17 + .../plugins/function_modules/feature_logic.py | 17 + examples/async/README.md | 19 ++ examples/async/async_module.py | 17 + examples/async/fastapi_example.py | 17 + examples/aws/glue/README.md | 19 ++ .../glue/app/hamilton_functions/functions.py | 17 + examples/aws/glue/app/setup.py | 17 + examples/aws/glue/processing.py | 17 + examples/aws/lambda/Dockerfile | 17 + examples/aws/lambda/README.md | 19 ++ examples/aws/lambda/app/functions.py | 17 + examples/aws/lambda/app/lambda_handler.py | 17 + examples/aws/sagemaker/README.md | 19 ++ examples/aws/sagemaker/app/functions.py | 17 + examples/aws/sagemaker/container/Dockerfile | 17 + examples/aws/sagemaker/notebook.ipynb | 7 + examples/aws/sagemaker/processing.py | 17 + examples/caching/README.md | 19 ++ examples/caching/in_memory_tutorial.ipynb | 7 + examples/caching/materializer_tutorial.ipynb | 7 + examples/caching/tutorial.ipynb | 7 + examples/caching_nodes/README.md | 19 ++ examples/caching_nodes/caching.ipynb | 7 + .../caching_graph_adapter/README.md | 19 ++ .../caching_graph_adapter/business_logic.py | 17 + .../caching_graph_adapter/caching_nodes.ipynb | 7 + .../caching_graph_adapter/data_loaders.py | 17 + .../caching_graph_adapter/run.py | 17 + .../caching_nodes/diskcache_adapter/README.md | 19 ++ .../diskcache_adapter/functions.py | 18 ++ .../diskcache_adapter/notebook.ipynb | 7 + .../caching_nodes/diskcache_adapter/run.py | 17 + examples/cli/DOCS.md | 19 ++ examples/cli/README.md | 19 ++ examples/cli/config.py | 17 + examples/cli/example_script.py | 17 + examples/cli/module_v1.py | 17 + examples/cli/watcher.py | 17 + examples/contrib/README.md | 19 ++ examples/contrib/notebook.ipynb | 7 + .../dagworks-translate_to_hamilton.ipynb | 7 + examples/contrib/run.py | 17 + examples/dagster/README.md | 19 ++ examples/dagster/dagster_code/README.md | 19 ++ examples/dagster/dagster_code/setup.py | 17 + .../dagster/dagster_code/tutorial/assets.py | 17 + examples/dagster/hamilton_code/README.md | 19 ++ examples/dagster/hamilton_code/dataflow.py | 17 + examples/dagster/hamilton_code/mock_api.py | 17 + examples/dagster/hamilton_code/notebook.ipynb | 7 + examples/dagster/hamilton_code/run.py | 17 + examples/dask/README.md | 19 ++ examples/dask/community_demo/README.md | 19 ++ .../community_demo/demo_day_notebook.ipynb | 7 + examples/dask/community_demo/my_functions.py | 17 + examples/dask/hello_world/README.md | 19 ++ examples/dask/hello_world/data_loaders.py | 17 + examples/dask/hello_world/notebook.ipynb | 7 + examples/dask/hello_world/run.py | 17 + examples/dask/hello_world/run_with_delayed.py | 17 + .../run_with_delayed_and_dask_objects.py | 17 + examples/data_loaders/README.md | 19 ++ examples/data_loaders/data_loaders.ipynb | 7 + examples/data_loaders/load_data_csv.py | 17 + examples/data_loaders/load_data_duckdb.py | 17 + examples/data_loaders/load_data_mock.py | 17 + examples/data_loaders/prep_data.py | 17 + examples/data_loaders/run.py | 17 + examples/data_quality/pandera/README.md | 19 ++ examples/data_quality/pandera/data_loaders.py | 17 + .../data_quality/pandera/feature_logic.py | 17 + .../pandera/feature_logic_spark.py | 17 + examples/data_quality/pandera/run.py | 17 + examples/data_quality/pandera/run_dask.py | 17 + examples/data_quality/pandera/run_ray.py | 17 + examples/data_quality/pandera/run_spark.py | 17 + examples/data_quality/simple/README.md | 19 ++ examples/data_quality/simple/data_loaders.py | 17 + examples/data_quality/simple/feature_logic.py | 17 + examples/data_quality/simple/run.py | 17 + examples/data_quality/simple/run_dask.py | 17 + examples/data_quality/simple/run_ray.py | 17 + examples/data_quality/simple/run_spark.py | 17 + examples/dbt/README.md | 19 ++ examples/dbt/models/raw_passengers.sql | 17 + examples/dbt/models/train_and_infer.py | 17 + examples/dbt/python_transforms/data_loader.py | 17 + .../python_transforms/feature_transforms.py | 17 + .../dbt/python_transforms/model_pipeline.py | 17 + examples/decoupling_io/README.md | 19 ++ examples/decoupling_io/adapters.py | 17 + .../decoupling_io/components/feature_data.py | 17 + .../components/model_evaluation.py | 17 + .../components/model_training.py | 17 + examples/decoupling_io/run.py | 17 + examples/dlt/README.md | 19 ++ examples/dlt/dlt_plugin.ipynb | 7 + examples/dlt/notebook.ipynb | 7 + examples/dlt/run.py | 17 + examples/dlt/slack/README.md | 19 ++ examples/dlt/slack/helpers.py | 17 + examples/dlt/slack/settings.py | 17 + examples/dlt/transform.py | 17 + examples/due_date_probabilities/README.md | 19 ++ examples/due_date_probabilities/base_dates.py | 17 + .../due_date_probabilities/notebook.ipynb | 7 + .../due_date_probabilities/probabilities.py | 17 + .../probability_estimation.py | 17 + examples/experiment_management/README.md | 19 ++ examples/experiment_management/analysis.py | 17 + examples/experiment_management/notebook.ipynb | 7 + examples/experiment_management/run.py | 17 + examples/feast/README.md | 19 ++ .../feast/default_feature_store/README.md | 19 ++ .../feature_repo/example_repo.py | 17 + .../feature_repo/test_workflow.py | 17 + .../feature_repo/demo_inputs.py | 17 + .../feature_repo/feature_transformations.py | 17 + .../feature_repo/retrieval.ipynb | 7 + .../feature_repo/run.py | 17 + .../feature_repo/store_definitions.py | 17 + .../feature_repo/store_operations.py | 17 + .../feature_repo/demo_inputs.py | 17 + .../simple_feature_store/feature_repo/run.py | 17 + .../feature_repo/store_definitions.py | 17 + .../feature_repo/store_operations.py | 17 + examples/feature_engineering/README.md | 19 ++ .../README.md | 19 ++ .../scenario_1/README.md | 19 ++ .../scenario_1/etl.py | 17 + .../scenario_1/fastapi_server.py | 17 + .../scenario_1/features.py | 17 + .../scenario_1/named_model_feature_sets.py | 17 + .../scenario_1/offline_loader.py | 17 + .../scenario_2/README.md | 19 ++ .../scenario_2/etl.py | 17 + .../scenario_2/fastapi_server.py | 17 + .../scenario_2/features.py | 17 + .../scenario_2/named_model_feature_sets.py | 17 + .../scenario_2/offline_loader.py | 17 + .../scenario_2/online_loader.py | 17 + .../README.md | 19 ++ .../components/aggregations.py | 17 + .../components/data_loaders.py | 17 + .../components/features.py | 17 + .../components/joins.py | 17 + .../components/model.py | 17 + .../components/utils.py | 17 + .../contexts/batch.py | 17 + .../contexts/online.py | 17 + .../contexts/streaming.py | 17 + .../mpg-translation/MPGSimple.ipynb | 7 + .../MPGSimpleAdvancedTarget.ipynb | 7 + .../mpg-translation/MPGSimpleTarget.ipynb | 7 + .../ProceduralMPGNotebook.ipynb | 7 + .../mpg-translation/README.md | 19 ++ .../mpg-translation/mpg_pipeline.py | 17 + .../mpg_pipeline_advanced_target.py | 17 + .../mpg-translation/mpg_pipeline_target.py | 17 + .../mpg-translation/mpg_script.py | 17 + examples/hamilton_ui/README.md | 19 ++ .../components/feature_transforms.py | 17 + .../hamilton_ui/components/iris_loader.py | 17 + .../hamilton_ui/components/model_fitting.py | 17 + examples/hamilton_ui/components/models.py | 17 + examples/hamilton_ui/notebook.ipynb | 7 + examples/hamilton_ui/run.py | 17 + examples/hello_world/README.md | 19 ++ examples/hello_world/my_dag.png | Bin 68544 -> 63764 bytes examples/hello_world/my_functions.py | 17 + examples/hello_world/my_notebook.ipynb | 7 + examples/hello_world/my_script.py | 17 + examples/ibis/feature_engineering/README.md | 19 ++ .../feature_engineering/column_dataflow.py | 17 + examples/ibis/feature_engineering/run.py | 17 + .../feature_engineering/table_dataflow.py | 17 + examples/ibis/jaffle_shop/README.md | 19 ++ .../jaffle_shop/dataflows/customer_flow.py | 17 + .../ibis/jaffle_shop/dataflows/order_flow.py | 17 + .../ibis/jaffle_shop/dataflows/staging.py | 17 + examples/ibis/jaffle_shop/run.py | 17 + examples/ibisml/README.md | 19 ++ examples/ibisml/model_training.py | 17 + examples/ibisml/run.py | 17 + examples/ibisml/table_dataflow.py | 17 + examples/jupyter_notebook_magic/README.md | 19 ++ examples/jupyter_notebook_magic/example.ipynb | 11 +- examples/kedro/README.md | 19 ++ examples/kedro/hamilton-code/README.md | 19 ++ .../hamilton-code/notebooks/interactive.ipynb | 7 + .../src/hamilton_code/data_processing.py | 17 + .../src/hamilton_code/data_science.py | 17 + .../hamilton-code/src/hamilton_code/run.py | 17 + .../hamilton-code/tests/test_dataflow.py | 17 + examples/kedro/kedro-code/README.md | 19 ++ examples/kedro/kedro-code/conf/README.md | 19 ++ .../kedro-code/src/kedro_code/__main__.py | 17 + .../src/kedro_code/pipeline_registry.py | 17 + .../pipelines/data_processing/nodes.py | 17 + .../pipelines/data_processing/pipeline.py | 17 + .../pipelines/data_science/nodes.py | 17 + .../pipelines/data_science/pipeline.py | 17 + .../kedro-code/src/kedro_code/settings.py | 17 + .../pipelines/data_science/test_pipeline.py | 17 + examples/kedro/kedro-code/tests/test_run.py | 17 + examples/kedro/kedro-plugin/README.md | 19 ++ .../kedro-plugin/kedro_to_hamilton.ipynb | 261 +++++++-------- examples/lineage/README.md | 19 ++ examples/lineage/data_loading.py | 17 + examples/lineage/features.py | 17 + examples/lineage/lineage_commands.py | 17 + examples/lineage/lineage_script.py | 17 + examples/lineage/lineage_snippets.ipynb | 7 + examples/lineage/model_pipeline.py | 17 + examples/lineage/sets.py | 17 + examples/make_python_virtualenv.sh | 17 + examples/materialization/README.md | 19 ++ .../materialization/custom_materializers.py | 17 + examples/materialization/data_loaders.py | 17 + .../datasaver_dataloader_example/README.md | 19 ++ .../notebook.ipynb | 7 + .../datasaver_dataloader_example/run.py | 17 + .../simple_etl.py | 17 + examples/materialization/model_training.py | 17 + examples/materialization/notebook.ipynb | 7 + examples/materialization/run.py | 17 + examples/mlflow/README.md | 19 ++ examples/mlflow/tutorial.ipynb | 7 + examples/model_examples/README.md | 19 ++ .../model_examples/modular_example/README.md | 19 ++ .../modular_example/features.py | 17 + .../modular_example/inference.py | 17 + .../modular_example/notebook.ipynb | 7 + .../modular_example/pipeline.py | 17 + .../model_examples/modular_example/run.py | 17 + .../model_examples/modular_example/train.py | 17 + .../Hamilton_for_ML_dataflows.ipynb | 7 + .../model_examples/scikit-learn/README.md | 19 ++ .../scikit-learn/digit_loader.py | 17 + .../scikit-learn/iris_loader.py | 17 + .../scikit-learn/my_train_evaluate_logic.py | 17 + examples/model_examples/scikit-learn/run.py | 17 + .../Hamilton-TimeSeriesmodel.ipynb | 7 + examples/model_examples/time-series/README.md | 19 ++ .../time-series/data_loaders.py | 17 + .../time-series/model_pipeline.py | 17 + examples/model_examples/time-series/run.py | 17 + .../model_examples/time-series/transforms.py | 17 + examples/model_examples/time-series/utils.py | 17 + examples/module_overrides/README.md | 19 ++ examples/module_overrides/module_a.py | 18 ++ examples/module_overrides/module_b.py | 18 ++ examples/module_overrides/run.py | 17 + .../abstract_functionality_blueprint/README | 19 ++ .../mutate.py | 17 + .../mutate_on_output.py | 17 + .../mutate_twice_the_same.py | 17 + .../notebook.ipynb | 7 + .../pipe_output.py | 17 + .../pipe_output_on_output.py | 17 + .../procedural.py | 17 + examples/narwhals/README.md | 19 ++ examples/narwhals/example.py | 17 + examples/narwhals/notebook.ipynb | 7 + examples/numpy/air-quality-analysis/README.md | 19 ++ .../air-quality-analysis/analysis_flow.py | 17 + .../hamilton_notebook.ipynb | 7 + .../air-quality-analysis/run_analysis.py | 17 + examples/openlineage/README.md | 19 ++ examples/openlineage/fake_data.py | 17 + examples/openlineage/notebook.ipynb | 7 + examples/openlineage/pipeline.py | 17 + examples/openlineage/run.py | 17 + examples/opentelemetry/README.md | 19 ++ .../pandas/materialization/my_functions.py | 17 + examples/pandas/materialization/my_script.py | 17 + .../pandas/materialization/notebook.ipynb | 7 + examples/pandas/split-apply-combine/README.md | 19 ++ .../split-apply-combine/my_functions.py | 17 + .../pandas/split-apply-combine/my_script.py | 17 + .../pandas/split-apply-combine/my_wrapper.py | 17 + .../pandas/split-apply-combine/notebook.ipynb | 7 + examples/pandas/with_columns/README | 19 ++ examples/pandas/with_columns/my_functions.py | 17 + examples/pandas/with_columns/notebook.ipynb | 7 + examples/parallelism/README.md | 19 ++ .../parallelism/file_processing/README.md | 19 ++ .../file_processing/aggregate_data.py | 17 + .../parallelism/file_processing/list_data.py | 17 + .../file_processing/notebook.ipynb | 7 + .../file_processing/process_data.py | 17 + examples/parallelism/file_processing/run.py | 17 + .../parallelism/graceful_running/README.md | 19 ++ .../parallelism/graceful_running/functions.py | 17 + examples/parallelism/graceful_running/run.py | 17 + .../lazy_threadpool_execution/README.md | 19 ++ .../lazy_threadpool_execution/my_functions.py | 17 + .../my_functions_async.py | 17 + .../lazy_threadpool_execution/notebook.ipynb | 7 + .../lazy_threadpool_execution/run.py | 17 + examples/parallelism/star_counting/README.md | 19 ++ .../parallelism/star_counting/functions.py | 17 + .../parallelism/star_counting/notebook.ipynb | 7 + examples/parallelism/star_counting/run.py | 17 + examples/people_data_labs/README.md | 19 ++ examples/people_data_labs/analysis.py | 17 + examples/people_data_labs/download_data.py | 17 + examples/people_data_labs/notebook.ipynb | 7 + examples/people_data_labs/run.py | 17 + examples/plotly/README.md | 19 ++ examples/plotly/model_training.py | 17 + examples/plotly/notebook.ipynb | 7 + examples/polars/README.md | 19 ++ examples/polars/lazyframe/README.md | 19 ++ examples/polars/lazyframe/my_functions.py | 17 + examples/polars/lazyframe/my_script.py | 17 + examples/polars/materialization/README.md | 19 ++ .../polars/materialization/my_functions.py | 17 + examples/polars/materialization/my_script.py | 17 + .../polars/materialization/notebook.ipynb | 7 + examples/polars/my_functions.py | 17 + examples/polars/my_script.py | 17 + examples/polars/notebook.ipynb | 7 + examples/polars/with_columns/README | 19 ++ examples/polars/with_columns/my_functions.py | 17 + .../polars/with_columns/my_functions_lazy.py | 17 + examples/polars/with_columns/notebook.ipynb | 7 + examples/prefect/README.md | 19 ++ examples/prefect/evaluate_model.py | 17 + .../prefect/hamilton_prefect_notebook.ipynb | 7 + examples/prefect/prepare_data.py | 17 + examples/prefect/run.py | 17 + examples/prefect/train_model.py | 17 + examples/ray/README.md | 19 ++ examples/ray/hello_world/README.md | 19 ++ examples/ray/hello_world/data_loaders.py | 17 + examples/ray/hello_world/notebook.ipynb | 7 + examples/ray/hello_world/run.py | 17 + examples/ray/ray_Hamilton_UI_tracking/README | 19 ++ .../hamilton_notebook.ipynb | 11 +- .../ray_Hamilton_UI_tracking/ray_lineage.py | 17 + .../ray_Hamilton_UI_tracking/run_lineage.py | 19 +- examples/reusing_functions/README.md | 19 ++ examples/reusing_functions/main.py | 17 + .../reusing_functions/reusable_subdags.py | 17 + .../reusing_functions/reusing_functions.ipynb | 7 + examples/reusing_functions/unique_users.py | 17 + examples/reverse_etl/README.md | 19 ++ examples/reverse_etl/notebook.ipynb | 7 + examples/reverse_etl/upload_timesheet.py | 17 + examples/schema/README.md | 19 ++ examples/schema/dataflow.py | 17 + examples/schema/multi_dataflow.py | 17 + .../species_distribution_modeling/README.md | 19 ++ .../species_distribution_modeling/grids.py | 17 + .../hamilton_notebook.ipynb | 7 + .../load_data.py | 17 + .../original_script.py | 17 + .../postprocessing_results.py | 17 + .../preprocessing.py | 17 + .../species_distribution_modeling/run.py | 17 + .../train_and_predict.py | 17 + .../train_and_predict_using_mutate.py | 17 + examples/scikit-learn/transformer/README.md | 19 ++ .../transformer/hamilton_notebook.ipynb | 7 + .../transformer/my_functions_a.py | 17 + .../transformer/my_functions_b.py | 17 + examples/scikit-learn/transformer/run.py | 17 + examples/slack/README.md | 19 ++ examples/slack/notebook.ipynb | 7 + examples/slack/slack_notification_example.py | 63 ++-- examples/snowflake/hamilton_ui/Dockerfile | 45 ++- examples/snowflake/hamilton_ui/README.md | 19 ++ .../snowflake/hamilton_ui/my_functions.py | 59 ++-- .../hamilton_ui/pipeline_endpoint.py | 17 + examples/snowflake/hamilton_ui/snowflake.sql | 223 +++++++------ examples/spark/README.md | 19 ++ examples/spark/pandas_on_spark/README.md | 19 ++ .../spark/pandas_on_spark/data_loaders.py | 17 + examples/spark/pandas_on_spark/run.py | 17 + examples/spark/pyspark/README.md | 19 ++ examples/spark/pyspark/dataflow.py | 17 + examples/spark/pyspark/map_transforms.py | 17 + examples/spark/pyspark/notebook.ipynb | 7 + examples/spark/pyspark/run.py | 17 + .../column_features.py | 17 + .../example_usage.ipynb | 7 + .../spark/pyspark_feature_catalog/features.py | 17 + examples/spark/pyspark_udfs/README.md | 19 ++ examples/spark/pyspark_udfs/pandas_udfs.py | 17 + examples/spark/pyspark_udfs/run.py | 17 + examples/spark/pyspark_udfs/vanilla_udfs.py | 17 + examples/spark/tpc-h/README.md | 19 ++ examples/spark/tpc-h/csv_data_loaders.py | 17 + examples/spark/tpc-h/query_1.py | 17 + examples/spark/tpc-h/query_12.py | 17 + examples/spark/tpc-h/query_8.py | 17 + examples/spark/tpc-h/run.py | 17 + examples/spark/world_of_warcraft/README.md | 19 ++ .../world_of_warcraft__pandas.ipynb | 7 + .../world_of_warcraft__spark_v1.ipynb | 7 + .../world_of_warcraft__spark_v2.ipynb | 7 + .../zone_features__common.py | 17 + .../zone_features__pandas.py | 17 + .../zone_features__spark_v1.py | 17 + .../zone_features__spark_v2.py | 17 + examples/streamlit/README.md | 19 ++ examples/streamlit/app.py | 17 + examples/streamlit/logic.py | 17 + examples/styling_visualization/README.md | 19 ++ examples/styling_visualization/dag.png | Bin 297452 -> 333312 bytes .../styling_visualization/data_loading.py | 17 + examples/styling_visualization/features.py | 17 + .../styling_visualization/model_pipeline.py | 17 + examples/styling_visualization/run.py | 17 + examples/styling_visualization/sets.py | 17 + examples/vaex/README.md | 19 ++ examples/vaex/my_functions.py | 17 + examples/vaex/my_script.py | 17 + examples/vaex/notebook.ipynb | 7 + examples/validate_examples.py | 140 +++++++-- .../validation/static_validator/README.md | 19 ++ .../validation/static_validator/bad_module.py | 17 + .../static_validator/good_module.py | 17 + .../static_validator/notebook.ipynb | 7 + examples/validation/static_validator/run.py | 17 + scripts/add_license_headers.py | 297 ++++++++++++++++++ scripts/check_license_headers.py | 182 +++++++++++ 539 files changed, 9451 insertions(+), 323 deletions(-) create mode 100755 scripts/add_license_headers.py create mode 100755 scripts/check_license_headers.py diff --git a/examples/Dockerfile b/examples/Dockerfile index fb384b7b0..3ad92f81a 100644 --- a/examples/Dockerfile +++ b/examples/Dockerfile @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + FROM python:3.9.14-slim-buster RUN apt update -y &&\ diff --git a/examples/LLM_Workflows/GraphRAG/README.md b/examples/LLM_Workflows/GraphRAG/README.md index c6b5a196a..cf55c680c 100644 --- a/examples/LLM_Workflows/GraphRAG/README.md +++ b/examples/LLM_Workflows/GraphRAG/README.md @@ -1,3 +1,22 @@ + + # Conversational agent over UFC Knowledge graph ## Introduction diff --git a/examples/LLM_Workflows/GraphRAG/application.py b/examples/LLM_Workflows/GraphRAG/application.py index cd01bca6f..a6ee454d6 100644 --- a/examples/LLM_Workflows/GraphRAG/application.py +++ b/examples/LLM_Workflows/GraphRAG/application.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import json import uuid from typing import Tuple diff --git a/examples/LLM_Workflows/GraphRAG/graph_schema.py b/examples/LLM_Workflows/GraphRAG/graph_schema.py index 6d972c4a7..9948955d3 100644 --- a/examples/LLM_Workflows/GraphRAG/graph_schema.py +++ b/examples/LLM_Workflows/GraphRAG/graph_schema.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Code courtesy of the FalkorDB. """ diff --git a/examples/LLM_Workflows/GraphRAG/hamilton_ingest.py b/examples/LLM_Workflows/GraphRAG/hamilton_ingest.py index 2c7e1fb87..b6e59c472 100644 --- a/examples/LLM_Workflows/GraphRAG/hamilton_ingest.py +++ b/examples/LLM_Workflows/GraphRAG/hamilton_ingest.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import ingest_fighters import ingest_fights from falkordb import FalkorDB diff --git a/examples/LLM_Workflows/GraphRAG/ingest_fighters.py b/examples/LLM_Workflows/GraphRAG/ingest_fighters.py index 389095205..1cae04ae3 100644 --- a/examples/LLM_Workflows/GraphRAG/ingest_fighters.py +++ b/examples/LLM_Workflows/GraphRAG/ingest_fighters.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Hamilton pipeline to load fighter data into FalkorDB. """ diff --git a/examples/LLM_Workflows/GraphRAG/ingest_fights.py b/examples/LLM_Workflows/GraphRAG/ingest_fights.py index b907dfd9b..f39586db7 100644 --- a/examples/LLM_Workflows/GraphRAG/ingest_fights.py +++ b/examples/LLM_Workflows/GraphRAG/ingest_fights.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Hamilton module to ingest fight data into FalkorDB. """ diff --git a/examples/LLM_Workflows/GraphRAG/ingest_notebook.ipynb b/examples/LLM_Workflows/GraphRAG/ingest_notebook.ipynb index 875b13ed6..a3ab94f3b 100644 --- a/examples/LLM_Workflows/GraphRAG/ingest_notebook.ipynb +++ b/examples/LLM_Workflows/GraphRAG/ingest_notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/LLM_Workflows/GraphRAG/notebook.ipynb b/examples/LLM_Workflows/GraphRAG/notebook.ipynb index f8ec7ac91..2bbe3d831 100644 --- a/examples/LLM_Workflows/GraphRAG/notebook.ipynb +++ b/examples/LLM_Workflows/GraphRAG/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/LLM_Workflows/GraphRAG/utils.py b/examples/LLM_Workflows/GraphRAG/utils.py index b1d674489..df5c22d88 100644 --- a/examples/LLM_Workflows/GraphRAG/utils.py +++ b/examples/LLM_Workflows/GraphRAG/utils.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Code courtesy of the FalkorDB. """ diff --git a/examples/LLM_Workflows/NER_Example/README.md b/examples/LLM_Workflows/NER_Example/README.md index 00bc5851a..2fabd3879 100644 --- a/examples/LLM_Workflows/NER_Example/README.md +++ b/examples/LLM_Workflows/NER_Example/README.md @@ -1,3 +1,22 @@ + + # Document processing with Named Entity Recognition (NER) for RAG This example demonstrates how to use a Named Entity Recognition (NER) model to extract entities from text along with embeddings to facilitate querying with more precision. Specifically we'll use the entities here to filter to diff --git a/examples/LLM_Workflows/NER_Example/lancedb_module.py b/examples/LLM_Workflows/NER_Example/lancedb_module.py index 790898419..70384a0de 100644 --- a/examples/LLM_Workflows/NER_Example/lancedb_module.py +++ b/examples/LLM_Workflows/NER_Example/lancedb_module.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Union import lancedb diff --git a/examples/LLM_Workflows/NER_Example/ner_extraction.py b/examples/LLM_Workflows/NER_Example/ner_extraction.py index 898d9ee55..b8287254e 100644 --- a/examples/LLM_Workflows/NER_Example/ner_extraction.py +++ b/examples/LLM_Workflows/NER_Example/ner_extraction.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Union import torch diff --git a/examples/LLM_Workflows/NER_Example/notebook.ipynb b/examples/LLM_Workflows/NER_Example/notebook.ipynb index cd020984f..8767122ce 100644 --- a/examples/LLM_Workflows/NER_Example/notebook.ipynb +++ b/examples/LLM_Workflows/NER_Example/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/LLM_Workflows/NER_Example/run.py b/examples/LLM_Workflows/NER_Example/run.py index 56b57c94d..47f856e57 100644 --- a/examples/LLM_Workflows/NER_Example/run.py +++ b/examples/LLM_Workflows/NER_Example/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import argparse import lancedb_module diff --git a/examples/LLM_Workflows/RAG_document_extract_chunk_embed/README.md b/examples/LLM_Workflows/RAG_document_extract_chunk_embed/README.md index 05b189a0d..95e360a0a 100644 --- a/examples/LLM_Workflows/RAG_document_extract_chunk_embed/README.md +++ b/examples/LLM_Workflows/RAG_document_extract_chunk_embed/README.md @@ -1,3 +1,22 @@ + + # RAG Document: Extract, Chunk, Embed Example ![pipeline-steps](pipeline-steps.png) diff --git a/examples/LLM_Workflows/RAG_document_extract_chunk_embed/pipeline.py b/examples/LLM_Workflows/RAG_document_extract_chunk_embed/pipeline.py index 9bf866e9b..879f17372 100644 --- a/examples/LLM_Workflows/RAG_document_extract_chunk_embed/pipeline.py +++ b/examples/LLM_Workflows/RAG_document_extract_chunk_embed/pipeline.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Modules that mirrors the pipeline the code in the notebook creates. """ diff --git a/examples/LLM_Workflows/RAG_document_extract_chunk_embed/simple_pipeline.ipynb b/examples/LLM_Workflows/RAG_document_extract_chunk_embed/simple_pipeline.ipynb index d94b93f34..52725104a 100644 --- a/examples/LLM_Workflows/RAG_document_extract_chunk_embed/simple_pipeline.ipynb +++ b/examples/LLM_Workflows/RAG_document_extract_chunk_embed/simple_pipeline.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/LLM_Workflows/README.md b/examples/LLM_Workflows/README.md index 038041c0e..7928a20f0 100644 --- a/examples/LLM_Workflows/README.md +++ b/examples/LLM_Workflows/README.md @@ -1,3 +1,22 @@ + + Here you'll find a collection of workflows that demonstrate how to use Apache Hamilton in various LLM contexts. diff --git a/examples/LLM_Workflows/image_telephone/README.md b/examples/LLM_Workflows/image_telephone/README.md index bc88d2971..04da50f65 100644 --- a/examples/LLM_Workflows/image_telephone/README.md +++ b/examples/LLM_Workflows/image_telephone/README.md @@ -1,3 +1,22 @@ + + # Image Telephone with Burr See the [streamlit app](https://image-telephone.streamlit.app) for a demonstration diff --git a/examples/LLM_Workflows/image_telephone/adapters.py b/examples/LLM_Workflows/image_telephone/adapters.py index dc9e1f934..5c74cfb8b 100644 --- a/examples/LLM_Workflows/image_telephone/adapters.py +++ b/examples/LLM_Workflows/image_telephone/adapters.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import dataclasses import io import json diff --git a/examples/LLM_Workflows/image_telephone/application.py b/examples/LLM_Workflows/image_telephone/application.py index a670fd48b..9af77e433 100644 --- a/examples/LLM_Workflows/image_telephone/application.py +++ b/examples/LLM_Workflows/image_telephone/application.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This module demonstrates a telephone application using Burr that: diff --git a/examples/LLM_Workflows/image_telephone/notebook.ipynb b/examples/LLM_Workflows/image_telephone/notebook.ipynb index 9c7a0b28b..f28ee09a9 100644 --- a/examples/LLM_Workflows/image_telephone/notebook.ipynb +++ b/examples/LLM_Workflows/image_telephone/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/LLM_Workflows/image_telephone/streamlit.py b/examples/LLM_Workflows/image_telephone/streamlit.py index 5a42844c5..2b65ffed3 100644 --- a/examples/LLM_Workflows/image_telephone/streamlit.py +++ b/examples/LLM_Workflows/image_telephone/streamlit.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import collections import concurrent import json diff --git a/examples/LLM_Workflows/knowledge_retrieval/README.md b/examples/LLM_Workflows/knowledge_retrieval/README.md index 6939307ab..8232e61d3 100644 --- a/examples/LLM_Workflows/knowledge_retrieval/README.md +++ b/examples/LLM_Workflows/knowledge_retrieval/README.md @@ -1,3 +1,22 @@ + + # How to use "OpenAI functions" with a Knowledge Base This example is based on [this notebook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_call_functions_for_knowledge_retrieval.ipynb) diff --git a/examples/LLM_Workflows/knowledge_retrieval/arxiv_articles.py b/examples/LLM_Workflows/knowledge_retrieval/arxiv_articles.py index 4e7772bb6..8a3cad561 100644 --- a/examples/LLM_Workflows/knowledge_retrieval/arxiv_articles.py +++ b/examples/LLM_Workflows/knowledge_retrieval/arxiv_articles.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import os.path from typing import Dict diff --git a/examples/LLM_Workflows/knowledge_retrieval/functions.py b/examples/LLM_Workflows/knowledge_retrieval/functions.py index 26a9f03f3..91e19d375 100644 --- a/examples/LLM_Workflows/knowledge_retrieval/functions.py +++ b/examples/LLM_Workflows/knowledge_retrieval/functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Module to house functions for an LLM agent to use.""" import logging diff --git a/examples/LLM_Workflows/knowledge_retrieval/state.py b/examples/LLM_Workflows/knowledge_retrieval/state.py index ad177d196..881d61ba1 100644 --- a/examples/LLM_Workflows/knowledge_retrieval/state.py +++ b/examples/LLM_Workflows/knowledge_retrieval/state.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Module that contains code to house state for an agent. The dialog right now is hardcoded at the bottom of this file. diff --git a/examples/LLM_Workflows/knowledge_retrieval/summarize_text.py b/examples/LLM_Workflows/knowledge_retrieval/summarize_text.py index 580756a49..95cc87a81 100644 --- a/examples/LLM_Workflows/knowledge_retrieval/summarize_text.py +++ b/examples/LLM_Workflows/knowledge_retrieval/summarize_text.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import ast import concurrent from typing import Callable, Generator, List diff --git a/examples/LLM_Workflows/langchain_comparison/README.md b/examples/LLM_Workflows/langchain_comparison/README.md index 053a1d078..0188329c1 100644 --- a/examples/LLM_Workflows/langchain_comparison/README.md +++ b/examples/LLM_Workflows/langchain_comparison/README.md @@ -1,3 +1,22 @@ + + # Comparing to LangChain *Rhetorical question*: which code would you rather maintain, change, and update? diff --git a/examples/LLM_Workflows/langchain_comparison/hamilton_anthropic.py b/examples/LLM_Workflows/langchain_comparison/hamilton_anthropic.py index 984adbb0c..dfd8b277a 100644 --- a/examples/LLM_Workflows/langchain_comparison/hamilton_anthropic.py +++ b/examples/LLM_Workflows/langchain_comparison/hamilton_anthropic.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + # hamilton_anthropic.py import anthropic import openai diff --git a/examples/LLM_Workflows/langchain_comparison/hamilton_async.py b/examples/LLM_Workflows/langchain_comparison/hamilton_async.py index f399fa86a..551c26455 100644 --- a/examples/LLM_Workflows/langchain_comparison/hamilton_async.py +++ b/examples/LLM_Workflows/langchain_comparison/hamilton_async.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + # hamilton_async.py from typing import List diff --git a/examples/LLM_Workflows/langchain_comparison/hamilton_batch.py b/examples/LLM_Workflows/langchain_comparison/hamilton_batch.py index 73b82d64c..8e2161e2a 100644 --- a/examples/LLM_Workflows/langchain_comparison/hamilton_batch.py +++ b/examples/LLM_Workflows/langchain_comparison/hamilton_batch.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + # hamilton_batch.py from typing import List diff --git a/examples/LLM_Workflows/langchain_comparison/hamilton_completion.py b/examples/LLM_Workflows/langchain_comparison/hamilton_completion.py index 72109eef0..695f8d983 100644 --- a/examples/LLM_Workflows/langchain_comparison/hamilton_completion.py +++ b/examples/LLM_Workflows/langchain_comparison/hamilton_completion.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + # hamilton_completion.py from typing import List diff --git a/examples/LLM_Workflows/langchain_comparison/hamilton_fallbacks.py b/examples/LLM_Workflows/langchain_comparison/hamilton_fallbacks.py index 8ec4dd8c0..8607a191b 100644 --- a/examples/LLM_Workflows/langchain_comparison/hamilton_fallbacks.py +++ b/examples/LLM_Workflows/langchain_comparison/hamilton_fallbacks.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import hamilton_anthropic from hamilton import driver diff --git a/examples/LLM_Workflows/langchain_comparison/hamilton_invoke.py b/examples/LLM_Workflows/langchain_comparison/hamilton_invoke.py index d9e2e731b..0b87e5f4f 100644 --- a/examples/LLM_Workflows/langchain_comparison/hamilton_invoke.py +++ b/examples/LLM_Workflows/langchain_comparison/hamilton_invoke.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + # hamilton_invoke.py from typing import List diff --git a/examples/LLM_Workflows/langchain_comparison/hamilton_logging.py b/examples/LLM_Workflows/langchain_comparison/hamilton_logging.py index 4ff50a183..22cf2f039 100644 --- a/examples/LLM_Workflows/langchain_comparison/hamilton_logging.py +++ b/examples/LLM_Workflows/langchain_comparison/hamilton_logging.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + # run.py import hamilton_anthropic from hamilton import driver, lifecycle diff --git a/examples/LLM_Workflows/langchain_comparison/hamilton_streamed.py b/examples/LLM_Workflows/langchain_comparison/hamilton_streamed.py index 77669562d..6d998aa6c 100644 --- a/examples/LLM_Workflows/langchain_comparison/hamilton_streamed.py +++ b/examples/LLM_Workflows/langchain_comparison/hamilton_streamed.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + # hamilton_streamed.py from typing import Iterator, List diff --git a/examples/LLM_Workflows/langchain_comparison/lcel_anthropic.py b/examples/LLM_Workflows/langchain_comparison/lcel_anthropic.py index 797a2b666..bf10802cb 100644 --- a/examples/LLM_Workflows/langchain_comparison/lcel_anthropic.py +++ b/examples/LLM_Workflows/langchain_comparison/lcel_anthropic.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from langchain_community.chat_models import ChatAnthropic from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate diff --git a/examples/LLM_Workflows/langchain_comparison/lcel_async.py b/examples/LLM_Workflows/langchain_comparison/lcel_async.py index 8f3ad28b0..7ada1a76e 100644 --- a/examples/LLM_Workflows/langchain_comparison/lcel_async.py +++ b/examples/LLM_Workflows/langchain_comparison/lcel_async.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnablePassthrough diff --git a/examples/LLM_Workflows/langchain_comparison/lcel_batch.py b/examples/LLM_Workflows/langchain_comparison/lcel_batch.py index db0c5ff9a..dd32f6fa2 100644 --- a/examples/LLM_Workflows/langchain_comparison/lcel_batch.py +++ b/examples/LLM_Workflows/langchain_comparison/lcel_batch.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnablePassthrough diff --git a/examples/LLM_Workflows/langchain_comparison/lcel_completion.py b/examples/LLM_Workflows/langchain_comparison/lcel_completion.py index 9ecd1f5ac..f29d48c6a 100644 --- a/examples/LLM_Workflows/langchain_comparison/lcel_completion.py +++ b/examples/LLM_Workflows/langchain_comparison/lcel_completion.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnablePassthrough diff --git a/examples/LLM_Workflows/langchain_comparison/lcel_fallbacks.py b/examples/LLM_Workflows/langchain_comparison/lcel_fallbacks.py index c9750b987..ccebaec29 100644 --- a/examples/LLM_Workflows/langchain_comparison/lcel_fallbacks.py +++ b/examples/LLM_Workflows/langchain_comparison/lcel_fallbacks.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from langchain_community.chat_models import ChatAnthropic, ChatOpenAI from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate diff --git a/examples/LLM_Workflows/langchain_comparison/lcel_invoke.py b/examples/LLM_Workflows/langchain_comparison/lcel_invoke.py index 33170f139..c8df37bb6 100644 --- a/examples/LLM_Workflows/langchain_comparison/lcel_invoke.py +++ b/examples/LLM_Workflows/langchain_comparison/lcel_invoke.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnablePassthrough diff --git a/examples/LLM_Workflows/langchain_comparison/lcel_logging.py b/examples/LLM_Workflows/langchain_comparison/lcel_logging.py index 0ff834877..743db6b73 100644 --- a/examples/LLM_Workflows/langchain_comparison/lcel_logging.py +++ b/examples/LLM_Workflows/langchain_comparison/lcel_logging.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from langchain_community.chat_models import ChatAnthropic from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate diff --git a/examples/LLM_Workflows/langchain_comparison/lcel_streamed.py b/examples/LLM_Workflows/langchain_comparison/lcel_streamed.py index cfbed672c..b1c292a97 100644 --- a/examples/LLM_Workflows/langchain_comparison/lcel_streamed.py +++ b/examples/LLM_Workflows/langchain_comparison/lcel_streamed.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnablePassthrough diff --git a/examples/LLM_Workflows/langchain_comparison/vanilla_anthropic.py b/examples/LLM_Workflows/langchain_comparison/vanilla_anthropic.py index 0550ebf57..6f4a16112 100644 --- a/examples/LLM_Workflows/langchain_comparison/vanilla_anthropic.py +++ b/examples/LLM_Workflows/langchain_comparison/vanilla_anthropic.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import anthropic prompt_template = "Tell me a short joke about {topic}" diff --git a/examples/LLM_Workflows/langchain_comparison/vanilla_async.py b/examples/LLM_Workflows/langchain_comparison/vanilla_async.py index 4d6df5aad..6cfc74686 100644 --- a/examples/LLM_Workflows/langchain_comparison/vanilla_async.py +++ b/examples/LLM_Workflows/langchain_comparison/vanilla_async.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import List import openai diff --git a/examples/LLM_Workflows/langchain_comparison/vanilla_batch.py b/examples/LLM_Workflows/langchain_comparison/vanilla_batch.py index e9f275ea1..c87741f5f 100644 --- a/examples/LLM_Workflows/langchain_comparison/vanilla_batch.py +++ b/examples/LLM_Workflows/langchain_comparison/vanilla_batch.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from concurrent.futures import ThreadPoolExecutor from typing import List diff --git a/examples/LLM_Workflows/langchain_comparison/vanilla_completion.py b/examples/LLM_Workflows/langchain_comparison/vanilla_completion.py index 8aa30d6d5..a0b769b6b 100644 --- a/examples/LLM_Workflows/langchain_comparison/vanilla_completion.py +++ b/examples/LLM_Workflows/langchain_comparison/vanilla_completion.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import openai prompt_template = "Tell me a short joke about {topic}" diff --git a/examples/LLM_Workflows/langchain_comparison/vanilla_fallbacks.py b/examples/LLM_Workflows/langchain_comparison/vanilla_fallbacks.py index 2a5a2d91c..7729f5720 100644 --- a/examples/LLM_Workflows/langchain_comparison/vanilla_fallbacks.py +++ b/examples/LLM_Workflows/langchain_comparison/vanilla_fallbacks.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import vanilla_anthropic import vanilla_completion diff --git a/examples/LLM_Workflows/langchain_comparison/vanilla_invoke.py b/examples/LLM_Workflows/langchain_comparison/vanilla_invoke.py index 225835b96..eab368970 100644 --- a/examples/LLM_Workflows/langchain_comparison/vanilla_invoke.py +++ b/examples/LLM_Workflows/langchain_comparison/vanilla_invoke.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import List import openai diff --git a/examples/LLM_Workflows/langchain_comparison/vanilla_logging.py b/examples/LLM_Workflows/langchain_comparison/vanilla_logging.py index d370bd1f4..6b8f1dfdd 100644 --- a/examples/LLM_Workflows/langchain_comparison/vanilla_logging.py +++ b/examples/LLM_Workflows/langchain_comparison/vanilla_logging.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import anthropic prompt_template = "Tell me a short joke about {topic}" diff --git a/examples/LLM_Workflows/langchain_comparison/vanilla_streamed.py b/examples/LLM_Workflows/langchain_comparison/vanilla_streamed.py index c75118d5c..2973acc8f 100644 --- a/examples/LLM_Workflows/langchain_comparison/vanilla_streamed.py +++ b/examples/LLM_Workflows/langchain_comparison/vanilla_streamed.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Iterator, List import openai diff --git a/examples/LLM_Workflows/llm_logging/summarization.py b/examples/LLM_Workflows/llm_logging/summarization.py index 058aea78c..6e9cbab38 100644 --- a/examples/LLM_Workflows/llm_logging/summarization.py +++ b/examples/LLM_Workflows/llm_logging/summarization.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import os import tempfile from typing import Generator, Union diff --git a/examples/LLM_Workflows/modular_llm_stack/README.md b/examples/LLM_Workflows/modular_llm_stack/README.md index 7dcc005e7..a2aae5e2f 100644 --- a/examples/LLM_Workflows/modular_llm_stack/README.md +++ b/examples/LLM_Workflows/modular_llm_stack/README.md @@ -1,3 +1,22 @@ + + # Flexibly change components of your LLM stack This example shows how to pull data from the HuggingFace datasets hub, create embeddings for text passage using Cohere / OpenAI / SentenceTransformer, and store them in a vector database using LanceDB / Weaviate / Pinecone / Qdrant. diff --git a/examples/LLM_Workflows/modular_llm_stack/data_module.py b/examples/LLM_Workflows/modular_llm_stack/data_module.py index 127bb6578..efc8c1a9b 100644 --- a/examples/LLM_Workflows/modular_llm_stack/data_module.py +++ b/examples/LLM_Workflows/modular_llm_stack/data_module.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from datasets import load_dataset diff --git a/examples/LLM_Workflows/modular_llm_stack/embedding_module.py b/examples/LLM_Workflows/modular_llm_stack/embedding_module.py index 4a10f907e..57654d836 100644 --- a/examples/LLM_Workflows/modular_llm_stack/embedding_module.py +++ b/examples/LLM_Workflows/modular_llm_stack/embedding_module.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from types import ModuleType import cohere diff --git a/examples/LLM_Workflows/modular_llm_stack/lancedb_module.py b/examples/LLM_Workflows/modular_llm_stack/lancedb_module.py index 09d3913c2..573db8b68 100644 --- a/examples/LLM_Workflows/modular_llm_stack/lancedb_module.py +++ b/examples/LLM_Workflows/modular_llm_stack/lancedb_module.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import lancedb import numpy as np import pandas as pd diff --git a/examples/LLM_Workflows/modular_llm_stack/marqo_module.py b/examples/LLM_Workflows/modular_llm_stack/marqo_module.py index a505568dd..e186f7819 100644 --- a/examples/LLM_Workflows/modular_llm_stack/marqo_module.py +++ b/examples/LLM_Workflows/modular_llm_stack/marqo_module.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging from typing import Any, Union diff --git a/examples/LLM_Workflows/modular_llm_stack/pinecone_module.py b/examples/LLM_Workflows/modular_llm_stack/pinecone_module.py index 594c701aa..38f4d3bfb 100644 --- a/examples/LLM_Workflows/modular_llm_stack/pinecone_module.py +++ b/examples/LLM_Workflows/modular_llm_stack/pinecone_module.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from types import ModuleType import numpy as np diff --git a/examples/LLM_Workflows/modular_llm_stack/qdrant_module.py b/examples/LLM_Workflows/modular_llm_stack/qdrant_module.py index f3bc62cf3..9856cb17e 100644 --- a/examples/LLM_Workflows/modular_llm_stack/qdrant_module.py +++ b/examples/LLM_Workflows/modular_llm_stack/qdrant_module.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np from qdrant_client import QdrantClient, models diff --git a/examples/LLM_Workflows/modular_llm_stack/run.py b/examples/LLM_Workflows/modular_llm_stack/run.py index 9a28cc3f1..01af6007e 100644 --- a/examples/LLM_Workflows/modular_llm_stack/run.py +++ b/examples/LLM_Workflows/modular_llm_stack/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from __future__ import annotations import json diff --git a/examples/LLM_Workflows/modular_llm_stack/weaviate_module.py b/examples/LLM_Workflows/modular_llm_stack/weaviate_module.py index 6def0ec2c..3a723588e 100644 --- a/examples/LLM_Workflows/modular_llm_stack/weaviate_module.py +++ b/examples/LLM_Workflows/modular_llm_stack/weaviate_module.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np import weaviate diff --git a/examples/LLM_Workflows/observability_openllmetry/README.md b/examples/LLM_Workflows/observability_openllmetry/README.md index d6e2141d8..fff5809bd 100644 --- a/examples/LLM_Workflows/observability_openllmetry/README.md +++ b/examples/LLM_Workflows/observability_openllmetry/README.md @@ -1,3 +1,22 @@ + + # Monitor Apache Hamilton with OpenTelemetry, OpenLLMetry and Traceloop In this simple example, you'll learn how to use the `OpenTelemetryTracer` to emit traces of your Apache Hamilton code using the OpenTelemetry format, in particular LLM applications. diff --git a/examples/LLM_Workflows/observability_openllmetry/notebook.ipynb b/examples/LLM_Workflows/observability_openllmetry/notebook.ipynb index 297b383aa..2fbb29cb0 100644 --- a/examples/LLM_Workflows/observability_openllmetry/notebook.ipynb +++ b/examples/LLM_Workflows/observability_openllmetry/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/LLM_Workflows/observability_openllmetry/run.py b/examples/LLM_Workflows/observability_openllmetry/run.py index 51e5e284e..5b70b9300 100644 --- a/examples/LLM_Workflows/observability_openllmetry/run.py +++ b/examples/LLM_Workflows/observability_openllmetry/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import openai diff --git a/examples/LLM_Workflows/pdf_summarizer/README.md b/examples/LLM_Workflows/pdf_summarizer/README.md index e95f3a754..f760b30ae 100644 --- a/examples/LLM_Workflows/pdf_summarizer/README.md +++ b/examples/LLM_Workflows/pdf_summarizer/README.md @@ -1,3 +1,22 @@ + + # (Yet another) LLM PDF Summarizer 📝 Here's an extensible and production-ready PDF summarizer that you can run anywhere! The frontend uses streamlit, which communicates with a FastAPI backend powered by Apache Hamilton. You give it a PDF file via the browser app and it returns you a text summary using the OpenAI API. If you want, you skip the browser inteface and directly access the `/summarize` endpoint with your document! Everything is containerized using Docker, so you should be able to run it where you please 🏃. diff --git a/examples/LLM_Workflows/pdf_summarizer/backend/Dockerfile b/examples/LLM_Workflows/pdf_summarizer/backend/Dockerfile index a41e52409..894dca775 100644 --- a/examples/LLM_Workflows/pdf_summarizer/backend/Dockerfile +++ b/examples/LLM_Workflows/pdf_summarizer/backend/Dockerfile @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + FROM python:3.10-slim-bullseye WORKDIR /app diff --git a/examples/LLM_Workflows/pdf_summarizer/backend/parallel_summarization.py b/examples/LLM_Workflows/pdf_summarizer/backend/parallel_summarization.py index 1b48dcd73..24afdf68c 100644 --- a/examples/LLM_Workflows/pdf_summarizer/backend/parallel_summarization.py +++ b/examples/LLM_Workflows/pdf_summarizer/backend/parallel_summarization.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Module showing the summarization task but using the Parallelizable and Collect features. That is, this code does not embed an executor within the logic of the code. Instead, that is handled by Hamilton. diff --git a/examples/LLM_Workflows/pdf_summarizer/backend/server.py b/examples/LLM_Workflows/pdf_summarizer/backend/server.py index d41d0529e..08ad4bbd9 100644 --- a/examples/LLM_Workflows/pdf_summarizer/backend/server.py +++ b/examples/LLM_Workflows/pdf_summarizer/backend/server.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import base64 import fastapi diff --git a/examples/LLM_Workflows/pdf_summarizer/backend/summarization.py b/examples/LLM_Workflows/pdf_summarizer/backend/summarization.py index 61465fe0f..11df3cc78 100644 --- a/examples/LLM_Workflows/pdf_summarizer/backend/summarization.py +++ b/examples/LLM_Workflows/pdf_summarizer/backend/summarization.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import concurrent import tempfile from typing import Generator, Union diff --git a/examples/LLM_Workflows/pdf_summarizer/frontend/Dockerfile b/examples/LLM_Workflows/pdf_summarizer/frontend/Dockerfile index 089dc33b3..63ad1ee94 100644 --- a/examples/LLM_Workflows/pdf_summarizer/frontend/Dockerfile +++ b/examples/LLM_Workflows/pdf_summarizer/frontend/Dockerfile @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + FROM python:3.10-slim-bullseye WORKDIR /app diff --git a/examples/LLM_Workflows/pdf_summarizer/frontend/app.py b/examples/LLM_Workflows/pdf_summarizer/frontend/app.py index 1d7b93a05..093fef413 100644 --- a/examples/LLM_Workflows/pdf_summarizer/frontend/app.py +++ b/examples/LLM_Workflows/pdf_summarizer/frontend/app.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import base64 from pathlib import Path diff --git a/examples/LLM_Workflows/pdf_summarizer/run_on_spark/README.md b/examples/LLM_Workflows/pdf_summarizer/run_on_spark/README.md index 24fdc0884..3a543c128 100644 --- a/examples/LLM_Workflows/pdf_summarizer/run_on_spark/README.md +++ b/examples/LLM_Workflows/pdf_summarizer/run_on_spark/README.md @@ -1,3 +1,22 @@ + + # PDF Summarizer on Spark Here we show how you can run the same Apache Hamilton dataflow, that we defined in the backend diff --git a/examples/LLM_Workflows/pdf_summarizer/run_on_spark/run.ipynb b/examples/LLM_Workflows/pdf_summarizer/run_on_spark/run.ipynb index 9893feb47..770ed369e 100644 --- a/examples/LLM_Workflows/pdf_summarizer/run_on_spark/run.ipynb +++ b/examples/LLM_Workflows/pdf_summarizer/run_on_spark/run.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/LLM_Workflows/pdf_summarizer/run_on_spark/run.py b/examples/LLM_Workflows/pdf_summarizer/run_on_spark/run.py index 4586b521d..5b5036fa0 100644 --- a/examples/LLM_Workflows/pdf_summarizer/run_on_spark/run.py +++ b/examples/LLM_Workflows/pdf_summarizer/run_on_spark/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Spark driver and Hamilton driver code.""" import pandas as pd diff --git a/examples/LLM_Workflows/pdf_summarizer/run_on_spark/run_with_columns.py b/examples/LLM_Workflows/pdf_summarizer/run_on_spark/run_with_columns.py index 32016b2f2..9f27d8233 100644 --- a/examples/LLM_Workflows/pdf_summarizer/run_on_spark/run_with_columns.py +++ b/examples/LLM_Workflows/pdf_summarizer/run_on_spark/run_with_columns.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Spark driver and Hamilton driver code.""" import spark_pdf_pipeline diff --git a/examples/LLM_Workflows/pdf_summarizer/run_on_spark/spark_pdf_pipeline.py b/examples/LLM_Workflows/pdf_summarizer/run_on_spark/spark_pdf_pipeline.py index 31bcb5367..cd3c288ad 100644 --- a/examples/LLM_Workflows/pdf_summarizer/run_on_spark/spark_pdf_pipeline.py +++ b/examples/LLM_Workflows/pdf_summarizer/run_on_spark/spark_pdf_pipeline.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd import pyspark.sql as ps import summarization diff --git a/examples/LLM_Workflows/pdf_summarizer/run_on_spark/summarization.py b/examples/LLM_Workflows/pdf_summarizer/run_on_spark/summarization.py index 7ef05d565..7d8641f78 100644 --- a/examples/LLM_Workflows/pdf_summarizer/run_on_spark/summarization.py +++ b/examples/LLM_Workflows/pdf_summarizer/run_on_spark/summarization.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import concurrent import tempfile from typing import Generator, Union diff --git a/examples/LLM_Workflows/retrieval_augmented_generation/README.md b/examples/LLM_Workflows/retrieval_augmented_generation/README.md index 78d739ba2..1c066a4f4 100644 --- a/examples/LLM_Workflows/retrieval_augmented_generation/README.md +++ b/examples/LLM_Workflows/retrieval_augmented_generation/README.md @@ -1,3 +1,22 @@ + + # Retrieval Augmented Generation app with Apache Hamilton This application allows you to search arXiv for PDFs or import arbitrary PDF files and search over them using LLMs. For each file, the text is divided in chunks that are embedded with OpenAI and stored in Weaviate. When you query the system, the most relevant chunks are retrieved and a summary answer is generated using OpenAI. diff --git a/examples/LLM_Workflows/retrieval_augmented_generation/backend/Dockerfile b/examples/LLM_Workflows/retrieval_augmented_generation/backend/Dockerfile index 2e0cdaf45..5471c3d04 100644 --- a/examples/LLM_Workflows/retrieval_augmented_generation/backend/Dockerfile +++ b/examples/LLM_Workflows/retrieval_augmented_generation/backend/Dockerfile @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + FROM python:3.10-slim-bullseye WORKDIR /app diff --git a/examples/LLM_Workflows/retrieval_augmented_generation/backend/ingestion.py b/examples/LLM_Workflows/retrieval_augmented_generation/backend/ingestion.py index dfda3ab7c..14bfedd1f 100644 --- a/examples/LLM_Workflows/retrieval_augmented_generation/backend/ingestion.py +++ b/examples/LLM_Workflows/retrieval_augmented_generation/backend/ingestion.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import base64 import io from pathlib import Path diff --git a/examples/LLM_Workflows/retrieval_augmented_generation/backend/retrieval.py b/examples/LLM_Workflows/retrieval_augmented_generation/backend/retrieval.py index 5935906a0..6a2fb87aa 100644 --- a/examples/LLM_Workflows/retrieval_augmented_generation/backend/retrieval.py +++ b/examples/LLM_Workflows/retrieval_augmented_generation/backend/retrieval.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import openai import weaviate from ingestion import _get_embeddings__openai diff --git a/examples/LLM_Workflows/retrieval_augmented_generation/backend/server.py b/examples/LLM_Workflows/retrieval_augmented_generation/backend/server.py index 5d1690fb9..437a57486 100644 --- a/examples/LLM_Workflows/retrieval_augmented_generation/backend/server.py +++ b/examples/LLM_Workflows/retrieval_augmented_generation/backend/server.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import base64 from contextlib import asynccontextmanager from dataclasses import dataclass diff --git a/examples/LLM_Workflows/retrieval_augmented_generation/backend/vector_db.py b/examples/LLM_Workflows/retrieval_augmented_generation/backend/vector_db.py index 41359398b..adc387071 100644 --- a/examples/LLM_Workflows/retrieval_augmented_generation/backend/vector_db.py +++ b/examples/LLM_Workflows/retrieval_augmented_generation/backend/vector_db.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import weaviate diff --git a/examples/LLM_Workflows/retrieval_augmented_generation/build_app.sh b/examples/LLM_Workflows/retrieval_augmented_generation/build_app.sh index d499da8bd..18f473f7f 100755 --- a/examples/LLM_Workflows/retrieval_augmented_generation/build_app.sh +++ b/examples/LLM_Workflows/retrieval_augmented_generation/build_app.sh @@ -1,4 +1,21 @@ #!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + # attribute variables target_dir=$1 api_key=$2 diff --git a/examples/LLM_Workflows/retrieval_augmented_generation/frontend/Dockerfile b/examples/LLM_Workflows/retrieval_augmented_generation/frontend/Dockerfile index 500827495..0e1bf7010 100644 --- a/examples/LLM_Workflows/retrieval_augmented_generation/frontend/Dockerfile +++ b/examples/LLM_Workflows/retrieval_augmented_generation/frontend/Dockerfile @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + FROM python:3.10-slim-bullseye WORKDIR /app diff --git a/examples/LLM_Workflows/retrieval_augmented_generation/frontend/Information.py b/examples/LLM_Workflows/retrieval_augmented_generation/frontend/Information.py index 83b31112d..9b8035a97 100644 --- a/examples/LLM_Workflows/retrieval_augmented_generation/frontend/Information.py +++ b/examples/LLM_Workflows/retrieval_augmented_generation/frontend/Information.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import client import streamlit as st diff --git a/examples/LLM_Workflows/retrieval_augmented_generation/frontend/client.py b/examples/LLM_Workflows/retrieval_augmented_generation/frontend/client.py index 04403cbed..afe178938 100644 --- a/examples/LLM_Workflows/retrieval_augmented_generation/frontend/client.py +++ b/examples/LLM_Workflows/retrieval_augmented_generation/frontend/client.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import requests from streamlit.runtime.uploaded_file_manager import UploadedFile diff --git a/examples/LLM_Workflows/retrieval_augmented_generation/frontend/pages/1_Ingestion.py b/examples/LLM_Workflows/retrieval_augmented_generation/frontend/pages/1_Ingestion.py index 74836dc9c..8dcb3ff33 100644 --- a/examples/LLM_Workflows/retrieval_augmented_generation/frontend/pages/1_Ingestion.py +++ b/examples/LLM_Workflows/retrieval_augmented_generation/frontend/pages/1_Ingestion.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import arxiv import client import streamlit as st diff --git a/examples/LLM_Workflows/retrieval_augmented_generation/frontend/pages/2_Retrieval.py b/examples/LLM_Workflows/retrieval_augmented_generation/frontend/pages/2_Retrieval.py index 92bb92d05..61cad2777 100644 --- a/examples/LLM_Workflows/retrieval_augmented_generation/frontend/pages/2_Retrieval.py +++ b/examples/LLM_Workflows/retrieval_augmented_generation/frontend/pages/2_Retrieval.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import client import streamlit as st diff --git a/examples/LLM_Workflows/scraping_and_chunking/README.md b/examples/LLM_Workflows/scraping_and_chunking/README.md index a0b2f6c28..c1de57b93 100644 --- a/examples/LLM_Workflows/scraping_and_chunking/README.md +++ b/examples/LLM_Workflows/scraping_and_chunking/README.md @@ -1,3 +1,22 @@ + + # Scraping and Chunking Scraping and chunking are an important part of any RAG dataflow. Typically they're the start of your "backend" operations to populate for example your vector database. diff --git a/examples/LLM_Workflows/scraping_and_chunking/doc_pipeline.py b/examples/LLM_Workflows/scraping_and_chunking/doc_pipeline.py index c1a383eca..cb616a11f 100644 --- a/examples/LLM_Workflows/scraping_and_chunking/doc_pipeline.py +++ b/examples/LLM_Workflows/scraping_and_chunking/doc_pipeline.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Things this module does. diff --git a/examples/LLM_Workflows/scraping_and_chunking/notebook.ipynb b/examples/LLM_Workflows/scraping_and_chunking/notebook.ipynb index 4b8454e33..dce2fd8cb 100644 --- a/examples/LLM_Workflows/scraping_and_chunking/notebook.ipynb +++ b/examples/LLM_Workflows/scraping_and_chunking/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/LLM_Workflows/scraping_and_chunking/run.py b/examples/LLM_Workflows/scraping_and_chunking/run.py index 256dd66a0..5ca9008b7 100644 --- a/examples/LLM_Workflows/scraping_and_chunking/run.py +++ b/examples/LLM_Workflows/scraping_and_chunking/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ A basic script to run the pipeline defined in `doc_pipeline.py`. diff --git a/examples/LLM_Workflows/scraping_and_chunking/run_dask.py b/examples/LLM_Workflows/scraping_and_chunking/run_dask.py index e8fd2ecf6..3e4346151 100644 --- a/examples/LLM_Workflows/scraping_and_chunking/run_dask.py +++ b/examples/LLM_Workflows/scraping_and_chunking/run_dask.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Shows how to run document chunking using dask. """ diff --git a/examples/LLM_Workflows/scraping_and_chunking/run_ray.py b/examples/LLM_Workflows/scraping_and_chunking/run_ray.py index a85cfc33b..7a6a4cca5 100644 --- a/examples/LLM_Workflows/scraping_and_chunking/run_ray.py +++ b/examples/LLM_Workflows/scraping_and_chunking/run_ray.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Shows how to run document chunking using ray. """ diff --git a/examples/LLM_Workflows/scraping_and_chunking/spark/README.md b/examples/LLM_Workflows/scraping_and_chunking/spark/README.md index e67f0142c..78af824d8 100644 --- a/examples/LLM_Workflows/scraping_and_chunking/spark/README.md +++ b/examples/LLM_Workflows/scraping_and_chunking/spark/README.md @@ -1,3 +1,22 @@ + + # PySpark version of the scraping and chunking example Here we show how you can integrate the Apache Hamilton dataflow, that we defined previously diff --git a/examples/LLM_Workflows/scraping_and_chunking/spark/doc_pipeline.py b/examples/LLM_Workflows/scraping_and_chunking/spark/doc_pipeline.py index a71648795..452c36129 100644 --- a/examples/LLM_Workflows/scraping_and_chunking/spark/doc_pipeline.py +++ b/examples/LLM_Workflows/scraping_and_chunking/spark/doc_pipeline.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This module is a modified version to enable it to be used in a spark job. diff --git a/examples/LLM_Workflows/scraping_and_chunking/spark/notebook.ipynb b/examples/LLM_Workflows/scraping_and_chunking/spark/notebook.ipynb index 2b52742d5..afb4b7605 100644 --- a/examples/LLM_Workflows/scraping_and_chunking/spark/notebook.ipynb +++ b/examples/LLM_Workflows/scraping_and_chunking/spark/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/LLM_Workflows/scraping_and_chunking/spark/spark_pipeline.py b/examples/LLM_Workflows/scraping_and_chunking/spark/spark_pipeline.py index b060c42a3..e7f1fac5a 100644 --- a/examples/LLM_Workflows/scraping_and_chunking/spark/spark_pipeline.py +++ b/examples/LLM_Workflows/scraping_and_chunking/spark/spark_pipeline.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This module creates a spark job that uses the sitemap.xml file to create a dataframe with a URL column, diff --git a/examples/README.md b/examples/README.md index 0fba99e65..a5771283c 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,3 +1,22 @@ + + # Examples Here you'll find various examples, some relatively simple, to a few that are more complex. As you can see diff --git a/examples/airflow/Dockerfile b/examples/airflow/Dockerfile index e7e826366..6f00a7454 100644 --- a/examples/airflow/Dockerfile +++ b/examples/airflow/Dockerfile @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + FROM apache/airflow:latest-python3.10 ADD requirements.txt . RUN pip install -r requirements.txt diff --git a/examples/airflow/README.md b/examples/airflow/README.md index 5b04e3f1d..aa41d4386 100644 --- a/examples/airflow/README.md +++ b/examples/airflow/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton and Airflow In this example, we're going to show how to run Apache Hamilton within a Airflow task. Both tools are used to author DAGs with Python code, but they operate on different levels: diff --git a/examples/airflow/dags/hamilton/absenteeism_prediction_dag.py b/examples/airflow/dags/hamilton/absenteeism_prediction_dag.py index 74cc62166..5173754b2 100644 --- a/examples/airflow/dags/hamilton/absenteeism_prediction_dag.py +++ b/examples/airflow/dags/hamilton/absenteeism_prediction_dag.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """This is an example project using Hamilton with Apache Airflow For the purpose of this example, we will read and write data from the Airflow diff --git a/examples/airflow/dags/hamilton/hamilton_how_to_dag.py b/examples/airflow/dags/hamilton/hamilton_how_to_dag.py index cdbe3599b..b04935e9c 100644 --- a/examples/airflow/dags/hamilton/hamilton_how_to_dag.py +++ b/examples/airflow/dags/hamilton/hamilton_how_to_dag.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """This file shows different usage pattern to integrate Hamilton with Apache Airflow For the purpose of this example, we will read and write data from the Airflow diff --git a/examples/airflow/plugins/absenteeism/evaluate_model.py b/examples/airflow/plugins/absenteeism/evaluate_model.py index 6664d82a4..ed148b51d 100644 --- a/examples/airflow/plugins/absenteeism/evaluate_model.py +++ b/examples/airflow/plugins/absenteeism/evaluate_model.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np import scipy.stats as stats from sklearn.metrics import get_scorer diff --git a/examples/airflow/plugins/absenteeism/prepare_data.py b/examples/airflow/plugins/absenteeism/prepare_data.py index f1646e4f0..d4dd2c0a4 100644 --- a/examples/airflow/plugins/absenteeism/prepare_data.py +++ b/examples/airflow/plugins/absenteeism/prepare_data.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import List import numpy as np diff --git a/examples/airflow/plugins/absenteeism/train_model.py b/examples/airflow/plugins/absenteeism/train_model.py index d72eb7172..1b5ebe420 100644 --- a/examples/airflow/plugins/absenteeism/train_model.py +++ b/examples/airflow/plugins/absenteeism/train_model.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Dict, List import numpy as np diff --git a/examples/airflow/plugins/function_modules/data_loaders.py b/examples/airflow/plugins/function_modules/data_loaders.py index b7a8ed19a..615347e9a 100644 --- a/examples/airflow/plugins/function_modules/data_loaders.py +++ b/examples/airflow/plugins/function_modules/data_loaders.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This module defines data loading logic that we'd like to apply. diff --git a/examples/airflow/plugins/function_modules/feature_logic.py b/examples/airflow/plugins/function_modules/feature_logic.py index 03462cb4a..679b00adb 100644 --- a/examples/airflow/plugins/function_modules/feature_logic.py +++ b/examples/airflow/plugins/function_modules/feature_logic.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This module defines some feature transformation logic that we'd like to apply. It then in addition, decorates the functions with @check_output, so that at runtime, we can diff --git a/examples/async/README.md b/examples/async/README.md index 14bf4fbee..498b545fe 100644 --- a/examples/async/README.md +++ b/examples/async/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton + Async This is currently an experimental feature, allowing one to run a hamilton DAG composed (entirely or partially) of async functions. diff --git a/examples/async/async_module.py b/examples/async/async_module.py index ad52c7a1b..1db07defe 100644 --- a/examples/async/async_module.py +++ b/examples/async/async_module.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import asyncio import json import logging diff --git a/examples/async/fastapi_example.py b/examples/async/fastapi_example.py index 9f3e23682..205fae9cf 100644 --- a/examples/async/fastapi_example.py +++ b/examples/async/fastapi_example.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging from contextlib import asynccontextmanager diff --git a/examples/aws/glue/README.md b/examples/aws/glue/README.md index 652483950..7e7c6f070 100644 --- a/examples/aws/glue/README.md +++ b/examples/aws/glue/README.md @@ -1,3 +1,22 @@ + + # Deploy Apache Hamilton Functions as an AWS Glue Job [AWS Glue](https://aws.amazon.com/glue/) is a serverless data integration service. This guide demonstrates deploying a "hello-world" [processing job](https://docs.aws.amazon.com/glue/latest/dg/add-job-python.html) using Apache Hamilton functions on AWS Glue. diff --git a/examples/aws/glue/app/hamilton_functions/functions.py b/examples/aws/glue/app/hamilton_functions/functions.py index d1644b34d..7468c24fc 100644 --- a/examples/aws/glue/app/hamilton_functions/functions.py +++ b/examples/aws/glue/app/hamilton_functions/functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton.function_modifiers import extract_columns diff --git a/examples/aws/glue/app/setup.py b/examples/aws/glue/app/setup.py index 839975b92..f1fe543ba 100644 --- a/examples/aws/glue/app/setup.py +++ b/examples/aws/glue/app/setup.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from setuptools import setup setup(name="hamilton_functions", version="0.1", packages=["hamilton_functions"]) diff --git a/examples/aws/glue/processing.py b/examples/aws/glue/processing.py index 5b40d5388..06bebe2c3 100644 --- a/examples/aws/glue/processing.py +++ b/examples/aws/glue/processing.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import sys import pandas as pd diff --git a/examples/aws/lambda/Dockerfile b/examples/aws/lambda/Dockerfile index 480f64e38..0e05b8cef 100644 --- a/examples/aws/lambda/Dockerfile +++ b/examples/aws/lambda/Dockerfile @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + FROM public.ecr.aws/lambda/python:3.11 COPY requirements.txt ./ diff --git a/examples/aws/lambda/README.md b/examples/aws/lambda/README.md index 3f929cc4b..86a0cf67c 100644 --- a/examples/aws/lambda/README.md +++ b/examples/aws/lambda/README.md @@ -1,3 +1,22 @@ + + # Deploy Apache Hamilton in AWS Lambda [AWS Lambda](https://aws.amazon.com/lambda/) - serverless computation service in AWS. diff --git a/examples/aws/lambda/app/functions.py b/examples/aws/lambda/app/functions.py index d1644b34d..7468c24fc 100644 --- a/examples/aws/lambda/app/functions.py +++ b/examples/aws/lambda/app/functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton.function_modifiers import extract_columns diff --git a/examples/aws/lambda/app/lambda_handler.py b/examples/aws/lambda/app/lambda_handler.py index 225cab51c..48b0bfd05 100644 --- a/examples/aws/lambda/app/lambda_handler.py +++ b/examples/aws/lambda/app/lambda_handler.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton import driver diff --git a/examples/aws/sagemaker/README.md b/examples/aws/sagemaker/README.md index e7c8f3b9b..da5debccb 100644 --- a/examples/aws/sagemaker/README.md +++ b/examples/aws/sagemaker/README.md @@ -1,3 +1,22 @@ + + # Run Apache Hamilton Functions as an AWS SageMaker Processing Job [AWS SageMaker](https://aws.amazon.com/sagemaker/) is a comprehensive platform that facilitates the creation, training, and deployment of machine learning (ML) models. This guide demonstrates deploying a "hello-world" [processing job](https://docs.aws.amazon.com/sagemaker/latest/dg/processing-job.html) using Apache Hamilton functions on SageMaker. diff --git a/examples/aws/sagemaker/app/functions.py b/examples/aws/sagemaker/app/functions.py index d1644b34d..7468c24fc 100644 --- a/examples/aws/sagemaker/app/functions.py +++ b/examples/aws/sagemaker/app/functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton.function_modifiers import extract_columns diff --git a/examples/aws/sagemaker/container/Dockerfile b/examples/aws/sagemaker/container/Dockerfile index 676303e3d..e4618a2a9 100644 --- a/examples/aws/sagemaker/container/Dockerfile +++ b/examples/aws/sagemaker/container/Dockerfile @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + FROM python:3.11-slim-buster RUN apt-get update && apt-get install -y graphviz diff --git a/examples/aws/sagemaker/notebook.ipynb b/examples/aws/sagemaker/notebook.ipynb index a4692b523..69a00a96c 100644 --- a/examples/aws/sagemaker/notebook.ipynb +++ b/examples/aws/sagemaker/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/aws/sagemaker/processing.py b/examples/aws/sagemaker/processing.py index d6407ae13..7db29eba9 100644 --- a/examples/aws/sagemaker/processing.py +++ b/examples/aws/sagemaker/processing.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from app import functions diff --git a/examples/caching/README.md b/examples/caching/README.md index ac4732a33..5438345e2 100644 --- a/examples/caching/README.md +++ b/examples/caching/README.md @@ -1,3 +1,22 @@ + + # Caching This directory contains tutorial notebooks for the Apache Hamilton caching feature. diff --git a/examples/caching/in_memory_tutorial.ipynb b/examples/caching/in_memory_tutorial.ipynb index 4b4f8ddb4..f7bc9aa2d 100644 --- a/examples/caching/in_memory_tutorial.ipynb +++ b/examples/caching/in_memory_tutorial.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/caching/materializer_tutorial.ipynb b/examples/caching/materializer_tutorial.ipynb index 490075013..81dc2d597 100644 --- a/examples/caching/materializer_tutorial.ipynb +++ b/examples/caching/materializer_tutorial.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/caching/tutorial.ipynb b/examples/caching/tutorial.ipynb index c4d411663..a74621291 100644 --- a/examples/caching/tutorial.ipynb +++ b/examples/caching/tutorial.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/caching_nodes/README.md b/examples/caching_nodes/README.md index e97f5997f..66a07019e 100644 --- a/examples/caching_nodes/README.md +++ b/examples/caching_nodes/README.md @@ -1,3 +1,22 @@ + + # Caching There are four general approaches to caching in Apache Hamilton. diff --git a/examples/caching_nodes/caching.ipynb b/examples/caching_nodes/caching.ipynb index a5d96087d..79f243896 100644 --- a/examples/caching_nodes/caching.ipynb +++ b/examples/caching_nodes/caching.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/caching_nodes/caching_graph_adapter/README.md b/examples/caching_nodes/caching_graph_adapter/README.md index bda41bf6a..aa0c08699 100644 --- a/examples/caching_nodes/caching_graph_adapter/README.md +++ b/examples/caching_nodes/caching_graph_adapter/README.md @@ -1,3 +1,22 @@ + + # Caching Graph Adapter You can use `CachingGraphAdapter` to cache certain nodes. diff --git a/examples/caching_nodes/caching_graph_adapter/business_logic.py b/examples/caching_nodes/caching_graph_adapter/business_logic.py index da3bfb4ae..1cc024bd8 100644 --- a/examples/caching_nodes/caching_graph_adapter/business_logic.py +++ b/examples/caching_nodes/caching_graph_adapter/business_logic.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd """ diff --git a/examples/caching_nodes/caching_graph_adapter/caching_nodes.ipynb b/examples/caching_nodes/caching_graph_adapter/caching_nodes.ipynb index 848194842..bba5303d4 100644 --- a/examples/caching_nodes/caching_graph_adapter/caching_nodes.ipynb +++ b/examples/caching_nodes/caching_graph_adapter/caching_nodes.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/caching_nodes/caching_graph_adapter/data_loaders.py b/examples/caching_nodes/caching_graph_adapter/data_loaders.py index f9fee5842..856c16780 100644 --- a/examples/caching_nodes/caching_graph_adapter/data_loaders.py +++ b/examples/caching_nodes/caching_graph_adapter/data_loaders.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton.function_modifiers import tag diff --git a/examples/caching_nodes/caching_graph_adapter/run.py b/examples/caching_nodes/caching_graph_adapter/run.py index fbdb70273..3d11488c4 100644 --- a/examples/caching_nodes/caching_graph_adapter/run.py +++ b/examples/caching_nodes/caching_graph_adapter/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging import pathlib import sys diff --git a/examples/caching_nodes/diskcache_adapter/README.md b/examples/caching_nodes/diskcache_adapter/README.md index a4f3ed3e7..5dc20fb39 100644 --- a/examples/caching_nodes/diskcache_adapter/README.md +++ b/examples/caching_nodes/diskcache_adapter/README.md @@ -1,3 +1,22 @@ + + # DiskCache Adapter This adapter uses [diskcache](https://grantjenks.com/docs/diskcache/tutorial.html) to cache node execution on disk. The cache key is a tuple of the function's `(source code, input a, ..., input n)`. This means, a function will only be executed once for a given set of inputs, diff --git a/examples/caching_nodes/diskcache_adapter/functions.py b/examples/caching_nodes/diskcache_adapter/functions.py index 3d693fcde..09df89944 100644 --- a/examples/caching_nodes/diskcache_adapter/functions.py +++ b/examples/caching_nodes/diskcache_adapter/functions.py @@ -1,3 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + + def A(external: int) -> int: return external % 7 + 1 diff --git a/examples/caching_nodes/diskcache_adapter/notebook.ipynb b/examples/caching_nodes/diskcache_adapter/notebook.ipynb index 799bb3b57..6997f2eb8 100644 --- a/examples/caching_nodes/diskcache_adapter/notebook.ipynb +++ b/examples/caching_nodes/diskcache_adapter/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/caching_nodes/diskcache_adapter/run.py b/examples/caching_nodes/diskcache_adapter/run.py index 7e445e51f..cc93562ad 100644 --- a/examples/caching_nodes/diskcache_adapter/run.py +++ b/examples/caching_nodes/diskcache_adapter/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging import functions diff --git a/examples/cli/DOCS.md b/examples/cli/DOCS.md index ab9f015a5..fdeb1794e 100644 --- a/examples/cli/DOCS.md +++ b/examples/cli/DOCS.md @@ -1,3 +1,22 @@ + + # `hamilton` Apache Hamilton CLI diff --git a/examples/cli/README.md b/examples/cli/README.md index 04b6cd2f6..6f20110ef 100644 --- a/examples/cli/README.md +++ b/examples/cli/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton CLI The Apache Hamilton CLI allows to build `Driver` objects from the command line. diff --git a/examples/cli/config.py b/examples/cli/config.py index 80ec6627f..5cace0fd7 100644 --- a/examples/cli/config.py +++ b/examples/cli/config.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + HAMILTON_CONFIG = dict(config_exists="true") HAMILTON_FINAL_VARS = ["config_when", "customer_summary_table"] diff --git a/examples/cli/example_script.py b/examples/cli/example_script.py index caca239f7..ad23e5d3f 100644 --- a/examples/cli/example_script.py +++ b/examples/cli/example_script.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import json import subprocess diff --git a/examples/cli/module_v1.py b/examples/cli/module_v1.py index 2fc7333fa..df6c3362f 100644 --- a/examples/cli/module_v1.py +++ b/examples/cli/module_v1.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton.function_modifiers import config, extract_columns diff --git a/examples/cli/watcher.py b/examples/cli/watcher.py index 3600985f8..391827636 100644 --- a/examples/cli/watcher.py +++ b/examples/cli/watcher.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import sys from watchdog.events import FileModifiedEvent diff --git a/examples/contrib/README.md b/examples/contrib/README.md index b0263421f..ad4737190 100644 --- a/examples/contrib/README.md +++ b/examples/contrib/README.md @@ -1,3 +1,22 @@ + + # Import Community Dataflows In this example, we show you how to import and use dataflows from the [Apache Hamilton Dataflow Hub](https://hub.dagworks.io/docs/). diff --git a/examples/contrib/notebook.ipynb b/examples/contrib/notebook.ipynb index 9339e9e7f..9a8d39b2e 100644 --- a/examples/contrib/notebook.ipynb +++ b/examples/contrib/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/contrib/notebooks/dagworks-translate_to_hamilton.ipynb b/examples/contrib/notebooks/dagworks-translate_to_hamilton.ipynb index ed36df07d..fba35be9f 100644 --- a/examples/contrib/notebooks/dagworks-translate_to_hamilton.ipynb +++ b/examples/contrib/notebooks/dagworks-translate_to_hamilton.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/contrib/run.py b/examples/contrib/run.py index e2ec3544c..84e167cf5 100644 --- a/examples/contrib/run.py +++ b/examples/contrib/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split diff --git a/examples/dagster/README.md b/examples/dagster/README.md index e68553aee..67f0bdf37 100644 --- a/examples/dagster/README.md +++ b/examples/dagster/README.md @@ -1,3 +1,22 @@ + + # Dagster + Apache Hamilton This repository compares how to build dataflows with macro orchestrator Dagster and the micro orchestrator Apache Hamilton. diff --git a/examples/dagster/dagster_code/README.md b/examples/dagster/dagster_code/README.md index e56a62daf..ad895a871 100644 --- a/examples/dagster/dagster_code/README.md +++ b/examples/dagster/dagster_code/README.md @@ -1,3 +1,22 @@ + + # Dagster This project is adapted from the official [Dagster tutorial](https://docs.dagster.io/tutorial). diff --git a/examples/dagster/dagster_code/setup.py b/examples/dagster/dagster_code/setup.py index bc5ee38d4..83720b4ad 100644 --- a/examples/dagster/dagster_code/setup.py +++ b/examples/dagster/dagster_code/setup.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from setuptools import setup setup(name="tutorial") diff --git a/examples/dagster/dagster_code/tutorial/assets.py b/examples/dagster/dagster_code/tutorial/assets.py index 728a06c44..9b6a3652a 100644 --- a/examples/dagster/dagster_code/tutorial/assets.py +++ b/examples/dagster/dagster_code/tutorial/assets.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import base64 import json import os diff --git a/examples/dagster/hamilton_code/README.md b/examples/dagster/hamilton_code/README.md index 8e3d04971..40e30785d 100644 --- a/examples/dagster/hamilton_code/README.md +++ b/examples/dagster/hamilton_code/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton ![](./dataflow.png) diff --git a/examples/dagster/hamilton_code/dataflow.py b/examples/dagster/hamilton_code/dataflow.py index 3b4ec060e..0698c91da 100644 --- a/examples/dagster/hamilton_code/dataflow.py +++ b/examples/dagster/hamilton_code/dataflow.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import matplotlib.pyplot as plt import pandas as pd import requests diff --git a/examples/dagster/hamilton_code/mock_api.py b/examples/dagster/hamilton_code/mock_api.py index 7562d0dab..77c5687e8 100644 --- a/examples/dagster/hamilton_code/mock_api.py +++ b/examples/dagster/hamilton_code/mock_api.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from dataclasses import asdict, dataclass from datetime import datetime, timedelta from random import Random diff --git a/examples/dagster/hamilton_code/notebook.ipynb b/examples/dagster/hamilton_code/notebook.ipynb index e3e1958c3..0f10c40dc 100644 --- a/examples/dagster/hamilton_code/notebook.ipynb +++ b/examples/dagster/hamilton_code/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/dagster/hamilton_code/run.py b/examples/dagster/hamilton_code/run.py index b8b59bb42..2a7adf608 100644 --- a/examples/dagster/hamilton_code/run.py +++ b/examples/dagster/hamilton_code/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import dataflow from mock_api import DataGeneratorResource diff --git a/examples/dask/README.md b/examples/dask/README.md index 13760bb5e..733d19bb6 100644 --- a/examples/dask/README.md +++ b/examples/dask/README.md @@ -1,3 +1,22 @@ + + # Scaling Apache Hamilton on Dask [Dask](https://dask.org) is a general purpose framework that allows for parallel diff --git a/examples/dask/community_demo/README.md b/examples/dask/community_demo/README.md index c15995167..285b353b3 100644 --- a/examples/dask/community_demo/README.md +++ b/examples/dask/community_demo/README.md @@ -1,3 +1,22 @@ + + # Dask Community day demo example This example was demo'ed at the Dask community day for July 2023. diff --git a/examples/dask/community_demo/demo_day_notebook.ipynb b/examples/dask/community_demo/demo_day_notebook.ipynb index 671d7f422..128852cd9 100644 --- a/examples/dask/community_demo/demo_day_notebook.ipynb +++ b/examples/dask/community_demo/demo_day_notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/dask/community_demo/my_functions.py b/examples/dask/community_demo/my_functions.py index c4b2a17df..d14da2fcb 100644 --- a/examples/dask/community_demo/my_functions.py +++ b/examples/dask/community_demo/my_functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import time import pandas as pd diff --git a/examples/dask/hello_world/README.md b/examples/dask/hello_world/README.md index 61c584635..83006ba67 100644 --- a/examples/dask/hello_world/README.md +++ b/examples/dask/hello_world/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton on Dask Here we have a hello world example showing how you can diff --git a/examples/dask/hello_world/data_loaders.py b/examples/dask/hello_world/data_loaders.py index 38c4300d1..742147814 100644 --- a/examples/dask/hello_world/data_loaders.py +++ b/examples/dask/hello_world/data_loaders.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from dask import dataframe diff --git a/examples/dask/hello_world/notebook.ipynb b/examples/dask/hello_world/notebook.ipynb index 7caaf82c9..ce74a2d1f 100644 --- a/examples/dask/hello_world/notebook.ipynb +++ b/examples/dask/hello_world/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/dask/hello_world/run.py b/examples/dask/hello_world/run.py index 35e8fe25f..4a8853230 100644 --- a/examples/dask/hello_world/run.py +++ b/examples/dask/hello_world/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import importlib import logging import sys diff --git a/examples/dask/hello_world/run_with_delayed.py b/examples/dask/hello_world/run_with_delayed.py index a8e62ad17..196d080d4 100644 --- a/examples/dask/hello_world/run_with_delayed.py +++ b/examples/dask/hello_world/run_with_delayed.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import importlib import logging import sys diff --git a/examples/dask/hello_world/run_with_delayed_and_dask_objects.py b/examples/dask/hello_world/run_with_delayed_and_dask_objects.py index ef9fa0480..c3b3bcebc 100644 --- a/examples/dask/hello_world/run_with_delayed_and_dask_objects.py +++ b/examples/dask/hello_world/run_with_delayed_and_dask_objects.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import importlib import logging import sys diff --git a/examples/data_loaders/README.md b/examples/data_loaders/README.md index 9d07b3252..82c21aba8 100644 --- a/examples/data_loaders/README.md +++ b/examples/data_loaders/README.md @@ -1,3 +1,22 @@ + + # Data Loaders Among multiple uses, Apache Hamilton excels at building maintainable, scalable representations of ETLs. diff --git a/examples/data_loaders/data_loaders.ipynb b/examples/data_loaders/data_loaders.ipynb index a905e5226..233f3b116 100644 --- a/examples/data_loaders/data_loaders.ipynb +++ b/examples/data_loaders/data_loaders.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/data_loaders/load_data_csv.py b/examples/data_loaders/load_data_csv.py index b8b52851b..8e4a5d49b 100644 --- a/examples/data_loaders/load_data_csv.py +++ b/examples/data_loaders/load_data_csv.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton.function_modifiers import load_from, value diff --git a/examples/data_loaders/load_data_duckdb.py b/examples/data_loaders/load_data_duckdb.py index 287255c6a..4fe1544f5 100644 --- a/examples/data_loaders/load_data_duckdb.py +++ b/examples/data_loaders/load_data_duckdb.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import duckdb import pandas as pd diff --git a/examples/data_loaders/load_data_mock.py b/examples/data_loaders/load_data_mock.py index 1c7f3f9c8..5ddcfdfd5 100644 --- a/examples/data_loaders/load_data_mock.py +++ b/examples/data_loaders/load_data_mock.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np import pandas as pd diff --git a/examples/data_loaders/prep_data.py b/examples/data_loaders/prep_data.py index 6df203e82..987aa4d67 100644 --- a/examples/data_loaders/prep_data.py +++ b/examples/data_loaders/prep_data.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton.function_modifiers import does, extract_columns, parameterize, source, value diff --git a/examples/data_loaders/run.py b/examples/data_loaders/run.py index 088d71f67..d38b185f5 100644 --- a/examples/data_loaders/run.py +++ b/examples/data_loaders/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import click import load_data_csv import load_data_duckdb diff --git a/examples/data_quality/pandera/README.md b/examples/data_quality/pandera/README.md index f9679b502..025ea933f 100644 --- a/examples/data_quality/pandera/README.md +++ b/examples/data_quality/pandera/README.md @@ -1,3 +1,22 @@ + + # Pandera Data Quality Example Here we show how one can define some transformation logic that uses the new Apache Hamilton data quality feature with [Pandera](https://pandera.readthedocs.io/) In addition, we also show how you can manage execution on top of Ray, Pandas on Spark. diff --git a/examples/data_quality/pandera/data_loaders.py b/examples/data_quality/pandera/data_loaders.py index 152898ce6..52c821ac6 100644 --- a/examples/data_quality/pandera/data_loaders.py +++ b/examples/data_quality/pandera/data_loaders.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This module defines data loading logic that we'd like to apply. diff --git a/examples/data_quality/pandera/feature_logic.py b/examples/data_quality/pandera/feature_logic.py index 026ec7710..4060ecbc1 100644 --- a/examples/data_quality/pandera/feature_logic.py +++ b/examples/data_quality/pandera/feature_logic.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This modules shows how to use @check_output with Pandera (https://pandera.readthedocs.io/). diff --git a/examples/data_quality/pandera/feature_logic_spark.py b/examples/data_quality/pandera/feature_logic_spark.py index 8c818ca8e..aa6557bad 100644 --- a/examples/data_quality/pandera/feature_logic_spark.py +++ b/examples/data_quality/pandera/feature_logic_spark.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ We suggest you start by reading `pandera/feature_logic.py` before looking at this file. diff --git a/examples/data_quality/pandera/run.py b/examples/data_quality/pandera/run.py index 29e16ef70..1e818ff0b 100644 --- a/examples/data_quality/pandera/run.py +++ b/examples/data_quality/pandera/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This script runs a Hamilton DAG whose intent is to create some features for input to a model. The model fitting steps are not represented here, just the feature ingestion and transformation logic. diff --git a/examples/data_quality/pandera/run_dask.py b/examples/data_quality/pandera/run_dask.py index 30e497d43..bb5c2e038 100644 --- a/examples/data_quality/pandera/run_dask.py +++ b/examples/data_quality/pandera/run_dask.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This script runs a Hamilton DAG whose intent is to create some features for input to a model. The way the code is set up, is that you can do two things: diff --git a/examples/data_quality/pandera/run_ray.py b/examples/data_quality/pandera/run_ray.py index b2bc2321a..5e6524e8a 100644 --- a/examples/data_quality/pandera/run_ray.py +++ b/examples/data_quality/pandera/run_ray.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This script runs a Hamilton DAG whose intent is to create some features for input to a model. The way the code is set up, is that you can do one thing: diff --git a/examples/data_quality/pandera/run_spark.py b/examples/data_quality/pandera/run_spark.py index 03ad0afee..cc73fc02c 100644 --- a/examples/data_quality/pandera/run_spark.py +++ b/examples/data_quality/pandera/run_spark.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This script runs a Hamilton DAG whose intent is to create some features for input to a model. The way the code is set up, is that you can do one thing: diff --git a/examples/data_quality/simple/README.md b/examples/data_quality/simple/README.md index 3bc7cadcb..57b71a676 100644 --- a/examples/data_quality/simple/README.md +++ b/examples/data_quality/simple/README.md @@ -1,3 +1,22 @@ + + # Data Quality Example Here we show how one can define some transformation logic that uses the new data quality feature. In addition, we also show how you can manage execution on top of Ray, Pandas on Spark. diff --git a/examples/data_quality/simple/data_loaders.py b/examples/data_quality/simple/data_loaders.py index 5c284b904..bb1eb1120 100644 --- a/examples/data_quality/simple/data_loaders.py +++ b/examples/data_quality/simple/data_loaders.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This module defines data loading logic that we'd like to apply. diff --git a/examples/data_quality/simple/feature_logic.py b/examples/data_quality/simple/feature_logic.py index 60a67fd92..962b7c70e 100644 --- a/examples/data_quality/simple/feature_logic.py +++ b/examples/data_quality/simple/feature_logic.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This module defines some feature transformation logic that we'd like to apply. It then in addition, decorates the functions with @check_output, so that at runtime, we can diff --git a/examples/data_quality/simple/run.py b/examples/data_quality/simple/run.py index 29e16ef70..1e818ff0b 100644 --- a/examples/data_quality/simple/run.py +++ b/examples/data_quality/simple/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This script runs a Hamilton DAG whose intent is to create some features for input to a model. The model fitting steps are not represented here, just the feature ingestion and transformation logic. diff --git a/examples/data_quality/simple/run_dask.py b/examples/data_quality/simple/run_dask.py index d61c3db71..3febec7cf 100644 --- a/examples/data_quality/simple/run_dask.py +++ b/examples/data_quality/simple/run_dask.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This script runs a Hamilton DAG whose intent is to create some features for input to a model. The way the code is set up, is that you can do two things: diff --git a/examples/data_quality/simple/run_ray.py b/examples/data_quality/simple/run_ray.py index fa3300455..7c3739ed6 100644 --- a/examples/data_quality/simple/run_ray.py +++ b/examples/data_quality/simple/run_ray.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This script runs a Hamilton DAG whose intent is to create some features for input to a model. The way the code is set up, is that you can do one thing: diff --git a/examples/data_quality/simple/run_spark.py b/examples/data_quality/simple/run_spark.py index e370265af..5003f5ef9 100644 --- a/examples/data_quality/simple/run_spark.py +++ b/examples/data_quality/simple/run_spark.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This script runs a Hamilton DAG whose intent is to create some features for input to a model. The way the code is set up, is that you can do one thing: diff --git a/examples/dbt/README.md b/examples/dbt/README.md index 18df5b375..a141787be 100644 --- a/examples/dbt/README.md +++ b/examples/dbt/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton and DBT In this example, we're going to show you how easy it is to run Apache Hamilton inside a dbt task. Making use of DBT's exciting new diff --git a/examples/dbt/models/raw_passengers.sql b/examples/dbt/models/raw_passengers.sql index be7e08a94..0b892221c 100644 --- a/examples/dbt/models/raw_passengers.sql +++ b/examples/dbt/models/raw_passengers.sql @@ -1,3 +1,20 @@ +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. + /* Basic DBT model to load data from the duckdb table diff --git a/examples/dbt/models/train_and_infer.py b/examples/dbt/models/train_and_infer.py index 216cf313b..45bce6f19 100644 --- a/examples/dbt/models/train_and_infer.py +++ b/examples/dbt/models/train_and_infer.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from python_transforms import data_loader, feature_transforms, model_pipeline diff --git a/examples/dbt/python_transforms/data_loader.py b/examples/dbt/python_transforms/data_loader.py index e0eeba896..dfe8f3d72 100644 --- a/examples/dbt/python_transforms/data_loader.py +++ b/examples/dbt/python_transforms/data_loader.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This module contains our data loading functions. """ diff --git a/examples/dbt/python_transforms/feature_transforms.py b/examples/dbt/python_transforms/feature_transforms.py index 5feb3de41..04b71c708 100644 --- a/examples/dbt/python_transforms/feature_transforms.py +++ b/examples/dbt/python_transforms/feature_transforms.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This is a module that contains our feature transforms. """ diff --git a/examples/dbt/python_transforms/model_pipeline.py b/examples/dbt/python_transforms/model_pipeline.py index 1b30916c7..0c1695345 100644 --- a/examples/dbt/python_transforms/model_pipeline.py +++ b/examples/dbt/python_transforms/model_pipeline.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This is a module that contains our "model fitting and related" transforms. """ diff --git a/examples/decoupling_io/README.md b/examples/decoupling_io/README.md index b3f53d16a..8d42dd30d 100644 --- a/examples/decoupling_io/README.md +++ b/examples/decoupling_io/README.md @@ -1,3 +1,22 @@ + + # Get started This accompanies the blog post on decoupling IO from transformation: https://blog.dagworks.io/p/separate-data-io-from-transformation. diff --git a/examples/decoupling_io/adapters.py b/examples/decoupling_io/adapters.py index b7e6d515f..e26060367 100644 --- a/examples/decoupling_io/adapters.py +++ b/examples/decoupling_io/adapters.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import dataclasses from os import PathLike from typing import Any, Collection, Dict, Optional, Type, Union diff --git a/examples/decoupling_io/components/feature_data.py b/examples/decoupling_io/components/feature_data.py index 788c875f4..fa63368fe 100644 --- a/examples/decoupling_io/components/feature_data.py +++ b/examples/decoupling_io/components/feature_data.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This is a module that contains our feature transforms. """ diff --git a/examples/decoupling_io/components/model_evaluation.py b/examples/decoupling_io/components/model_evaluation.py index 3cc1b42ec..9ff2944fa 100644 --- a/examples/decoupling_io/components/model_evaluation.py +++ b/examples/decoupling_io/components/model_evaluation.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np import pandas as pd from sklearn import base, metrics diff --git a/examples/decoupling_io/components/model_training.py b/examples/decoupling_io/components/model_training.py index d1e7806f7..44fee2df4 100644 --- a/examples/decoupling_io/components/model_training.py +++ b/examples/decoupling_io/components/model_training.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This is a module that contains our "model fitting and related" transforms. """ diff --git a/examples/decoupling_io/run.py b/examples/decoupling_io/run.py index ac890d9ad..4a9d1e4d8 100644 --- a/examples/decoupling_io/run.py +++ b/examples/decoupling_io/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + # Since this is not in plugins we need to import it *before* doing anything else import importlib from typing import List, Union diff --git a/examples/dlt/README.md b/examples/dlt/README.md index 094505884..0017c5b3b 100644 --- a/examples/dlt/README.md +++ b/examples/dlt/README.md @@ -1,3 +1,22 @@ + + # dlt This example shows dlt + Apache Hamilton can help you cover the full ELT cycle using portable Python code. It is a companion to this [documentation page](https://hamilton.apache.org/integrations/dlt/). diff --git a/examples/dlt/dlt_plugin.ipynb b/examples/dlt/dlt_plugin.ipynb index f3e34577c..09d215c9c 100644 --- a/examples/dlt/dlt_plugin.ipynb +++ b/examples/dlt/dlt_plugin.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/dlt/notebook.ipynb b/examples/dlt/notebook.ipynb index a399bd088..a784e7cb7 100644 --- a/examples/dlt/notebook.ipynb +++ b/examples/dlt/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/dlt/run.py b/examples/dlt/run.py index 876dc3f30..cdcbc5e2f 100644 --- a/examples/dlt/run.py +++ b/examples/dlt/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import os import dlt diff --git a/examples/dlt/slack/README.md b/examples/dlt/slack/README.md index 5ddc90454..19e623db0 100644 --- a/examples/dlt/slack/README.md +++ b/examples/dlt/slack/README.md @@ -1,3 +1,22 @@ + + --- title: Slack description: dlt source for Slack API diff --git a/examples/dlt/slack/helpers.py b/examples/dlt/slack/helpers.py index 83078e7f7..519c6a338 100644 --- a/examples/dlt/slack/helpers.py +++ b/examples/dlt/slack/helpers.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Slack source helpers.""" from typing import Any, Generator, Iterable, List, Optional diff --git a/examples/dlt/slack/settings.py b/examples/dlt/slack/settings.py index 34040a9d7..1b6d8e4c6 100644 --- a/examples/dlt/slack/settings.py +++ b/examples/dlt/slack/settings.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Slack source settings and constants""" from dlt.common import pendulum diff --git a/examples/dlt/transform.py b/examples/dlt/transform.py index d8c7a1f29..e3baa851f 100644 --- a/examples/dlt/transform.py +++ b/examples/dlt/transform.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import textwrap import dlt diff --git a/examples/due_date_probabilities/README.md b/examples/due_date_probabilities/README.md index 1c0a1d12a..c7ce2f322 100644 --- a/examples/due_date_probabilities/README.md +++ b/examples/due_date_probabilities/README.md @@ -1,3 +1,22 @@ + + # Modeling Pregnancy Due Dates using Apache Hamilton This is an example of developing and applying a simple statistical model using Apache Hamilton diff --git a/examples/due_date_probabilities/base_dates.py b/examples/due_date_probabilities/base_dates.py index d14fa3b75..85df866ed 100644 --- a/examples/due_date_probabilities/base_dates.py +++ b/examples/due_date_probabilities/base_dates.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import datetime import pandas as pd diff --git a/examples/due_date_probabilities/notebook.ipynb b/examples/due_date_probabilities/notebook.ipynb index 6c4879bc3..a4ed3fa67 100644 --- a/examples/due_date_probabilities/notebook.ipynb +++ b/examples/due_date_probabilities/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/due_date_probabilities/probabilities.py b/examples/due_date_probabilities/probabilities.py index 8f55fb821..832cf8d28 100644 --- a/examples/due_date_probabilities/probabilities.py +++ b/examples/due_date_probabilities/probabilities.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import datetime from typing import Optional diff --git a/examples/due_date_probabilities/probability_estimation.py b/examples/due_date_probabilities/probability_estimation.py index 5c673e5ed..a3878750a 100644 --- a/examples/due_date_probabilities/probability_estimation.py +++ b/examples/due_date_probabilities/probability_estimation.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import List import pandas as pd diff --git a/examples/experiment_management/README.md b/examples/experiment_management/README.md index 355165d15..2e6eea4f2 100644 --- a/examples/experiment_management/README.md +++ b/examples/experiment_management/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton Experiment Manager Add a hook to your Apache Hamilton Driver to log runs and visualize artifacts and metadata! The server is built using FastAPI + FastUI allowing to easily integrate the server within your app or extend the UI. diff --git a/examples/experiment_management/analysis.py b/examples/experiment_management/analysis.py index d0d1b8bb2..457648836 100644 --- a/examples/experiment_management/analysis.py +++ b/examples/experiment_management/analysis.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import matplotlib.pyplot as plt import numpy as np import pandas as pd diff --git a/examples/experiment_management/notebook.ipynb b/examples/experiment_management/notebook.ipynb index 510f30a08..f4466fbe7 100644 --- a/examples/experiment_management/notebook.ipynb +++ b/examples/experiment_management/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/experiment_management/run.py b/examples/experiment_management/run.py index 37526e34b..70946d6f2 100644 --- a/examples/experiment_management/run.py +++ b/examples/experiment_management/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import analysis from hamilton import base, driver diff --git a/examples/feast/README.md b/examples/feast/README.md index a9ec5cef1..7b4001f7c 100644 --- a/examples/feast/README.md +++ b/examples/feast/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton + Feast In this example, we're going to show you how Apache Hamilton can help you structure your Feast repository and bring tighter coupling between your feature transformations (code) and feature store (data). diff --git a/examples/feast/default_feature_store/README.md b/examples/feast/default_feature_store/README.md index 1544ff1c7..8317f236c 100644 --- a/examples/feast/default_feature_store/README.md +++ b/examples/feast/default_feature_store/README.md @@ -1,3 +1,22 @@ + + # Context Anything in the directory `/default_feature_store`, including the rest of this `README` was generated with the CLI command `feast init default_feature_store`, which creates a Feast quickstart example. This example can provide useful information to new Feast users and serve as a comparison point to integrations with Apache Hamilton. The directory `/simple_feature_store` is reimplements 1-to-1 the functionalities from this directory. diff --git a/examples/feast/default_feature_store/feature_repo/example_repo.py b/examples/feast/default_feature_store/feature_repo/example_repo.py index 47f6a45c5..204ee6c9f 100644 --- a/examples/feast/default_feature_store/feature_repo/example_repo.py +++ b/examples/feast/default_feature_store/feature_repo/example_repo.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + # This is an example feature definition file from datetime import timedelta diff --git a/examples/feast/default_feature_store/feature_repo/test_workflow.py b/examples/feast/default_feature_store/feature_repo/test_workflow.py index bb54735f9..40076dc64 100644 --- a/examples/feast/default_feature_store/feature_repo/test_workflow.py +++ b/examples/feast/default_feature_store/feature_repo/test_workflow.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import subprocess from datetime import datetime diff --git a/examples/feast/integration_feature_store/feature_repo/demo_inputs.py b/examples/feast/integration_feature_store/feature_repo/demo_inputs.py index c13d032a3..9c5da0876 100644 --- a/examples/feast/integration_feature_store/feature_repo/demo_inputs.py +++ b/examples/feast/integration_feature_store/feature_repo/demo_inputs.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """This module defines example inputs to use with Feast feature retrieval patterns""" from datetime import datetime diff --git a/examples/feast/integration_feature_store/feature_repo/feature_transformations.py b/examples/feast/integration_feature_store/feature_repo/feature_transformations.py index da1fc741e..f5ba9c505 100644 --- a/examples/feast/integration_feature_store/feature_repo/feature_transformations.py +++ b/examples/feast/integration_feature_store/feature_repo/feature_transformations.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np import pandas as pd diff --git a/examples/feast/integration_feature_store/feature_repo/retrieval.ipynb b/examples/feast/integration_feature_store/feature_repo/retrieval.ipynb index 2f75af7b8..1b702f6b1 100644 --- a/examples/feast/integration_feature_store/feature_repo/retrieval.ipynb +++ b/examples/feast/integration_feature_store/feature_repo/retrieval.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/feast/integration_feature_store/feature_repo/run.py b/examples/feast/integration_feature_store/feature_repo/run.py index 178b446d0..5ccb3f502 100644 --- a/examples/feast/integration_feature_store/feature_repo/run.py +++ b/examples/feast/integration_feature_store/feature_repo/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import store_definitions import store_operations diff --git a/examples/feast/integration_feature_store/feature_repo/store_definitions.py b/examples/feast/integration_feature_store/feature_repo/store_definitions.py index 0b9f8f927..5789b24cd 100644 --- a/examples/feast/integration_feature_store/feature_repo/store_definitions.py +++ b/examples/feast/integration_feature_store/feature_repo/store_definitions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """This module contains the definitions of Feast objects pushed to the registry It allows you to define your Feast objects dependencies as a Hamilton DAG and create lineage with your feature transforms defined in Hamilton. diff --git a/examples/feast/integration_feature_store/feature_repo/store_operations.py b/examples/feast/integration_feature_store/feature_repo/store_operations.py index b9f78b7e3..1f9ca83ea 100644 --- a/examples/feast/integration_feature_store/feature_repo/store_operations.py +++ b/examples/feast/integration_feature_store/feature_repo/store_operations.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """This module contains the operations to execute on the Feast FeatureStore""" from datetime import datetime diff --git a/examples/feast/simple_feature_store/feature_repo/demo_inputs.py b/examples/feast/simple_feature_store/feature_repo/demo_inputs.py index c13d032a3..9c5da0876 100644 --- a/examples/feast/simple_feature_store/feature_repo/demo_inputs.py +++ b/examples/feast/simple_feature_store/feature_repo/demo_inputs.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """This module defines example inputs to use with Feast feature retrieval patterns""" from datetime import datetime diff --git a/examples/feast/simple_feature_store/feature_repo/run.py b/examples/feast/simple_feature_store/feature_repo/run.py index 95f69cd4f..b4c74ab87 100644 --- a/examples/feast/simple_feature_store/feature_repo/run.py +++ b/examples/feast/simple_feature_store/feature_repo/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import store_definitions import store_operations diff --git a/examples/feast/simple_feature_store/feature_repo/store_definitions.py b/examples/feast/simple_feature_store/feature_repo/store_definitions.py index c3aa66b3b..74bdae40d 100644 --- a/examples/feast/simple_feature_store/feature_repo/store_definitions.py +++ b/examples/feast/simple_feature_store/feature_repo/store_definitions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """This module contains the definitions of Feast objects pushed to the registry It allows you to define your Feast objects dependencies as a Hamilton DAG """ diff --git a/examples/feast/simple_feature_store/feature_repo/store_operations.py b/examples/feast/simple_feature_store/feature_repo/store_operations.py index 308f5430a..e86f3de00 100644 --- a/examples/feast/simple_feature_store/feature_repo/store_operations.py +++ b/examples/feast/simple_feature_store/feature_repo/store_operations.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """This module contains the operations to execute on the Feast FeatureStore""" from datetime import datetime diff --git a/examples/feature_engineering/README.md b/examples/feature_engineering/README.md index d95042df9..8dfb9202c 100644 --- a/examples/feature_engineering/README.md +++ b/examples/feature_engineering/README.md @@ -1,3 +1,22 @@ + + # Feature Engineering Here you'll find two examples. diff --git a/examples/feature_engineering/feature_engineering_multiple_contexts/README.md b/examples/feature_engineering/feature_engineering_multiple_contexts/README.md index 6e6f8c30a..116b92ad0 100644 --- a/examples/feature_engineering/feature_engineering_multiple_contexts/README.md +++ b/examples/feature_engineering/feature_engineering_multiple_contexts/README.md @@ -1,3 +1,22 @@ + + # Feature Engineering in Multiple Contexts What is feature engineering? It's the process of transforming data for input to a "model". diff --git a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/README.md b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/README.md index 2cb0e3c21..b8666b1be 100644 --- a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/README.md +++ b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/README.md @@ -1,3 +1,22 @@ + + # Scenario 1: the simple case - ETL + Online API Context required to understand this scenario: diff --git a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/etl.py b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/etl.py index 38d31b9cd..0dcd15fc6 100644 --- a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/etl.py +++ b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/etl.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This is part of an offline ETL that you'd likely have. You pull data from a source, and transform it into features, and then save/fit a model with them. diff --git a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/fastapi_server.py b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/fastapi_server.py index 296c906d1..7d518ceee 100644 --- a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/fastapi_server.py +++ b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/fastapi_server.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ " This is a simple example of a FastAPI server that uses Hamilton on the request path to transform the data into features, and then uses a fake model to make diff --git a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/features.py b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/features.py index 03fa20d91..de02b9282 100644 --- a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/features.py +++ b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/features.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Here are some features that are based on the absenteeism data set. They are just supposed to be illustrative of the kind of features one might have. diff --git a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/named_model_feature_sets.py b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/named_model_feature_sets.py index bb1be2b48..a85793fb4 100644 --- a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/named_model_feature_sets.py +++ b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/named_model_feature_sets.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This module is a light weight way to "record" feature sets that are used in a model; just define it in code! diff --git a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/offline_loader.py b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/offline_loader.py index 00a983c3d..a2564aa74 100644 --- a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/offline_loader.py +++ b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_1/offline_loader.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Module that contains logic to load data for the offline ETL process. diff --git a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/README.md b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/README.md index ccc8d20ac..6d3f7c6a1 100644 --- a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/README.md +++ b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/README.md @@ -1,3 +1,22 @@ + + # Scenario 2: the more complex case - request doesn't have the raw data - ETL + Online API Context required to understand this scenario: diff --git a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/etl.py b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/etl.py index 3eabf83f9..1c2a02c8d 100644 --- a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/etl.py +++ b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/etl.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This is part of an offline ETL that you'd likely have. You pull data from a source, and transform it into features, and then save/fit a model with them. diff --git a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/fastapi_server.py b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/fastapi_server.py index 6711cbaae..805c66b6c 100644 --- a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/fastapi_server.py +++ b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/fastapi_server.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ " This is a simple example of a FastAPI server that uses Hamilton on the request path to transform the data into features, and then uses a fake model to make diff --git a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/features.py b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/features.py index a006759c1..1ea8f800f 100644 --- a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/features.py +++ b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/features.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Here are some features that are based on the absenteeism data set. They are just supposed to be illustrative of the kind of features one might have. diff --git a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/named_model_feature_sets.py b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/named_model_feature_sets.py index bb1be2b48..a85793fb4 100644 --- a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/named_model_feature_sets.py +++ b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/named_model_feature_sets.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This module is a light weight way to "record" feature sets that are used in a model; just define it in code! diff --git a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/offline_loader.py b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/offline_loader.py index ac50159b1..a62bff3d2 100644 --- a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/offline_loader.py +++ b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/offline_loader.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Module that contains logic to load data for the offline ETL process. diff --git a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/online_loader.py b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/online_loader.py index 1a389e2f2..7e3f06157 100644 --- a/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/online_loader.py +++ b/examples/feature_engineering/feature_engineering_multiple_contexts/scenario_2/online_loader.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Module that contains logic to load data for the offline ETL process. diff --git a/examples/feature_engineering/write_once_run_everywhere_blog_post/README.md b/examples/feature_engineering/write_once_run_everywhere_blog_post/README.md index a5a246784..8ffcb22b8 100644 --- a/examples/feature_engineering/write_once_run_everywhere_blog_post/README.md +++ b/examples/feature_engineering/write_once_run_everywhere_blog_post/README.md @@ -1,3 +1,22 @@ + + # Overview This code accompanies the ["Write once, run everywhere" blog post](https://blog.dagworks.io/p/feature-engineering-with-hamilton). diff --git a/examples/feature_engineering/write_once_run_everywhere_blog_post/components/aggregations.py b/examples/feature_engineering/write_once_run_everywhere_blog_post/components/aggregations.py index db95847da..5885d3fa4 100644 --- a/examples/feature_engineering/write_once_run_everywhere_blog_post/components/aggregations.py +++ b/examples/feature_engineering/write_once_run_everywhere_blog_post/components/aggregations.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from components import utils diff --git a/examples/feature_engineering/write_once_run_everywhere_blog_post/components/data_loaders.py b/examples/feature_engineering/write_once_run_everywhere_blog_post/components/data_loaders.py index d83b32955..56e1726ae 100644 --- a/examples/feature_engineering/write_once_run_everywhere_blog_post/components/data_loaders.py +++ b/examples/feature_engineering/write_once_run_everywhere_blog_post/components/data_loaders.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from components import utils diff --git a/examples/feature_engineering/write_once_run_everywhere_blog_post/components/features.py b/examples/feature_engineering/write_once_run_everywhere_blog_post/components/features.py index 86155d8f7..fc704f9f9 100644 --- a/examples/feature_engineering/write_once_run_everywhere_blog_post/components/features.py +++ b/examples/feature_engineering/write_once_run_everywhere_blog_post/components/features.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from datetime import datetime import pandas as pd diff --git a/examples/feature_engineering/write_once_run_everywhere_blog_post/components/joins.py b/examples/feature_engineering/write_once_run_everywhere_blog_post/components/joins.py index 49da27af7..85df06b44 100644 --- a/examples/feature_engineering/write_once_run_everywhere_blog_post/components/joins.py +++ b/examples/feature_engineering/write_once_run_everywhere_blog_post/components/joins.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton.function_modifiers import config diff --git a/examples/feature_engineering/write_once_run_everywhere_blog_post/components/model.py b/examples/feature_engineering/write_once_run_everywhere_blog_post/components/model.py index a94fc41ff..f3592c571 100644 --- a/examples/feature_engineering/write_once_run_everywhere_blog_post/components/model.py +++ b/examples/feature_engineering/write_once_run_everywhere_blog_post/components/model.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import random import pandas as pd diff --git a/examples/feature_engineering/write_once_run_everywhere_blog_post/components/utils.py b/examples/feature_engineering/write_once_run_everywhere_blog_post/components/utils.py index c7c2d0c3d..205ff6dfa 100644 --- a/examples/feature_engineering/write_once_run_everywhere_blog_post/components/utils.py +++ b/examples/feature_engineering/write_once_run_everywhere_blog_post/components/utils.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import random from typing import List diff --git a/examples/feature_engineering/write_once_run_everywhere_blog_post/contexts/batch.py b/examples/feature_engineering/write_once_run_everywhere_blog_post/contexts/batch.py index 761cec6cb..5daf9c422 100644 --- a/examples/feature_engineering/write_once_run_everywhere_blog_post/contexts/batch.py +++ b/examples/feature_engineering/write_once_run_everywhere_blog_post/contexts/batch.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import datetime import click diff --git a/examples/feature_engineering/write_once_run_everywhere_blog_post/contexts/online.py b/examples/feature_engineering/write_once_run_everywhere_blog_post/contexts/online.py index f91658c29..53f18e348 100644 --- a/examples/feature_engineering/write_once_run_everywhere_blog_post/contexts/online.py +++ b/examples/feature_engineering/write_once_run_everywhere_blog_post/contexts/online.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from datetime import datetime import click diff --git a/examples/feature_engineering/write_once_run_everywhere_blog_post/contexts/streaming.py b/examples/feature_engineering/write_once_run_everywhere_blog_post/contexts/streaming.py index 20ddacbdf..482df044f 100644 --- a/examples/feature_engineering/write_once_run_everywhere_blog_post/contexts/streaming.py +++ b/examples/feature_engineering/write_once_run_everywhere_blog_post/contexts/streaming.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ To run this you need to run it as a module via bytewax. diff --git a/examples/hamilton-tutorials/mpg-translation/MPGSimple.ipynb b/examples/hamilton-tutorials/mpg-translation/MPGSimple.ipynb index 16ae419dd..3c0f674e7 100644 --- a/examples/hamilton-tutorials/mpg-translation/MPGSimple.ipynb +++ b/examples/hamilton-tutorials/mpg-translation/MPGSimple.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/hamilton-tutorials/mpg-translation/MPGSimpleAdvancedTarget.ipynb b/examples/hamilton-tutorials/mpg-translation/MPGSimpleAdvancedTarget.ipynb index 048adfea4..8b4c47319 100644 --- a/examples/hamilton-tutorials/mpg-translation/MPGSimpleAdvancedTarget.ipynb +++ b/examples/hamilton-tutorials/mpg-translation/MPGSimpleAdvancedTarget.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/hamilton-tutorials/mpg-translation/MPGSimpleTarget.ipynb b/examples/hamilton-tutorials/mpg-translation/MPGSimpleTarget.ipynb index 45dbe2e5c..752953e1e 100644 --- a/examples/hamilton-tutorials/mpg-translation/MPGSimpleTarget.ipynb +++ b/examples/hamilton-tutorials/mpg-translation/MPGSimpleTarget.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/hamilton-tutorials/mpg-translation/ProceduralMPGNotebook.ipynb b/examples/hamilton-tutorials/mpg-translation/ProceduralMPGNotebook.ipynb index 9b8900e52..9402b6078 100644 --- a/examples/hamilton-tutorials/mpg-translation/ProceduralMPGNotebook.ipynb +++ b/examples/hamilton-tutorials/mpg-translation/ProceduralMPGNotebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/hamilton-tutorials/mpg-translation/README.md b/examples/hamilton-tutorials/mpg-translation/README.md index c12bad921..a01432cc7 100644 --- a/examples/hamilton-tutorials/mpg-translation/README.md +++ b/examples/hamilton-tutorials/mpg-translation/README.md @@ -1,3 +1,22 @@ + + # Translation exercise This is a tutorial that one can use to help people grok Apache Hamilton. diff --git a/examples/hamilton-tutorials/mpg-translation/mpg_pipeline.py b/examples/hamilton-tutorials/mpg-translation/mpg_pipeline.py index 0cbdba873..0f2f8c750 100644 --- a/examples/hamilton-tutorials/mpg-translation/mpg_pipeline.py +++ b/examples/hamilton-tutorials/mpg-translation/mpg_pipeline.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np # noqa: F401 import pandas as pd # noqa: F401 from sklearn.linear_model import LinearRegression # noqa: F401 diff --git a/examples/hamilton-tutorials/mpg-translation/mpg_pipeline_advanced_target.py b/examples/hamilton-tutorials/mpg-translation/mpg_pipeline_advanced_target.py index a17cd5215..5848b7ba7 100644 --- a/examples/hamilton-tutorials/mpg-translation/mpg_pipeline_advanced_target.py +++ b/examples/hamilton-tutorials/mpg-translation/mpg_pipeline_advanced_target.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression diff --git a/examples/hamilton-tutorials/mpg-translation/mpg_pipeline_target.py b/examples/hamilton-tutorials/mpg-translation/mpg_pipeline_target.py index f021103db..593a5a0b8 100644 --- a/examples/hamilton-tutorials/mpg-translation/mpg_pipeline_target.py +++ b/examples/hamilton-tutorials/mpg-translation/mpg_pipeline_target.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression diff --git a/examples/hamilton-tutorials/mpg-translation/mpg_script.py b/examples/hamilton-tutorials/mpg-translation/mpg_script.py index d213e4eb0..2cc5ffc89 100644 --- a/examples/hamilton-tutorials/mpg-translation/mpg_script.py +++ b/examples/hamilton-tutorials/mpg-translation/mpg_script.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression diff --git a/examples/hamilton_ui/README.md b/examples/hamilton_ui/README.md index ec414c028..ae6e7fbf6 100644 --- a/examples/hamilton_ui/README.md +++ b/examples/hamilton_ui/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton UI - Machine learning example Learn how to use the `HamiltonTracker` and the Apache Hamilton UI to track a simple machine learning pipeline. diff --git a/examples/hamilton_ui/components/feature_transforms.py b/examples/hamilton_ui/components/feature_transforms.py index 829d5b8f1..59857288b 100644 --- a/examples/hamilton_ui/components/feature_transforms.py +++ b/examples/hamilton_ui/components/feature_transforms.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Module to transform iris data into features. """ diff --git a/examples/hamilton_ui/components/iris_loader.py b/examples/hamilton_ui/components/iris_loader.py index 5aa75408a..9db00b93a 100644 --- a/examples/hamilton_ui/components/iris_loader.py +++ b/examples/hamilton_ui/components/iris_loader.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Module to load iris data. """ diff --git a/examples/hamilton_ui/components/model_fitting.py b/examples/hamilton_ui/components/model_fitting.py index 778436312..f12b57bc7 100644 --- a/examples/hamilton_ui/components/model_fitting.py +++ b/examples/hamilton_ui/components/model_fitting.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """This module contains basic code for model fitting.""" from typing import Dict diff --git a/examples/hamilton_ui/components/models.py b/examples/hamilton_ui/components/models.py index 6c4e056de..403b39b7a 100644 --- a/examples/hamilton_ui/components/models.py +++ b/examples/hamilton_ui/components/models.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """This module contains specific incarnations of models.""" from sklearn import base diff --git a/examples/hamilton_ui/notebook.ipynb b/examples/hamilton_ui/notebook.ipynb index a14664cfd..1ab079965 100644 --- a/examples/hamilton_ui/notebook.ipynb +++ b/examples/hamilton_ui/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/hamilton_ui/run.py b/examples/hamilton_ui/run.py index 2799d78aa..e1fbb711a 100644 --- a/examples/hamilton_ui/run.py +++ b/examples/hamilton_ui/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import click from components import feature_transforms, iris_loader, models diff --git a/examples/hello_world/README.md b/examples/hello_world/README.md index d2fcf27c1..bb4027b0e 100644 --- a/examples/hello_world/README.md +++ b/examples/hello_world/README.md @@ -1,3 +1,22 @@ + + # Classic Apache Hamilton Hello World In this example we show you how to create a simple hello world dataflow that diff --git a/examples/hello_world/my_dag.png b/examples/hello_world/my_dag.png index 77e64e4258cb1665b8e0886b9c4e8d1378bc4ca4..4f9bb2925ce853da1654ea4e8b61426c0f091bb2 100644 GIT binary patch literal 63764 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

k^KqXPTu4!G6u$LN_ZO$+r<|RBN>J<6mU2edNRI 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�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 z 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�{dBvtj92IFE?gM@b$Rl4N`JL4=`kgR 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

PO~D}W9fV#SB`~5bfmf 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Ġ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 + # Vaex Example This is a simple example taking the Apache Hamilton hello world and converting it to run with Vaex. diff --git a/examples/vaex/my_functions.py b/examples/vaex/my_functions.py index f45dfcb37..0d2615f75 100644 --- a/examples/vaex/my_functions.py +++ b/examples/vaex/my_functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np import pandas as pd import vaex diff --git a/examples/vaex/my_script.py b/examples/vaex/my_script.py index eb5464ca8..2190ff14e 100644 --- a/examples/vaex/my_script.py +++ b/examples/vaex/my_script.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging import sys diff --git a/examples/vaex/notebook.ipynb b/examples/vaex/notebook.ipynb index a375d2b65..624a9f870 100644 --- a/examples/vaex/notebook.ipynb +++ b/examples/vaex/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/validate_examples.py b/examples/validate_examples.py index 5ccf69868..133f0bcec 100644 --- a/examples/validate_examples.py +++ b/examples/validate_examples.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from __future__ import annotations import argparse @@ -35,16 +52,23 @@ def validate_notebook(notebook_path: pathlib.Path) -> int: in Google Colab, and that the second cell has badges to open the notebook in Google Colab and view the source on GitHub. + This function handles notebooks with or without Apache license headers: + - If first cell is Apache license (markdown): check cells 2 and 3 + - Otherwise: check cells 1 and 2 (original behavior) + NOTE. For faster notebook startup (especially on Colab), we should disable plugin autoloading .. code-block:: python - #%% CELL_1 + #%% CELL_1 (optional) + # Apache License header (markdown) + + #%% CELL_2 (or CELL_1 if no license) # Execute this cell to install dependencies %pip install sf-hamilton[visualization] matplotlib - #%% CELL_2 + #%% CELL_3 (or CELL_2 if no license) # Title of the notebook ![Colab badge](colab_url) ![GitHub badge](github_url) """ @@ -57,7 +81,6 @@ def validate_notebook(notebook_path: pathlib.Path) -> int: return FAILURE first_cell = notebook.cells[0] - second_cell = notebook.cells[1] issues = [] @@ -66,29 +89,54 @@ def validate_notebook(notebook_path: pathlib.Path) -> int: logger.info(f"Ignoring because path is excluded: `{notebook_path}`") return SUCCESS - if first_cell.cell_type != "code": - issues.append("The first cell should be a code cell to set up the notebook.") - RETURN_VALUE |= FAILURE + # Check if the first cell is an Apache license header + has_license_header = ( + first_cell.cell_type == "markdown" and "Apache License" in first_cell.source + ) - if "%pip install" not in first_cell.source: - issues.append( - "In the first cell, use the `%pip` magic to install dependencies for the notebook." - ) + # Determine which cells to check based on whether there's a license header + if has_license_header: + # License header present: check cells 2 and 3 (indices 1 and 2) + setup_cell = notebook.cells[1] if len(notebook.cells) > 1 else None + title_cell = notebook.cells[2] if len(notebook.cells) > 2 else None + else: + # No license header: check cells 1 and 2 (indices 0 and 1) - original behavior + setup_cell = first_cell + title_cell = notebook.cells[1] if len(notebook.cells) > 1 else None + + # Validate setup cell + if setup_cell is None: + issues.append("Notebook must have at least a setup cell.") RETURN_VALUE |= FAILURE - - if second_cell.cell_type != "markdown": - issues.append( - "The second cell should be markdown with the title, badges, and introduction." - ) + else: + if setup_cell.cell_type != "code": + issues.append("The setup cell should be a code cell.") + RETURN_VALUE |= FAILURE + + if "%pip install" not in setup_cell.source: + issues.append( + "In the setup cell, use the `%pip` magic to install dependencies for the notebook." + ) + RETURN_VALUE |= FAILURE + + # Validate title cell + if title_cell is None: + issues.append("Notebook must have a title cell.") RETURN_VALUE |= FAILURE + else: + if title_cell.cell_type != "markdown": + issues.append( + "The title cell should be markdown with the title, badges, and introduction." + ) + RETURN_VALUE |= FAILURE - if _create_colab_badge(notebook_path) not in second_cell.source: - issues.append("Missing badge to open notebook in Google Colab.") - RETURN_VALUE |= FAILURE + if _create_colab_badge(notebook_path) not in title_cell.source: + issues.append("Missing badge to open notebook in Google Colab.") + RETURN_VALUE |= FAILURE - if _create_github_badge(notebook_path) not in second_cell.source: - issues.append("Missing badge to view source on GitHub.") - RETURN_VALUE |= FAILURE + if _create_github_badge(notebook_path) not in title_cell.source: + issues.append("Missing badge to view source on GitHub.") + RETURN_VALUE |= FAILURE if RETURN_VALUE == FAILURE: joined_issues = "\n\t".join(issues) @@ -98,18 +146,32 @@ def validate_notebook(notebook_path: pathlib.Path) -> int: def insert_setup_cell(path: pathlib.Path): - """Insert a setup cell at the top of a notebook. + """Insert a setup cell at the top of a notebook (or after license header if present). Calling this multiple times will add multiple setup cells. - This should be called before adding badges to the second cell, + This should be called before adding badges to the title cell, which is expected to be markdown. + + If the first cell is an Apache license header (markdown), the setup cell + is inserted at position 1 (after the license). Otherwise, it's inserted at position 0. """ notebook = nbformat.read(path, as_version=4) setup_cell = nbformat.v4.new_code_cell( "# Execute this cell to install dependencies\n%pip install sf-hamilton[visualization]" ) - notebook.cells.insert(0, setup_cell) + + # Check if first cell is a license header + first_cell = notebook.cells[0] if len(notebook.cells) > 0 else None + has_license_header = ( + first_cell is not None + and first_cell.cell_type == "markdown" + and "Apache License" in first_cell.source + ) + + # Insert after license header if present, otherwise at the beginning + insert_position = 1 if has_license_header else 0 + notebook.cells.insert(insert_position, setup_cell) # cleanup required to avoid nbformat warnings for cell in notebook.cells: @@ -120,24 +182,42 @@ def insert_setup_cell(path: pathlib.Path): def add_badges_to_title(path: pathlib.Path): - """Add badges to the second cell of the notebook. + """Add badges to the title cell of the notebook. + + This should be called after inserting the setup cell. - This should be called after inserting the setup cell, - which should be the first cell of the notebook. + The title cell is expected to be: + - Cell 2 (index 2) if there's a license header at cell 0 + - Cell 1 (index 1) if there's no license header """ notebook = nbformat.read(path, as_version=4) - if notebook.cells[1].cell_type != "markdown": + + # Check if first cell is a license header + first_cell = notebook.cells[0] if len(notebook.cells) > 0 else None + has_license_header = ( + first_cell is not None + and first_cell.cell_type == "markdown" + and "Apache License" in first_cell.source + ) + + # Determine which cell is the title cell + title_cell_index = 2 if has_license_header else 1 + + if len(notebook.cells) <= title_cell_index: + return + + if notebook.cells[title_cell_index].cell_type != "markdown": return updated_content = "" - for idx, line in enumerate(notebook.cells[1].source.splitlines()): + for idx, line in enumerate(notebook.cells[title_cell_index].source.splitlines()): if idx == 0: updated_content += f"{line} {_create_colab_badge(path)} {_create_github_badge(path)}\n" else: updated_content += f"\n{line}" - notebook.cells[1].update(source=updated_content) + notebook.cells[title_cell_index].update(source=updated_content) nbformat.write(notebook, path) diff --git a/examples/validation/static_validator/README.md b/examples/validation/static_validator/README.md index 7af314e35..6f3b12d39 100644 --- a/examples/validation/static_validator/README.md +++ b/examples/validation/static_validator/README.md @@ -1,3 +1,22 @@ + + # Example showing graph validation This uses the StaticValidator class to validate a graph. diff --git a/examples/validation/static_validator/bad_module.py b/examples/validation/static_validator/bad_module.py index 776c9898a..6a0334c94 100644 --- a/examples/validation/static_validator/bad_module.py +++ b/examples/validation/static_validator/bad_module.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from hamilton.function_modifiers import tag diff --git a/examples/validation/static_validator/good_module.py b/examples/validation/static_validator/good_module.py index 8621c354b..fe7664752 100644 --- a/examples/validation/static_validator/good_module.py +++ b/examples/validation/static_validator/good_module.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from hamilton.function_modifiers import tag diff --git a/examples/validation/static_validator/notebook.ipynb b/examples/validation/static_validator/notebook.ipynb index 9749db75f..c3da8162e 100644 --- a/examples/validation/static_validator/notebook.ipynb +++ b/examples/validation/static_validator/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/validation/static_validator/run.py b/examples/validation/static_validator/run.py index 8d9183ce8..fbee74a65 100644 --- a/examples/validation/static_validator/run.py +++ b/examples/validation/static_validator/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Optional from hamilton.graph_types import HamiltonNode diff --git a/scripts/add_license_headers.py b/scripts/add_license_headers.py new file mode 100755 index 000000000..c234d5a12 --- /dev/null +++ b/scripts/add_license_headers.py @@ -0,0 +1,297 @@ +#!/usr/bin/env python3 +"""Script to add Apache 2 license headers to files in the Hamilton repository.""" + +import json +import sys +from pathlib import Path +from typing import List + +# Apache 2 license header for Python files +PYTHON_LICENSE_HEADER = """# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +""" + +# Apache 2 license header for Markdown files (using HTML comments) +MARKDOWN_LICENSE_HEADER = """ + +""" + +# Apache 2 license header text for Jupyter notebooks (as markdown cell content) +NOTEBOOK_LICENSE_TEXT = """Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License.""" + +# Apache 2 license header for SQL files (using -- comments) +SQL_LICENSE_HEADER = """-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. + +""" + + +def add_license_to_python(file_path: Path, content: str) -> str: + """Add Apache 2 license header to Python file content.""" + # Handle shebang lines - preserve them at the top + lines = content.split("\n", 1) + if lines[0].startswith("#!"): + # File has shebang, add license after it + if len(lines) > 1: + return lines[0] + "\n" + PYTHON_LICENSE_HEADER + lines[1] + else: + return lines[0] + "\n" + PYTHON_LICENSE_HEADER + else: + # No shebang, add license at the beginning + return PYTHON_LICENSE_HEADER + content + + +def add_license_to_markdown(file_path: Path, content: str) -> str: + """Add Apache 2 license header to Markdown file content.""" + return MARKDOWN_LICENSE_HEADER + content + + +def add_license_to_notebook(file_path: Path, content: str) -> str: + """Add Apache 2 license header to Jupyter notebook.""" + try: + notebook = json.loads(content) + except json.JSONDecodeError as e: + raise ValueError(f"Invalid notebook JSON: {e}") from e + + # Create a new markdown cell with the license + license_cell = {"cell_type": "markdown", "metadata": {}, "source": [NOTEBOOK_LICENSE_TEXT]} + + # Insert at the beginning + if "cells" not in notebook: + notebook["cells"] = [] + + notebook["cells"].insert(0, license_cell) + + return json.dumps(notebook, indent=1, ensure_ascii=False) + + +def add_license_to_shell(file_path: Path, content: str) -> str: + """Add Apache 2 license header to shell script or Dockerfile. + + Uses same logic as Python files (# comments, handle shebang). + """ + # Handle shebang lines - preserve them at the top + lines = content.split("\n", 1) + if lines[0].startswith("#!"): + # File has shebang, add license after it + if len(lines) > 1: + return lines[0] + "\n" + PYTHON_LICENSE_HEADER + lines[1] + else: + return lines[0] + "\n" + PYTHON_LICENSE_HEADER + else: + # No shebang, add license at the beginning + return PYTHON_LICENSE_HEADER + content + + +def add_license_to_sql(file_path: Path, content: str) -> str: + """Add Apache 2 license header to SQL file content.""" + return SQL_LICENSE_HEADER + content + + +def add_license_header(file_path: Path, dry_run: bool = False) -> bool: + """Add Apache 2 license header to a file. + + Args: + file_path: Path to the file + dry_run: If True, only print what would be done without modifying files + + Returns: + True if header was added (or would be added in dry run), False otherwise + """ + try: + with open(file_path, "r", encoding="utf-8") as f: + content = f.read() + except (UnicodeDecodeError, PermissionError) as e: + print(f" ✗ Error reading {file_path}: {e}") + return False + + # Check if file already has a license header + if "Licensed to the Apache Software Foundation" in content or "Apache License" in content: + print(f" ↷ Skipping {file_path} (already has license header)") + return False + + # Determine file type and add appropriate header + try: + if file_path.suffix == ".py": + new_content = add_license_to_python(file_path, content) + elif file_path.suffix == ".md": + new_content = add_license_to_markdown(file_path, content) + elif file_path.suffix == ".ipynb": + new_content = add_license_to_notebook(file_path, content) + elif file_path.suffix == ".sh": + new_content = add_license_to_shell(file_path, content) + elif file_path.suffix == ".sql": + new_content = add_license_to_sql(file_path, content) + elif file_path.name == "Dockerfile": + # Dockerfiles use # comments like shell scripts + new_content = add_license_to_shell(file_path, content) + elif file_path.name == "README": + # README files without extension are usually markdown + new_content = add_license_to_markdown(file_path, content) + else: + print(f" ✗ Unsupported file type: {file_path.suffix} ({file_path.name})") + return False + except Exception as e: + print(f" ✗ Error processing {file_path}: {e}") + return False + + if dry_run: + print(f" ✓ Would add license header to {file_path}") + return True + + # Write the modified content back + try: + with open(file_path, "w", encoding="utf-8") as f: + f.write(new_content) + print(f" ✓ Added license header to {file_path}") + return True + except (PermissionError, OSError) as e: + print(f" ✗ Error writing {file_path}: {e}") + return False + + +def main(): + """Main function.""" + # Get repository root (parent of scripts directory) + repo_root = Path(__file__).parent.parent + + # Check for dry-run flag + dry_run = "--dry-run" in sys.argv or "-n" in sys.argv + + if dry_run: + print("DRY RUN MODE - No files will be modified\n") + + # Read the list of files from command line or use default + if len(sys.argv) > 1 and not sys.argv[-1].startswith("-"): + list_file = repo_root / sys.argv[-1] + else: + # Try combined list first, fall back to missing_license_headers.txt + list_file = repo_root / "missing_license_headers_combined.txt" + if not list_file.exists(): + list_file = repo_root / "missing_license_headers.txt" + + if not list_file.exists(): + print(f"Error: {list_file} not found!") + print("Run check_license_headers.py first to generate the list.") + print("Or specify a file list: python add_license_headers.py ") + return 1 + + print(f"Using file list: {list_file.name}\n") + + # Parse the file list + files_to_update: List[Path] = [] + with open(list_file, "r") as f: + for line in f: + original_line = line + line = line.strip() + # Skip header lines and empty lines + if ( + not line + or line.startswith("Checking") + or line.startswith("Extensions") + or line.startswith("Found") + ): + continue + # Skip lines that look like section headers (not starting with space and not a file path) + if ( + not original_line.startswith(" ") + and not line.startswith("examples") + and not line.startswith("hamilton") + and "/" not in line + ): + continue + # Remove leading spaces + file_path = line + full_path = repo_root / file_path + if full_path.exists(): + files_to_update.append(full_path) + + if not files_to_update: + print("No files to update!") + return 0 + + print(f"Found {len(files_to_update)} files to add license headers to\n") + + # Process each file + success_count = 0 + skip_count = 0 + + for file_path in files_to_update: + result = add_license_header(file_path, dry_run=dry_run) + if result: + success_count += 1 + else: + # Could be a skip or an error - check the output + skip_count += 1 + + # Print summary + print(f"\n{'Would add' if dry_run else 'Added'} license headers to {success_count} files") + if skip_count > 0: + print(f"Skipped {skip_count} files") + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/check_license_headers.py b/scripts/check_license_headers.py new file mode 100755 index 000000000..c9c757862 --- /dev/null +++ b/scripts/check_license_headers.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python3 +"""Script to find files missing Apache 2 license headers in the Hamilton repository.""" + +import sys +from pathlib import Path +from typing import List, Set + +# License header patterns to check for +LICENSE_PATTERNS = [ + "Licensed to the Apache Software Foundation (ASF)", + "Apache License, Version 2.0", +] + +# File extensions to check +PYTHON_EXTENSIONS = {".py"} +MARKDOWN_EXTENSIONS = {".md"} +NOTEBOOK_EXTENSIONS = {".ipynb"} +SHELL_EXTENSIONS = {".sh"} +SQL_EXTENSIONS = {".sql"} +TYPESCRIPT_EXTENSIONS = {".ts", ".tsx"} +JAVASCRIPT_EXTENSIONS = {".js", ".jsx"} +ALL_EXTENSIONS = ( + PYTHON_EXTENSIONS + | MARKDOWN_EXTENSIONS + | NOTEBOOK_EXTENSIONS + | SHELL_EXTENSIONS + | SQL_EXTENSIONS + | TYPESCRIPT_EXTENSIONS + | JAVASCRIPT_EXTENSIONS +) + +# Directories to skip +SKIP_DIRS = { + ".git", + "__pycache__", + "node_modules", + ".pytest_cache", + ".mypy_cache", + ".tox", + "venv", + ".venv", + "build", + "dist", + "*.egg-info", + ".eggs", + "htmlcov", + ".coverage", + ".claude", +} + + +def should_skip_path(path: Path) -> bool: + """Check if a path should be skipped.""" + # Skip if any parent directory is in SKIP_DIRS + for part in path.parts: + if part in SKIP_DIRS or part.startswith("."): + return True + + # Skip documentation snippet files (they're embedded in docs via literalinclude) + path_str = str(path) + if "docs" in path.parts and "_snippets" in path_str: + return True + if "docs/code-comparisons" in path_str and "snippets" in path_str: + return True + + return False + + +def has_license_header(file_path: Path, num_lines: int = 20) -> bool: + """Check if a file has the Apache 2 license header.""" + try: + with open(file_path, "r", encoding="utf-8") as f: + content = "".join(f.readlines()[:num_lines]) + + # Check if all license patterns are present in the first N lines + return all(pattern in content for pattern in LICENSE_PATTERNS) + except (UnicodeDecodeError, PermissionError): + # Skip files that can't be read as text + return True # Assume they're fine to avoid false positives + + +def find_files_without_license( + root_dir: Path, extensions: Set[str] = ALL_EXTENSIONS, include_special: bool = True +) -> List[Path]: + """Find all files without Apache 2 license headers. + + Args: + root_dir: Root directory to search + extensions: Set of file extensions to check + include_special: Whether to include special files like Dockerfile and README (no extension) + """ + files_without_license = [] + + # Special files to check (by exact name, not extension) + SPECIAL_FILES = {"Dockerfile", "README"} + + for file_path in root_dir.rglob("*"): + # Skip directories + if file_path.is_dir(): + continue + + # Check if file matches by extension or by special name + matches_extension = file_path.suffix in extensions + matches_special = include_special and file_path.name in SPECIAL_FILES + + if not (matches_extension or matches_special): + continue + + # Skip if in excluded paths + if should_skip_path(file_path): + continue + + # Check for license header + if not has_license_header(file_path): + files_without_license.append(file_path) + + return sorted(files_without_license) + + +def main(): + """Main function.""" + # Get repository root (parent of scripts directory) + repo_root = Path(__file__).parent.parent + + # Allow specifying extensions via command line + if len(sys.argv) > 1: + extension_arg = sys.argv[1] + if extension_arg == "py": + extensions = PYTHON_EXTENSIONS + elif extension_arg == "md": + extensions = MARKDOWN_EXTENSIONS + elif extension_arg == "ipynb": + extensions = NOTEBOOK_EXTENSIONS + elif extension_arg == "sh": + extensions = SHELL_EXTENSIONS + elif extension_arg == "sql": + extensions = SQL_EXTENSIONS + elif extension_arg == "ts": + extensions = TYPESCRIPT_EXTENSIONS + elif extension_arg == "js": + extensions = JAVASCRIPT_EXTENSIONS + elif extension_arg == "special": + # Check only Dockerfile and README files + extensions = set() + else: + extensions = ALL_EXTENSIONS + else: + extensions = ALL_EXTENSIONS + + # Only include special files (Dockerfile, README) if checking all or "special" type + include_special = len(sys.argv) <= 1 or ( + len(sys.argv) > 1 and sys.argv[1] in ["special", "all"] + ) + + print(f"Checking for Apache 2 license headers in {repo_root}") + if extensions: + print(f"Extensions: {', '.join(sorted(extensions))}") + if include_special: + print("Including: Dockerfile, README files") + print() + + files_without_license = find_files_without_license(repo_root, extensions, include_special) + + if not files_without_license: + print("✓ All files have license headers!") + return 0 + + print(f"Found {len(files_without_license)} files without Apache 2 license headers:\n") + + for file_path in files_without_license: + # Print relative path from repo root + try: + rel_path = file_path.relative_to(repo_root) + print(f" {rel_path}") + except ValueError: + print(f" {file_path}") + + return 1 + + +if __name__ == "__main__": + sys.exit(main()) From 2e469208dcd0bba3494c6d3c5041545b3af7ca1a Mon Sep 17 00:00:00 2001 From: Stefan Krawczyk Date: Sun, 28 Dec 2025 20:29:09 +1100 Subject: [PATCH 2/5] Updates docs files headers --- docs/conf.py | 17 +++++++++++++++++ docs/data_adapters_extension.py | 17 +++++++++++++++++ docs/make_testimonials.py | 17 +++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index bcccc0d13..a9facf230 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import os import re import subprocess diff --git a/docs/data_adapters_extension.py b/docs/data_adapters_extension.py index 1cd36c0f1..4139161e9 100644 --- a/docs/data_adapters_extension.py +++ b/docs/data_adapters_extension.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import dataclasses import importlib import inspect diff --git a/docs/make_testimonials.py b/docs/make_testimonials.py index 8f196d3c1..bee435af6 100644 --- a/docs/make_testimonials.py +++ b/docs/make_testimonials.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + card_template = """

From 0d767e5280a83f5192a830cc7760542d400c9fe8 Mon Sep 17 00:00:00 2001 From: Stefan Krawczyk Date: Sun, 28 Dec 2025 20:29:34 +1100 Subject: [PATCH 3/5] Adds headers to ui/sdk/tests --- ui/sdk/tests/conftest.py | 17 +++++++++++++++++ ui/sdk/tests/resources/basic_dag_with_config.py | 17 +++++++++++++++++ ui/sdk/tests/resources/parallel_dag.py | 17 +++++++++++++++++ ui/sdk/tests/resources/parallel_dag_error.py | 17 +++++++++++++++++ ui/sdk/tests/test_adapters.py | 17 +++++++++++++++++ ui/sdk/tests/test_driver.py | 17 +++++++++++++++++ ui/sdk/tests/test_package_to_hash/submodule1.py | 17 +++++++++++++++++ ui/sdk/tests/test_package_to_hash/submodule2.py | 17 +++++++++++++++++ ui/sdk/tests/test_tracking.py | 17 +++++++++++++++++ ui/sdk/tests/tracking/test_constants.py | 17 +++++++++++++++++ ui/sdk/tests/tracking/test_dataframe_stats.py | 17 +++++++++++++++++ ui/sdk/tests/tracking/test_ibis_stats.py | 17 +++++++++++++++++ ui/sdk/tests/tracking/test_langchain_stats.py | 17 +++++++++++++++++ ui/sdk/tests/tracking/test_pandas_col_stats.py | 17 +++++++++++++++++ ui/sdk/tests/tracking/test_pandas_stats.py | 17 +++++++++++++++++ ui/sdk/tests/tracking/test_polars_col_stats.py | 17 +++++++++++++++++ ui/sdk/tests/tracking/test_polars_stats.py | 17 +++++++++++++++++ ui/sdk/tests/tracking/test_pydantic_stats.py | 17 +++++++++++++++++ ui/sdk/tests/tracking/test_pyspark_stats.py | 17 +++++++++++++++++ ui/sdk/tests/tracking/test_runs.py | 17 +++++++++++++++++ ui/sdk/tests/tracking/test_stats.py | 17 +++++++++++++++++ ui/sdk/tests/tracking/test_utils.py | 17 +++++++++++++++++ 22 files changed, 374 insertions(+) diff --git a/ui/sdk/tests/conftest.py b/ui/sdk/tests/conftest.py index 04d11ddc9..ce5106797 100644 --- a/ui/sdk/tests/conftest.py +++ b/ui/sdk/tests/conftest.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from hamilton import telemetry telemetry.disable_telemetry() diff --git a/ui/sdk/tests/resources/basic_dag_with_config.py b/ui/sdk/tests/resources/basic_dag_with_config.py index 5c10b41a1..098fd34e4 100644 --- a/ui/sdk/tests/resources/basic_dag_with_config.py +++ b/ui/sdk/tests/resources/basic_dag_with_config.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from hamilton.function_modifiers import config diff --git a/ui/sdk/tests/resources/parallel_dag.py b/ui/sdk/tests/resources/parallel_dag.py index d6ff78e73..f17fa527a 100644 --- a/ui/sdk/tests/resources/parallel_dag.py +++ b/ui/sdk/tests/resources/parallel_dag.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import dataclasses import os from typing import List diff --git a/ui/sdk/tests/resources/parallel_dag_error.py b/ui/sdk/tests/resources/parallel_dag_error.py index 9b1715402..bea7f4441 100644 --- a/ui/sdk/tests/resources/parallel_dag_error.py +++ b/ui/sdk/tests/resources/parallel_dag_error.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import dataclasses import os from typing import List diff --git a/ui/sdk/tests/test_adapters.py b/ui/sdk/tests/test_adapters.py index cac37949d..65d439fb2 100644 --- a/ui/sdk/tests/test_adapters.py +++ b/ui/sdk/tests/test_adapters.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import os.path import pytest diff --git a/ui/sdk/tests/test_driver.py b/ui/sdk/tests/test_driver.py index 7a2950998..f32180aaf 100644 --- a/ui/sdk/tests/test_driver.py +++ b/ui/sdk/tests/test_driver.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import hashlib import logging from types import ModuleType diff --git a/ui/sdk/tests/test_package_to_hash/submodule1.py b/ui/sdk/tests/test_package_to_hash/submodule1.py index 5ddf34917..11bdf850b 100644 --- a/ui/sdk/tests/test_package_to_hash/submodule1.py +++ b/ui/sdk/tests/test_package_to_hash/submodule1.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import hashlib from . import subpackage diff --git a/ui/sdk/tests/test_package_to_hash/submodule2.py b/ui/sdk/tests/test_package_to_hash/submodule2.py index ecef99526..5f7127240 100644 --- a/ui/sdk/tests/test_package_to_hash/submodule2.py +++ b/ui/sdk/tests/test_package_to_hash/submodule2.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pprint from . import subpackage diff --git a/ui/sdk/tests/test_tracking.py b/ui/sdk/tests/test_tracking.py index 983f7875f..7fb2cc023 100644 --- a/ui/sdk/tests/test_tracking.py +++ b/ui/sdk/tests/test_tracking.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import functools from datetime import datetime, timezone from typing import Any, Callable, Dict, List diff --git a/ui/sdk/tests/tracking/test_constants.py b/ui/sdk/tests/tracking/test_constants.py index 9ccab2ece..3ba5db5ac 100644 --- a/ui/sdk/tests/tracking/test_constants.py +++ b/ui/sdk/tests/tracking/test_constants.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import configparser from hamilton_sdk.tracking import constants diff --git a/ui/sdk/tests/tracking/test_dataframe_stats.py b/ui/sdk/tests/tracking/test_dataframe_stats.py index 8e53f214d..8a996fa07 100644 --- a/ui/sdk/tests/tracking/test_dataframe_stats.py +++ b/ui/sdk/tests/tracking/test_dataframe_stats.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import math import numpy as np diff --git a/ui/sdk/tests/tracking/test_ibis_stats.py b/ui/sdk/tests/tracking/test_ibis_stats.py index b1f9808a2..dd4dc6ea4 100644 --- a/ui/sdk/tests/tracking/test_ibis_stats.py +++ b/ui/sdk/tests/tracking/test_ibis_stats.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import ibis import pandas as pd from hamilton_sdk.tracking import ibis_stats diff --git a/ui/sdk/tests/tracking/test_langchain_stats.py b/ui/sdk/tests/tracking/test_langchain_stats.py index 34eee23ac..dfcd3f08b 100644 --- a/ui/sdk/tests/tracking/test_langchain_stats.py +++ b/ui/sdk/tests/tracking/test_langchain_stats.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from hamilton_sdk.tracking import langchain_stats from langchain_core import documents as lc_documents from langchain_core import messages as lc_messages diff --git a/ui/sdk/tests/tracking/test_pandas_col_stats.py b/ui/sdk/tests/tracking/test_pandas_col_stats.py index 550c736ee..684db46a5 100644 --- a/ui/sdk/tests/tracking/test_pandas_col_stats.py +++ b/ui/sdk/tests/tracking/test_pandas_col_stats.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Module for testing pandas column stats.""" import pandas as pd diff --git a/ui/sdk/tests/tracking/test_pandas_stats.py b/ui/sdk/tests/tracking/test_pandas_stats.py index da4903015..2eb2721b5 100644 --- a/ui/sdk/tests/tracking/test_pandas_stats.py +++ b/ui/sdk/tests/tracking/test_pandas_stats.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton_sdk.tracking import pandas_stats as ps diff --git a/ui/sdk/tests/tracking/test_polars_col_stats.py b/ui/sdk/tests/tracking/test_polars_col_stats.py index 3f3a976a4..f80c12b86 100644 --- a/ui/sdk/tests/tracking/test_polars_col_stats.py +++ b/ui/sdk/tests/tracking/test_polars_col_stats.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Module for testing pandas column stats.""" import polars as pl diff --git a/ui/sdk/tests/tracking/test_polars_stats.py b/ui/sdk/tests/tracking/test_polars_stats.py index a8a9d43a9..141e4d90d 100644 --- a/ui/sdk/tests/tracking/test_polars_stats.py +++ b/ui/sdk/tests/tracking/test_polars_stats.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from datetime import date import polars as pl from hamilton_sdk.tracking import polars_stats as ps diff --git a/ui/sdk/tests/tracking/test_pydantic_stats.py b/ui/sdk/tests/tracking/test_pydantic_stats.py index f6703a39d..5059a840c 100644 --- a/ui/sdk/tests/tracking/test_pydantic_stats.py +++ b/ui/sdk/tests/tracking/test_pydantic_stats.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from hamilton_sdk.tracking import pydantic_stats from pydantic import BaseModel diff --git a/ui/sdk/tests/tracking/test_pyspark_stats.py b/ui/sdk/tests/tracking/test_pyspark_stats.py index 694afc34f..2e22c66d0 100644 --- a/ui/sdk/tests/tracking/test_pyspark_stats.py +++ b/ui/sdk/tests/tracking/test_pyspark_stats.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd import pyspark.sql as ps from hamilton_sdk.tracking import pyspark_stats diff --git a/ui/sdk/tests/tracking/test_runs.py b/ui/sdk/tests/tracking/test_runs.py index 7feee0b44..ee615b78b 100644 --- a/ui/sdk/tests/tracking/test_runs.py +++ b/ui/sdk/tests/tracking/test_runs.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import json from datetime import date from typing import Any diff --git a/ui/sdk/tests/tracking/test_stats.py b/ui/sdk/tests/tracking/test_stats.py index 7d030090a..fbe634d0d 100644 --- a/ui/sdk/tests/tracking/test_stats.py +++ b/ui/sdk/tests/tracking/test_stats.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import sys from collections import namedtuple from typing import NamedTuple diff --git a/ui/sdk/tests/tracking/test_utils.py b/ui/sdk/tests/tracking/test_utils.py index 62cafb87f..9a8951ab7 100644 --- a/ui/sdk/tests/tracking/test_utils.py +++ b/ui/sdk/tests/tracking/test_utils.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import dataclasses import datetime from enum import Enum From f4593940013c642ff90d05ab4b8efd1f0820b2e7 Mon Sep 17 00:00:00 2001 From: Stefan Krawczyk Date: Sun, 28 Dec 2025 20:32:07 +1100 Subject: [PATCH 4/5] Adds more missing license headers --- hamilton/experimental/databackend.py | 17 +++++++++++++++++ scripts/test_memory.py | 17 +++++++++++++++++ scripts/update_blogs_in_learning_resources.py | 17 +++++++++++++++++ ui/backend/server/trackingserver_base/tests.py | 17 +++++++++++++++++ writeups/garbage_collection/memory_test.py | 17 +++++++++++++++++ 5 files changed, 85 insertions(+) diff --git a/hamilton/experimental/databackend.py b/hamilton/experimental/databackend.py index 2eae6fbe7..ff1d1ebea 100644 --- a/hamilton/experimental/databackend.py +++ b/hamilton/experimental/databackend.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Below is a file from `databackend` v0.0.2 found on GitHub permalink: https://github.com/machow/databackend/blob/214832bab6990098d52a4a2fae935f5d9ae8dc3c/databackend/__init__.py """ diff --git a/scripts/test_memory.py b/scripts/test_memory.py index 77de31bfd..44d813b23 100644 --- a/scripts/test_memory.py +++ b/scripts/test_memory.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Script to test memory. Run with mprof: diff --git a/scripts/update_blogs_in_learning_resources.py b/scripts/update_blogs_in_learning_resources.py index 4fb7a1185..dd6601ca0 100644 --- a/scripts/update_blogs_in_learning_resources.py +++ b/scripts/update_blogs_in_learning_resources.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ 📜 DAGWorks Blog Archive Updater Script diff --git a/ui/backend/server/trackingserver_base/tests.py b/ui/backend/server/trackingserver_base/tests.py index a79ca8be5..6d9186750 100644 --- a/ui/backend/server/trackingserver_base/tests.py +++ b/ui/backend/server/trackingserver_base/tests.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + # from django.test import TestCase # Create your tests here. diff --git a/writeups/garbage_collection/memory_test.py b/writeups/garbage_collection/memory_test.py index 92b4f97a9..e42702180 100644 --- a/writeups/garbage_collection/memory_test.py +++ b/writeups/garbage_collection/memory_test.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Script to test memory. Run with mprof: From 3b1f2bb1b7fd5af376cfccfc320f89dc43a21f36 Mon Sep 17 00:00:00 2001 From: Stefan Krawczyk Date: Sun, 28 Dec 2025 22:22:17 +1100 Subject: [PATCH 5/5] Address PR feedback --- .github/workflows/hamilton-lsp.yml | 3 ++ .github/workflows/hamilton-main.yml | 5 ++ .github/workflows/hamilton-sdk.yml | 3 ++ .github/workflows/hamilton-ui-backend.yml | 3 ++ .github/workflows/hamilton-ui-frontend.yml | 3 ++ scripts/add_license_headers.py | 54 ++++++++++++++++------ scripts/check_license_headers.py | 17 +++++++ 7 files changed, 74 insertions(+), 14 deletions(-) diff --git a/.github/workflows/hamilton-lsp.yml b/.github/workflows/hamilton-lsp.yml index b1d23c224..88458b028 100644 --- a/.github/workflows/hamilton-lsp.yml +++ b/.github/workflows/hamilton-lsp.yml @@ -23,6 +23,9 @@ jobs: working-directory: dev_tools/language_server steps: - uses: actions/checkout@v3 + - name: Check for missing Apache 2 license headers + run: python3 scripts/check_license_headers.py + working-directory: ${{ github.workspace }} - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: diff --git a/.github/workflows/hamilton-main.yml b/.github/workflows/hamilton-main.yml index b1039c81c..b71e1e384 100644 --- a/.github/workflows/hamilton-main.yml +++ b/.github/workflows/hamilton-main.yml @@ -66,6 +66,11 @@ jobs: uv run pre-commit install uv run pre-commit run --all-files + - name: Check for missing Apache 2 license headers + if: ${{ runner.os == 'Linux' }} + run: | + python3 scripts/check_license_headers.py + - name: Test hamilton main package run: | uv sync --group test diff --git a/.github/workflows/hamilton-sdk.yml b/.github/workflows/hamilton-sdk.yml index d5f539f41..daba9beca 100644 --- a/.github/workflows/hamilton-sdk.yml +++ b/.github/workflows/hamilton-sdk.yml @@ -23,6 +23,9 @@ jobs: working-directory: ui/sdk steps: - uses: actions/checkout@v3 + - name: Check for missing Apache 2 license headers + run: python3 scripts/check_license_headers.py + working-directory: ${{ github.workspace }} - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: diff --git a/.github/workflows/hamilton-ui-backend.yml b/.github/workflows/hamilton-ui-backend.yml index 0249f68b6..204fc48c3 100644 --- a/.github/workflows/hamilton-ui-backend.yml +++ b/.github/workflows/hamilton-ui-backend.yml @@ -36,6 +36,9 @@ jobs: --health-retries 10 steps: - uses: actions/checkout@v3 + - name: Check for missing Apache 2 license headers + run: | + python3 scripts/check_license_headers.py - name: Set up Python uses: actions/setup-python@v4 with: diff --git a/.github/workflows/hamilton-ui-frontend.yml b/.github/workflows/hamilton-ui-frontend.yml index 019898825..a074dc553 100644 --- a/.github/workflows/hamilton-ui-frontend.yml +++ b/.github/workflows/hamilton-ui-frontend.yml @@ -20,6 +20,9 @@ jobs: node-version: [16.x] steps: - uses: actions/checkout@v3 + - name: Check for missing Apache 2 license headers + run: python3 scripts/check_license_headers.py + working-directory: ${{ github.workspace }} - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 with: diff --git a/scripts/add_license_headers.py b/scripts/add_license_headers.py index c234d5a12..259992c1b 100755 --- a/scripts/add_license_headers.py +++ b/scripts/add_license_headers.py @@ -1,4 +1,21 @@ #!/usr/bin/env python3 +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Script to add Apache 2 license headers to files in the Hamilton repository.""" import json @@ -6,6 +23,11 @@ from pathlib import Path from typing import List +# TODO: Simplify this script if we add more file types. Since the license text +# (including line breaks) stays the same, we really just need different comment +# character insertion helpers based on file extension rather than duplicating +# the full license text for each file type. + # Apache 2 license header for Python files PYTHON_LICENSE_HEADER = """# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -87,7 +109,7 @@ """ -def add_license_to_python(file_path: Path, content: str) -> str: +def add_license_to_python(content: str) -> str: """Add Apache 2 license header to Python file content.""" # Handle shebang lines - preserve them at the top lines = content.split("\n", 1) @@ -102,12 +124,12 @@ def add_license_to_python(file_path: Path, content: str) -> str: return PYTHON_LICENSE_HEADER + content -def add_license_to_markdown(file_path: Path, content: str) -> str: +def add_license_to_markdown(content: str) -> str: """Add Apache 2 license header to Markdown file content.""" return MARKDOWN_LICENSE_HEADER + content -def add_license_to_notebook(file_path: Path, content: str) -> str: +def add_license_to_notebook(content: str) -> str: """Add Apache 2 license header to Jupyter notebook.""" try: notebook = json.loads(content) @@ -126,7 +148,7 @@ def add_license_to_notebook(file_path: Path, content: str) -> str: return json.dumps(notebook, indent=1, ensure_ascii=False) -def add_license_to_shell(file_path: Path, content: str) -> str: +def add_license_to_shell(content: str) -> str: """Add Apache 2 license header to shell script or Dockerfile. Uses same logic as Python files (# comments, handle shebang). @@ -144,7 +166,7 @@ def add_license_to_shell(file_path: Path, content: str) -> str: return PYTHON_LICENSE_HEADER + content -def add_license_to_sql(file_path: Path, content: str) -> str: +def add_license_to_sql(content: str) -> str: """Add Apache 2 license header to SQL file content.""" return SQL_LICENSE_HEADER + content @@ -166,29 +188,33 @@ def add_license_header(file_path: Path, dry_run: bool = False) -> bool: print(f" ✗ Error reading {file_path}: {e}") return False - # Check if file already has a license header - if "Licensed to the Apache Software Foundation" in content or "Apache License" in content: + # Check if file already has a license header (check first 20 lines only) + first_lines = "\n".join(content.split("\n")[:20]) + if ( + "Licensed to the Apache Software Foundation" in first_lines + or "Apache License" in first_lines + ): print(f" ↷ Skipping {file_path} (already has license header)") return False # Determine file type and add appropriate header try: if file_path.suffix == ".py": - new_content = add_license_to_python(file_path, content) + new_content = add_license_to_python(content) elif file_path.suffix == ".md": - new_content = add_license_to_markdown(file_path, content) + new_content = add_license_to_markdown(content) elif file_path.suffix == ".ipynb": - new_content = add_license_to_notebook(file_path, content) + new_content = add_license_to_notebook(content) elif file_path.suffix == ".sh": - new_content = add_license_to_shell(file_path, content) + new_content = add_license_to_shell(content) elif file_path.suffix == ".sql": - new_content = add_license_to_sql(file_path, content) + new_content = add_license_to_sql(content) elif file_path.name == "Dockerfile": # Dockerfiles use # comments like shell scripts - new_content = add_license_to_shell(file_path, content) + new_content = add_license_to_shell(content) elif file_path.name == "README": # README files without extension are usually markdown - new_content = add_license_to_markdown(file_path, content) + new_content = add_license_to_markdown(content) else: print(f" ✗ Unsupported file type: {file_path.suffix} ({file_path.name})") return False diff --git a/scripts/check_license_headers.py b/scripts/check_license_headers.py index c9c757862..fc67379e8 100755 --- a/scripts/check_license_headers.py +++ b/scripts/check_license_headers.py @@ -1,4 +1,21 @@ #!/usr/bin/env python3 +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Script to find files missing Apache 2 license headers in the Hamilton repository.""" import sys

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 diff --git a/examples/hello_world/my_functions.py b/examples/hello_world/my_functions.py index b54f6b171..c57618842 100644 --- a/examples/hello_world/my_functions.py +++ b/examples/hello_world/my_functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd """ diff --git a/examples/hello_world/my_notebook.ipynb b/examples/hello_world/my_notebook.ipynb index 8e9edd954..b380572cf 100644 --- a/examples/hello_world/my_notebook.ipynb +++ b/examples/hello_world/my_notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/hello_world/my_script.py b/examples/hello_world/my_script.py index 39eb65145..8822fc73d 100644 --- a/examples/hello_world/my_script.py +++ b/examples/hello_world/my_script.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging import sys diff --git a/examples/ibis/feature_engineering/README.md b/examples/ibis/feature_engineering/README.md index 1ce49a1b9..94bef2acf 100644 --- a/examples/ibis/feature_engineering/README.md +++ b/examples/ibis/feature_engineering/README.md @@ -1,3 +1,22 @@ + + # Ibis + Apache Hamilton [Ibis](https://ibis-project.org/) is a portable dataframe library to write procedural data transformations in Python and be able to execute them directly on various SQL backends (DuckDB, Snowflake, Postgres, Flink, see [full list](https://ibis-project.org/support_matrix)). Apache Hamilton provides a declarative way to define testable, modular, self-documenting dataflows, that encode lineage and metadata. diff --git a/examples/ibis/feature_engineering/column_dataflow.py b/examples/ibis/feature_engineering/column_dataflow.py index 92ca41c2c..fac47c16f 100644 --- a/examples/ibis/feature_engineering/column_dataflow.py +++ b/examples/ibis/feature_engineering/column_dataflow.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Optional import ibis diff --git a/examples/ibis/feature_engineering/run.py b/examples/ibis/feature_engineering/run.py index 1682e5622..e07bbb411 100644 --- a/examples/ibis/feature_engineering/run.py +++ b/examples/ibis/feature_engineering/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from hamilton import driver from hamilton.plugins.h_tqdm import ProgressBar diff --git a/examples/ibis/feature_engineering/table_dataflow.py b/examples/ibis/feature_engineering/table_dataflow.py index 453f48c33..b70aecf08 100644 --- a/examples/ibis/feature_engineering/table_dataflow.py +++ b/examples/ibis/feature_engineering/table_dataflow.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Optional import ibis diff --git a/examples/ibis/jaffle_shop/README.md b/examples/ibis/jaffle_shop/README.md index 0ca57dbfb..9106156e7 100644 --- a/examples/ibis/jaffle_shop/README.md +++ b/examples/ibis/jaffle_shop/README.md @@ -1,3 +1,22 @@ + + # Jaffle shop This repository is a reimplementation of the canonical [dbt example jaffle_shop](https://github.com/dbt-labs/jaffle_shop). It illustrates data transformations for an ecommerce store. diff --git a/examples/ibis/jaffle_shop/dataflows/customer_flow.py b/examples/ibis/jaffle_shop/dataflows/customer_flow.py index 1600cf890..e4813558c 100644 --- a/examples/ibis/jaffle_shop/dataflows/customer_flow.py +++ b/examples/ibis/jaffle_shop/dataflows/customer_flow.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import ibis import ibis.expr.types as ir diff --git a/examples/ibis/jaffle_shop/dataflows/order_flow.py b/examples/ibis/jaffle_shop/dataflows/order_flow.py index 896bba43c..29b3219b6 100644 --- a/examples/ibis/jaffle_shop/dataflows/order_flow.py +++ b/examples/ibis/jaffle_shop/dataflows/order_flow.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import ibis import ibis.expr.types as ir diff --git a/examples/ibis/jaffle_shop/dataflows/staging.py b/examples/ibis/jaffle_shop/dataflows/staging.py index e1b663a1e..8ddcb9d9f 100644 --- a/examples/ibis/jaffle_shop/dataflows/staging.py +++ b/examples/ibis/jaffle_shop/dataflows/staging.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import ibis import ibis.expr.types as ir diff --git a/examples/ibis/jaffle_shop/run.py b/examples/ibis/jaffle_shop/run.py index 4346648d5..393caddf7 100644 --- a/examples/ibis/jaffle_shop/run.py +++ b/examples/ibis/jaffle_shop/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import ibis # import dataflow modules diff --git a/examples/ibisml/README.md b/examples/ibisml/README.md index 2af3a2f63..aa44a5ef2 100644 --- a/examples/ibisml/README.md +++ b/examples/ibisml/README.md @@ -1 +1,20 @@ + + # IbisML + Apache Hamilton [WIP] diff --git a/examples/ibisml/model_training.py b/examples/ibisml/model_training.py index 2beb019f3..9eb85d687 100644 --- a/examples/ibisml/model_training.py +++ b/examples/ibisml/model_training.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import ibis import ibis.expr.types as ir import ibisml diff --git a/examples/ibisml/run.py b/examples/ibisml/run.py index 6822c6775..e9ef3de71 100644 --- a/examples/ibisml/run.py +++ b/examples/ibisml/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from hamilton import driver from hamilton.execution.executors import SynchronousLocalTaskExecutor from hamilton.plugins.h_tqdm import ProgressBar diff --git a/examples/ibisml/table_dataflow.py b/examples/ibisml/table_dataflow.py index a75d8ade1..2e7ec7a9b 100644 --- a/examples/ibisml/table_dataflow.py +++ b/examples/ibisml/table_dataflow.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Optional import ibis diff --git a/examples/jupyter_notebook_magic/README.md b/examples/jupyter_notebook_magic/README.md index e6d866ac2..d584b89ba 100644 --- a/examples/jupyter_notebook_magic/README.md +++ b/examples/jupyter_notebook_magic/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton notebook extension One of the best part about notebooks is the ability to execute and immediately inspect results. They provide a "read-eval-print" loop (REPL) coding experience. However, the way Apache Hamilton separates dataflow definition (functions in a module) from execution (building and executing a driver) creates an extra step that can slowdown this loop. diff --git a/examples/jupyter_notebook_magic/example.ipynb b/examples/jupyter_notebook_magic/example.ipynb index 648ba23b8..98dc8643b 100644 --- a/examples/jupyter_notebook_magic/example.ipynb +++ b/examples/jupyter_notebook_magic/example.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": 1, @@ -96,7 +103,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[0;31mDocstring:\u001B[0m\n", + "\u001b[0;31mDocstring:\u001b[0m\n", "::\n", "\n", " %cell_to_module [-m [MODULE_NAME]] [-d [DISPLAY]] [--display_cache]\n", @@ -150,7 +157,7 @@ " -w <[WRITE_TO_FILE]>, --write_to_file <[WRITE_TO_FILE]>\n", " Write cell content to a file. The argument is the file\n", " path; else write to {module_name}.py\n", - "\u001B[0;31mFile:\u001B[0m ~/projects/hamilton/hamilton/plugins/jupyter_magic.py" + "\u001b[0;31mFile:\u001b[0m ~/projects/hamilton/hamilton/plugins/jupyter_magic.py" ] } ], diff --git a/examples/kedro/README.md b/examples/kedro/README.md index a651c51d7..4f35b4827 100644 --- a/examples/kedro/README.md +++ b/examples/kedro/README.md @@ -1,3 +1,22 @@ + + # Kedro & Apache Hamilton This repository compares how to build dataflows with Kedro and Apache Hamilton. diff --git a/examples/kedro/hamilton-code/README.md b/examples/kedro/hamilton-code/README.md index 8d37f114b..63f24a88b 100644 --- a/examples/kedro/hamilton-code/README.md +++ b/examples/kedro/hamilton-code/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton code ![](src/hamilton_code/all_functions.png) diff --git a/examples/kedro/hamilton-code/notebooks/interactive.ipynb b/examples/kedro/hamilton-code/notebooks/interactive.ipynb index b77ab60f0..7e754a9c3 100644 --- a/examples/kedro/hamilton-code/notebooks/interactive.ipynb +++ b/examples/kedro/hamilton-code/notebooks/interactive.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/kedro/hamilton-code/src/hamilton_code/data_processing.py b/examples/kedro/hamilton-code/src/hamilton_code/data_processing.py index 5aa507e76..0b11224ab 100644 --- a/examples/kedro/hamilton-code/src/hamilton_code/data_processing.py +++ b/examples/kedro/hamilton-code/src/hamilton_code/data_processing.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd diff --git a/examples/kedro/hamilton-code/src/hamilton_code/data_science.py b/examples/kedro/hamilton-code/src/hamilton_code/data_science.py index 1fec51450..0a6ef9ff1 100644 --- a/examples/kedro/hamilton-code/src/hamilton_code/data_science.py +++ b/examples/kedro/hamilton-code/src/hamilton_code/data_science.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging from typing import List, Union diff --git a/examples/kedro/hamilton-code/src/hamilton_code/run.py b/examples/kedro/hamilton-code/src/hamilton_code/run.py index f7b98d94a..6225c41e3 100644 --- a/examples/kedro/hamilton-code/src/hamilton_code/run.py +++ b/examples/kedro/hamilton-code/src/hamilton_code/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import data_processing import data_science diff --git a/examples/kedro/hamilton-code/tests/test_dataflow.py b/examples/kedro/hamilton-code/tests/test_dataflow.py index b23137e82..cf20b59f9 100644 --- a/examples/kedro/hamilton-code/tests/test_dataflow.py +++ b/examples/kedro/hamilton-code/tests/test_dataflow.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd import pytest diff --git a/examples/kedro/kedro-code/README.md b/examples/kedro/kedro-code/README.md index c6286ff6e..e7a22a2f8 100644 --- a/examples/kedro/kedro-code/README.md +++ b/examples/kedro/kedro-code/README.md @@ -1,3 +1,22 @@ + + # Kedro code ## Overview diff --git a/examples/kedro/kedro-code/conf/README.md b/examples/kedro/kedro-code/conf/README.md index b135e80c2..cc638d2ba 100644 --- a/examples/kedro/kedro-code/conf/README.md +++ b/examples/kedro/kedro-code/conf/README.md @@ -1,3 +1,22 @@ + + # What is this for? This folder should be used to store configuration files used by Kedro or by separate tools. diff --git a/examples/kedro/kedro-code/src/kedro_code/__main__.py b/examples/kedro/kedro-code/src/kedro_code/__main__.py index 7fbfed8f1..67fbdb8c9 100644 --- a/examples/kedro/kedro-code/src/kedro_code/__main__.py +++ b/examples/kedro/kedro-code/src/kedro_code/__main__.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """kedro_code file for ensuring the package is executable as `kedro-code` and `python -m kedro_code` """ diff --git a/examples/kedro/kedro-code/src/kedro_code/pipeline_registry.py b/examples/kedro/kedro-code/src/kedro_code/pipeline_registry.py index 54a1cc3ea..cb450d4b0 100644 --- a/examples/kedro/kedro-code/src/kedro_code/pipeline_registry.py +++ b/examples/kedro/kedro-code/src/kedro_code/pipeline_registry.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Project pipelines.""" from typing import Dict diff --git a/examples/kedro/kedro-code/src/kedro_code/pipelines/data_processing/nodes.py b/examples/kedro/kedro-code/src/kedro_code/pipelines/data_processing/nodes.py index 1adcf3613..5f821d8f3 100755 --- a/examples/kedro/kedro-code/src/kedro_code/pipelines/data_processing/nodes.py +++ b/examples/kedro/kedro-code/src/kedro_code/pipelines/data_processing/nodes.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd diff --git a/examples/kedro/kedro-code/src/kedro_code/pipelines/data_processing/pipeline.py b/examples/kedro/kedro-code/src/kedro_code/pipelines/data_processing/pipeline.py index 058ad9eae..06350f50e 100755 --- a/examples/kedro/kedro-code/src/kedro_code/pipelines/data_processing/pipeline.py +++ b/examples/kedro/kedro-code/src/kedro_code/pipelines/data_processing/pipeline.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from kedro.pipeline import Pipeline, node, pipeline from .nodes import create_model_input_table, preprocess_companies, preprocess_shuttles diff --git a/examples/kedro/kedro-code/src/kedro_code/pipelines/data_science/nodes.py b/examples/kedro/kedro-code/src/kedro_code/pipelines/data_science/nodes.py index ef921e3bd..d2eea6986 100755 --- a/examples/kedro/kedro-code/src/kedro_code/pipelines/data_science/nodes.py +++ b/examples/kedro/kedro-code/src/kedro_code/pipelines/data_science/nodes.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging from typing import Dict, Tuple diff --git a/examples/kedro/kedro-code/src/kedro_code/pipelines/data_science/pipeline.py b/examples/kedro/kedro-code/src/kedro_code/pipelines/data_science/pipeline.py index ce4c8aeb3..30dcd9242 100755 --- a/examples/kedro/kedro-code/src/kedro_code/pipelines/data_science/pipeline.py +++ b/examples/kedro/kedro-code/src/kedro_code/pipelines/data_science/pipeline.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from kedro.pipeline import Pipeline, node, pipeline from .nodes import evaluate_model, split_data, train_model diff --git a/examples/kedro/kedro-code/src/kedro_code/settings.py b/examples/kedro/kedro-code/src/kedro_code/settings.py index abea0e2c6..f1e2e6c5d 100644 --- a/examples/kedro/kedro-code/src/kedro_code/settings.py +++ b/examples/kedro/kedro-code/src/kedro_code/settings.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Project settings. There is no need to edit this file unless you want to change values from the Kedro defaults. For further information, including these default values, see https://docs.kedro.org/en/stable/kedro_project_setup/settings.html.""" diff --git a/examples/kedro/kedro-code/tests/pipelines/data_science/test_pipeline.py b/examples/kedro/kedro-code/tests/pipelines/data_science/test_pipeline.py index ed0c7e1ab..abba84e72 100644 --- a/examples/kedro/kedro-code/tests/pipelines/data_science/test_pipeline.py +++ b/examples/kedro/kedro-code/tests/pipelines/data_science/test_pipeline.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging from math import ceil diff --git a/examples/kedro/kedro-code/tests/test_run.py b/examples/kedro/kedro-code/tests/test_run.py index 158f7952f..540c5bb51 100644 --- a/examples/kedro/kedro-code/tests/test_run.py +++ b/examples/kedro/kedro-code/tests/test_run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This module contains an example test. diff --git a/examples/kedro/kedro-plugin/README.md b/examples/kedro/kedro-plugin/README.md index d6aa4b65e..b75135270 100644 --- a/examples/kedro/kedro-plugin/README.md +++ b/examples/kedro/kedro-plugin/README.md @@ -1,3 +1,22 @@ + + # Kedro plugin ## Content diff --git a/examples/kedro/kedro-plugin/kedro_to_hamilton.ipynb b/examples/kedro/kedro-plugin/kedro_to_hamilton.ipynb index bcb0e6e0a..cc0cc7b29 100644 --- a/examples/kedro/kedro-plugin/kedro_to_hamilton.ipynb +++ b/examples/kedro/kedro-plugin/kedro_to_hamilton.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, @@ -700,7 +707,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m[05/22/24 16:10:54]\u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Loading data from \u001B[38;5;208mcompanies\u001B[0m \u001B[1m(\u001B[0mCSVDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=554145;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=747028;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001B\\\u001B[2m483\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m[05/22/24 16:10:54]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Loading data from \u001b[38;5;208mcompanies\u001b[0m \u001b[1m(\u001b[0mCSVDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=554145;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=747028;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001b\\\u001b[2m483\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -713,7 +720,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m \u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Loading data from \u001B[38;5;208mreviews\u001B[0m \u001B[1m(\u001B[0mCSVDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=756925;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=7965;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001B\\\u001B[2m483\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Loading data from \u001b[38;5;208mreviews\u001b[0m \u001b[1m(\u001b[0mCSVDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=756925;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=7965;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001b\\\u001b[2m483\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -726,7 +733,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m \u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Loading data from \u001B[38;5;208mshuttles\u001B[0m \u001B[1m(\u001B[0mExcelDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=791772;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=315027;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001B\\\u001B[2m483\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Loading data from \u001b[38;5;208mshuttles\u001b[0m \u001b[1m(\u001b[0mExcelDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=791772;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=315027;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001b\\\u001b[2m483\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -915,41 +922,41 @@ "text/plain": [ "\n", " shuttle_location shuttle_type engine_type engine_vendor \\\n", - "\u001B[1;36m0\u001B[0m Sao Tome and Principe Type V5 Plasma ThetaBase Services \n", - "\u001B[1;36m1\u001B[0m Wallis and Futuna Type V2 Plasma ThetaBase Services \n", - "\u001B[1;36m2\u001B[0m Niue Type F5 Quantum ThetaBase Services \n", - "\u001B[1;36m3\u001B[0m Malta Type V2 Quantum ThetaBase Services \n", - "\u001B[1;36m4\u001B[0m Malta Type V2 Plasma ThetaBase Services \n", + "\u001b[1;36m0\u001b[0m Sao Tome and Principe Type V5 Plasma ThetaBase Services \n", + "\u001b[1;36m1\u001b[0m Wallis and Futuna Type V2 Plasma ThetaBase Services \n", + "\u001b[1;36m2\u001b[0m Niue Type F5 Quantum ThetaBase Services \n", + "\u001b[1;36m3\u001b[0m Malta Type V2 Quantum ThetaBase Services \n", + "\u001b[1;36m4\u001b[0m Malta Type V2 Plasma ThetaBase Services \n", "\n", " engines passenger_capacity cancellation_policy crew d_check_complete \\\n", - "\u001B[1;36m0\u001B[0m \u001B[1;36m2.0\u001B[0m \u001B[1;36m4\u001B[0m moderate \u001B[1;36m2.0\u001B[0m \u001B[3;91mFalse\u001B[0m \n", - "\u001B[1;36m1\u001B[0m \u001B[1;36m3.0\u001B[0m \u001B[1;36m5\u001B[0m moderate \u001B[1;36m3.0\u001B[0m \u001B[3;91mFalse\u001B[0m \n", - "\u001B[1;36m2\u001B[0m \u001B[1;36m1.0\u001B[0m \u001B[1;36m2\u001B[0m strict \u001B[1;36m1.0\u001B[0m \u001B[3;92mTrue\u001B[0m \n", - "\u001B[1;36m3\u001B[0m \u001B[1;36m1.0\u001B[0m \u001B[1;36m2\u001B[0m moderate \u001B[1;36m1.0\u001B[0m \u001B[3;91mFalse\u001B[0m \n", - "\u001B[1;36m4\u001B[0m \u001B[1;36m5.0\u001B[0m \u001B[1;36m10\u001B[0m strict \u001B[1;36m5.0\u001B[0m \u001B[3;91mFalse\u001B[0m \n", + "\u001b[1;36m0\u001b[0m \u001b[1;36m2.0\u001b[0m \u001b[1;36m4\u001b[0m moderate \u001b[1;36m2.0\u001b[0m \u001b[3;91mFalse\u001b[0m \n", + "\u001b[1;36m1\u001b[0m \u001b[1;36m3.0\u001b[0m \u001b[1;36m5\u001b[0m moderate \u001b[1;36m3.0\u001b[0m \u001b[3;91mFalse\u001b[0m \n", + "\u001b[1;36m2\u001b[0m \u001b[1;36m1.0\u001b[0m \u001b[1;36m2\u001b[0m strict \u001b[1;36m1.0\u001b[0m \u001b[3;92mTrue\u001b[0m \n", + "\u001b[1;36m3\u001b[0m \u001b[1;36m1.0\u001b[0m \u001b[1;36m2\u001b[0m moderate \u001b[1;36m1.0\u001b[0m \u001b[3;91mFalse\u001b[0m \n", + "\u001b[1;36m4\u001b[0m \u001b[1;36m5.0\u001b[0m \u001b[1;36m10\u001b[0m strict \u001b[1;36m5.0\u001b[0m \u001b[3;91mFalse\u001b[0m \n", "\n", - " moon_clearance_complete \u001B[33m...\u001B[0m review_scores_crew review_scores_location \\\n", - "\u001B[1;36m0\u001B[0m \u001B[3;91mFalse\u001B[0m \u001B[33m...\u001B[0m \u001B[1;36m9.0\u001B[0m \u001B[1;36m9.0\u001B[0m \n", - "\u001B[1;36m1\u001B[0m \u001B[3;91mFalse\u001B[0m \u001B[33m...\u001B[0m \u001B[1;36m10.0\u001B[0m \u001B[1;36m10.0\u001B[0m \n", - "\u001B[1;36m2\u001B[0m \u001B[3;91mFalse\u001B[0m \u001B[33m...\u001B[0m \u001B[1;36m10.0\u001B[0m \u001B[1;36m10.0\u001B[0m \n", - "\u001B[1;36m3\u001B[0m \u001B[3;91mFalse\u001B[0m \u001B[33m...\u001B[0m \u001B[1;36m10.0\u001B[0m \u001B[1;36m9.0\u001B[0m \n", - "\u001B[1;36m4\u001B[0m \u001B[3;91mFalse\u001B[0m \u001B[33m...\u001B[0m \u001B[1;36m10.0\u001B[0m \u001B[1;36m9.0\u001B[0m \n", + " moon_clearance_complete \u001b[33m...\u001b[0m review_scores_crew review_scores_location \\\n", + "\u001b[1;36m0\u001b[0m \u001b[3;91mFalse\u001b[0m \u001b[33m...\u001b[0m \u001b[1;36m9.0\u001b[0m \u001b[1;36m9.0\u001b[0m \n", + "\u001b[1;36m1\u001b[0m \u001b[3;91mFalse\u001b[0m \u001b[33m...\u001b[0m \u001b[1;36m10.0\u001b[0m \u001b[1;36m10.0\u001b[0m \n", + "\u001b[1;36m2\u001b[0m \u001b[3;91mFalse\u001b[0m \u001b[33m...\u001b[0m \u001b[1;36m10.0\u001b[0m \u001b[1;36m10.0\u001b[0m \n", + "\u001b[1;36m3\u001b[0m \u001b[3;91mFalse\u001b[0m \u001b[33m...\u001b[0m \u001b[1;36m10.0\u001b[0m \u001b[1;36m9.0\u001b[0m \n", + "\u001b[1;36m4\u001b[0m \u001b[3;91mFalse\u001b[0m \u001b[33m...\u001b[0m \u001b[1;36m10.0\u001b[0m \u001b[1;36m9.0\u001b[0m \n", "\n", " review_scores_price number_of_reviews reviews_per_month id \\\n", - "\u001B[1;36m0\u001B[0m \u001B[1;36m9.0\u001B[0m \u001B[1;36m26\u001B[0m \u001B[1;36m0.77\u001B[0m \u001B[1;36m32413\u001B[0m \n", - "\u001B[1;36m1\u001B[0m \u001B[1;36m9.0\u001B[0m \u001B[1;36m61\u001B[0m \u001B[1;36m0.62\u001B[0m \u001B[1;36m14122\u001B[0m \n", - "\u001B[1;36m2\u001B[0m \u001B[1;36m10.0\u001B[0m \u001B[1;36m467\u001B[0m \u001B[1;36m4.66\u001B[0m \u001B[1;36m47761\u001B[0m \n", - "\u001B[1;36m3\u001B[0m \u001B[1;36m9.0\u001B[0m \u001B[1;36m318\u001B[0m \u001B[1;36m3.22\u001B[0m \u001B[1;36m26648\u001B[0m \n", - "\u001B[1;36m4\u001B[0m \u001B[1;36m10.0\u001B[0m \u001B[1;36m22\u001B[0m \u001B[1;36m0.29\u001B[0m \u001B[1;36m26648\u001B[0m \n", + "\u001b[1;36m0\u001b[0m \u001b[1;36m9.0\u001b[0m \u001b[1;36m26\u001b[0m \u001b[1;36m0.77\u001b[0m \u001b[1;36m32413\u001b[0m \n", + "\u001b[1;36m1\u001b[0m \u001b[1;36m9.0\u001b[0m \u001b[1;36m61\u001b[0m \u001b[1;36m0.62\u001b[0m \u001b[1;36m14122\u001b[0m \n", + "\u001b[1;36m2\u001b[0m \u001b[1;36m10.0\u001b[0m \u001b[1;36m467\u001b[0m \u001b[1;36m4.66\u001b[0m \u001b[1;36m47761\u001b[0m \n", + "\u001b[1;36m3\u001b[0m \u001b[1;36m9.0\u001b[0m \u001b[1;36m318\u001b[0m \u001b[1;36m3.22\u001b[0m \u001b[1;36m26648\u001b[0m \n", + "\u001b[1;36m4\u001b[0m \u001b[1;36m10.0\u001b[0m \u001b[1;36m22\u001b[0m \u001b[1;36m0.29\u001b[0m \u001b[1;36m26648\u001b[0m \n", "\n", " company_rating company_location total_fleet_count iata_approved \n", - "\u001B[1;36m0\u001B[0m \u001B[1;36m1.0\u001B[0m Faroe Islands \u001B[1;36m1.0\u001B[0m \u001B[3;91mFalse\u001B[0m \n", - "\u001B[1;36m1\u001B[0m \u001B[1;36m1.0\u001B[0m Malta \u001B[1;36m1.0\u001B[0m \u001B[3;92mTrue\u001B[0m \n", - "\u001B[1;36m2\u001B[0m \u001B[1;36m1.0\u001B[0m Niue \u001B[1;36m2.0\u001B[0m \u001B[3;91mFalse\u001B[0m \n", - "\u001B[1;36m3\u001B[0m \u001B[1;36m1.0\u001B[0m Niue \u001B[1;36m2.0\u001B[0m \u001B[3;92mTrue\u001B[0m \n", - "\u001B[1;36m4\u001B[0m \u001B[1;36m1.0\u001B[0m Niue \u001B[1;36m2.0\u001B[0m \u001B[3;92mTrue\u001B[0m \n", + "\u001b[1;36m0\u001b[0m \u001b[1;36m1.0\u001b[0m Faroe Islands \u001b[1;36m1.0\u001b[0m \u001b[3;91mFalse\u001b[0m \n", + "\u001b[1;36m1\u001b[0m \u001b[1;36m1.0\u001b[0m Malta \u001b[1;36m1.0\u001b[0m \u001b[3;92mTrue\u001b[0m \n", + "\u001b[1;36m2\u001b[0m \u001b[1;36m1.0\u001b[0m Niue \u001b[1;36m2.0\u001b[0m \u001b[3;91mFalse\u001b[0m \n", + "\u001b[1;36m3\u001b[0m \u001b[1;36m1.0\u001b[0m Niue \u001b[1;36m2.0\u001b[0m \u001b[3;92mTrue\u001b[0m \n", + "\u001b[1;36m4\u001b[0m \u001b[1;36m1.0\u001b[0m Niue \u001b[1;36m2.0\u001b[0m \u001b[3;92mTrue\u001b[0m \n", "\n", - "\u001B[1m[\u001B[0m\u001B[1;36m5\u001B[0m rows x \u001B[1;36m27\u001B[0m columns\u001B[1m]\u001B[0m" + "\u001b[1m[\u001b[0m\u001b[1;36m5\u001b[0m rows x \u001b[1;36m27\u001b[0m columns\u001b[1m]\u001b[0m" ] }, "execution_count": 5, @@ -1009,80 +1016,80 @@ "data": { "text/plain": [ "\n", - "\u001B[1m{\u001B[0m\n", - " \u001B[32m'model_input_table__parquet'\u001B[0m: \u001B[1m{\u001B[0m\n", - " \u001B[32m'file_metadata'\u001B[0m: \u001B[1m{\u001B[0m\n", - " \u001B[32m'size'\u001B[0m: \u001B[1;36m215150\u001B[0m,\n", - " \u001B[32m'path'\u001B[0m: \u001B[32m'../kedro-code/data/03_primary/model_input_table.pq'\u001B[0m,\n", - " \u001B[32m'last_modified'\u001B[0m: \u001B[1;36m1716408659.312288\u001B[0m,\n", - " \u001B[32m'timestamp'\u001B[0m: \u001B[1;36m1716423059.328785\u001B[0m,\n", - " \u001B[32m'scheme'\u001B[0m: \u001B[32m''\u001B[0m,\n", - " \u001B[32m'notes'\u001B[0m: \u001B[32m''\u001B[0m\n", - " \u001B[1m}\u001B[0m,\n", - " \u001B[32m'dataframe_metadata'\u001B[0m: \u001B[1m{\u001B[0m\n", - " \u001B[32m'rows'\u001B[0m: \u001B[1;36m6027\u001B[0m,\n", - " \u001B[32m'columns'\u001B[0m: \u001B[1;36m27\u001B[0m,\n", - " \u001B[32m'column_names'\u001B[0m: \u001B[1m[\u001B[0m\n", - " \u001B[32m'shuttle_location'\u001B[0m,\n", - " \u001B[32m'shuttle_type'\u001B[0m,\n", - " \u001B[32m'engine_type'\u001B[0m,\n", - " \u001B[32m'engine_vendor'\u001B[0m,\n", - " \u001B[32m'engines'\u001B[0m,\n", - " \u001B[32m'passenger_capacity'\u001B[0m,\n", - " \u001B[32m'cancellation_policy'\u001B[0m,\n", - " \u001B[32m'crew'\u001B[0m,\n", - " \u001B[32m'd_check_complete'\u001B[0m,\n", - " \u001B[32m'moon_clearance_complete'\u001B[0m,\n", - " \u001B[32m'price'\u001B[0m,\n", - " \u001B[32m'company_id'\u001B[0m,\n", - " \u001B[32m'shuttle_id'\u001B[0m,\n", - " \u001B[32m'review_scores_rating'\u001B[0m,\n", - " \u001B[32m'review_scores_comfort'\u001B[0m,\n", - " \u001B[32m'review_scores_amenities'\u001B[0m,\n", - " \u001B[32m'review_scores_trip'\u001B[0m,\n", - " \u001B[32m'review_scores_crew'\u001B[0m,\n", - " \u001B[32m'review_scores_location'\u001B[0m,\n", - " \u001B[32m'review_scores_price'\u001B[0m,\n", - " \u001B[32m'number_of_reviews'\u001B[0m,\n", - " \u001B[32m'reviews_per_month'\u001B[0m,\n", - " \u001B[32m'id'\u001B[0m,\n", - " \u001B[32m'company_rating'\u001B[0m,\n", - " \u001B[32m'company_location'\u001B[0m,\n", - " \u001B[32m'total_fleet_count'\u001B[0m,\n", - " \u001B[32m'iata_approved'\u001B[0m\n", - " \u001B[1m]\u001B[0m,\n", - " \u001B[32m'datatypes'\u001B[0m: \u001B[1m[\u001B[0m\n", - " \u001B[32m'string'\u001B[0m,\n", - " \u001B[32m'string'\u001B[0m,\n", - " \u001B[32m'string'\u001B[0m,\n", - " \u001B[32m'string'\u001B[0m,\n", - " \u001B[32m'Int64'\u001B[0m,\n", - " \u001B[32m'Int64'\u001B[0m,\n", - " \u001B[32m'string'\u001B[0m,\n", - " \u001B[32m'Int64'\u001B[0m,\n", - " \u001B[32m'boolean'\u001B[0m,\n", - " \u001B[32m'boolean'\u001B[0m,\n", - " \u001B[32m'float64'\u001B[0m,\n", - " \u001B[32m'Int64'\u001B[0m,\n", - " \u001B[32m'Int64'\u001B[0m,\n", - " \u001B[32m'Float64'\u001B[0m,\n", - " \u001B[32m'Float64'\u001B[0m,\n", - " \u001B[32m'Float64'\u001B[0m,\n", - " \u001B[32m'Float64'\u001B[0m,\n", - " \u001B[32m'Float64'\u001B[0m,\n", - " \u001B[32m'Float64'\u001B[0m,\n", - " \u001B[32m'Float64'\u001B[0m,\n", - " \u001B[32m'Int64'\u001B[0m,\n", - " \u001B[32m'Float64'\u001B[0m,\n", - " \u001B[32m'Int64'\u001B[0m,\n", - " \u001B[32m'float64'\u001B[0m,\n", - " \u001B[32m'string'\u001B[0m,\n", - " \u001B[32m'Float64'\u001B[0m,\n", - " \u001B[32m'boolean'\u001B[0m\n", - " \u001B[1m]\u001B[0m\n", - " \u001B[1m}\u001B[0m\n", - " \u001B[1m}\u001B[0m\n", - "\u001B[1m}\u001B[0m" + "\u001b[1m{\u001b[0m\n", + " \u001b[32m'model_input_table__parquet'\u001b[0m: \u001b[1m{\u001b[0m\n", + " \u001b[32m'file_metadata'\u001b[0m: \u001b[1m{\u001b[0m\n", + " \u001b[32m'size'\u001b[0m: \u001b[1;36m215150\u001b[0m,\n", + " \u001b[32m'path'\u001b[0m: \u001b[32m'../kedro-code/data/03_primary/model_input_table.pq'\u001b[0m,\n", + " \u001b[32m'last_modified'\u001b[0m: \u001b[1;36m1716408659.312288\u001b[0m,\n", + " \u001b[32m'timestamp'\u001b[0m: \u001b[1;36m1716423059.328785\u001b[0m,\n", + " \u001b[32m'scheme'\u001b[0m: \u001b[32m''\u001b[0m,\n", + " \u001b[32m'notes'\u001b[0m: \u001b[32m''\u001b[0m\n", + " \u001b[1m}\u001b[0m,\n", + " \u001b[32m'dataframe_metadata'\u001b[0m: \u001b[1m{\u001b[0m\n", + " \u001b[32m'rows'\u001b[0m: \u001b[1;36m6027\u001b[0m,\n", + " \u001b[32m'columns'\u001b[0m: \u001b[1;36m27\u001b[0m,\n", + " \u001b[32m'column_names'\u001b[0m: \u001b[1m[\u001b[0m\n", + " \u001b[32m'shuttle_location'\u001b[0m,\n", + " \u001b[32m'shuttle_type'\u001b[0m,\n", + " \u001b[32m'engine_type'\u001b[0m,\n", + " \u001b[32m'engine_vendor'\u001b[0m,\n", + " \u001b[32m'engines'\u001b[0m,\n", + " \u001b[32m'passenger_capacity'\u001b[0m,\n", + " \u001b[32m'cancellation_policy'\u001b[0m,\n", + " \u001b[32m'crew'\u001b[0m,\n", + " \u001b[32m'd_check_complete'\u001b[0m,\n", + " \u001b[32m'moon_clearance_complete'\u001b[0m,\n", + " \u001b[32m'price'\u001b[0m,\n", + " \u001b[32m'company_id'\u001b[0m,\n", + " \u001b[32m'shuttle_id'\u001b[0m,\n", + " \u001b[32m'review_scores_rating'\u001b[0m,\n", + " \u001b[32m'review_scores_comfort'\u001b[0m,\n", + " \u001b[32m'review_scores_amenities'\u001b[0m,\n", + " \u001b[32m'review_scores_trip'\u001b[0m,\n", + " \u001b[32m'review_scores_crew'\u001b[0m,\n", + " \u001b[32m'review_scores_location'\u001b[0m,\n", + " \u001b[32m'review_scores_price'\u001b[0m,\n", + " \u001b[32m'number_of_reviews'\u001b[0m,\n", + " \u001b[32m'reviews_per_month'\u001b[0m,\n", + " \u001b[32m'id'\u001b[0m,\n", + " \u001b[32m'company_rating'\u001b[0m,\n", + " \u001b[32m'company_location'\u001b[0m,\n", + " \u001b[32m'total_fleet_count'\u001b[0m,\n", + " \u001b[32m'iata_approved'\u001b[0m\n", + " \u001b[1m]\u001b[0m,\n", + " \u001b[32m'datatypes'\u001b[0m: \u001b[1m[\u001b[0m\n", + " \u001b[32m'string'\u001b[0m,\n", + " \u001b[32m'string'\u001b[0m,\n", + " \u001b[32m'string'\u001b[0m,\n", + " \u001b[32m'string'\u001b[0m,\n", + " \u001b[32m'Int64'\u001b[0m,\n", + " \u001b[32m'Int64'\u001b[0m,\n", + " \u001b[32m'string'\u001b[0m,\n", + " \u001b[32m'Int64'\u001b[0m,\n", + " \u001b[32m'boolean'\u001b[0m,\n", + " \u001b[32m'boolean'\u001b[0m,\n", + " \u001b[32m'float64'\u001b[0m,\n", + " \u001b[32m'Int64'\u001b[0m,\n", + " \u001b[32m'Int64'\u001b[0m,\n", + " \u001b[32m'Float64'\u001b[0m,\n", + " \u001b[32m'Float64'\u001b[0m,\n", + " \u001b[32m'Float64'\u001b[0m,\n", + " \u001b[32m'Float64'\u001b[0m,\n", + " \u001b[32m'Float64'\u001b[0m,\n", + " \u001b[32m'Float64'\u001b[0m,\n", + " \u001b[32m'Float64'\u001b[0m,\n", + " \u001b[32m'Int64'\u001b[0m,\n", + " \u001b[32m'Float64'\u001b[0m,\n", + " \u001b[32m'Int64'\u001b[0m,\n", + " \u001b[32m'float64'\u001b[0m,\n", + " \u001b[32m'string'\u001b[0m,\n", + " \u001b[32m'Float64'\u001b[0m,\n", + " \u001b[32m'boolean'\u001b[0m\n", + " \u001b[1m]\u001b[0m\n", + " \u001b[1m}\u001b[0m\n", + " \u001b[1m}\u001b[0m\n", + "\u001b[1m}\u001b[0m" ] }, "execution_count": 6, @@ -1143,7 +1150,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m[05/22/24 16:10:59]\u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Loading data from \u001B[38;5;208mshuttles\u001B[0m \u001B[1m(\u001B[0mExcelDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=251889;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=569579;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001B\\\u001B[2m483\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m[05/22/24 16:10:59]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Loading data from \u001b[38;5;208mshuttles\u001b[0m \u001b[1m(\u001b[0mExcelDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=251889;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=569579;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001b\\\u001b[2m483\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -1156,7 +1163,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m[05/22/24 16:11:01]\u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Loading data from \u001B[38;5;208mcompanies\u001B[0m \u001B[1m(\u001B[0mCSVDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=698982;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=247154;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001B\\\u001B[2m483\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m[05/22/24 16:11:01]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Loading data from \u001b[38;5;208mcompanies\u001b[0m \u001b[1m(\u001b[0mCSVDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=698982;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=247154;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001b\\\u001b[2m483\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -1169,7 +1176,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m \u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Loading data from \u001B[38;5;208mreviews\u001B[0m \u001B[1m(\u001B[0mCSVDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=651853;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=754005;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001B\\\u001B[2m483\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Loading data from \u001b[38;5;208mreviews\u001b[0m \u001b[1m(\u001b[0mCSVDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=651853;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=754005;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001b\\\u001b[2m483\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -1182,7 +1189,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m[05/22/24 16:11:02]\u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Saving data to \u001B[38;5;208mmodel_input_table\u001B[0m \u001B[1m(\u001B[0mParquetDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=845498;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=59594;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#525\u001B\\\u001B[2m525\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m[05/22/24 16:11:02]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Saving data to \u001b[38;5;208mmodel_input_table\u001b[0m \u001b[1m(\u001b[0mParquetDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=845498;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=59594;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#525\u001b\\\u001b[2m525\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -1201,7 +1208,7 @@ { "data": { "text/plain": [ - "\u001B[1m{\u001B[0m\u001B[32m'model_input_table__parquet'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'success'\u001B[0m: \u001B[3;92mTrue\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m" + "\u001b[1m{\u001b[0m\u001b[32m'model_input_table__parquet'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'success'\u001b[0m: \u001b[3;92mTrue\u001b[0m\u001b[1m}\u001b[0m\u001b[1m}\u001b[0m" ] }, "execution_count": 7, @@ -1264,7 +1271,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m \u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Loading data from \u001B[38;5;208mshuttles\u001B[0m \u001B[1m(\u001B[0mExcelDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=765638;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=540969;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001B\\\u001B[2m483\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Loading data from \u001b[38;5;208mshuttles\u001b[0m \u001b[1m(\u001b[0mExcelDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=765638;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=540969;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001b\\\u001b[2m483\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -1277,7 +1284,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m[05/22/24 16:11:04]\u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Loading data from \u001B[38;5;208mcompanies\u001B[0m \u001B[1m(\u001B[0mCSVDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=845539;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=373818;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001B\\\u001B[2m483\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m[05/22/24 16:11:04]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Loading data from \u001b[38;5;208mcompanies\u001b[0m \u001b[1m(\u001b[0mCSVDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=845539;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=373818;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001b\\\u001b[2m483\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -1290,7 +1297,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m \u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Loading data from \u001B[38;5;208mreviews\u001B[0m \u001B[1m(\u001B[0mCSVDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=673966;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=380648;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001B\\\u001B[2m483\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Loading data from \u001b[38;5;208mreviews\u001b[0m \u001b[1m(\u001b[0mCSVDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=673966;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=380648;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001b\\\u001b[2m483\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -1303,7 +1310,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m \u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Saving data to \u001B[38;5;208mmodel_input_table\u001B[0m \u001B[1m(\u001B[0mParquetDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=611834;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=912002;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#525\u001B\\\u001B[2m525\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Saving data to \u001b[38;5;208mmodel_input_table\u001b[0m \u001b[1m(\u001b[0mParquetDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=611834;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=912002;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#525\u001b\\\u001b[2m525\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -1322,7 +1329,7 @@ { "data": { "text/plain": [ - "\u001B[1m{\u001B[0m\u001B[32m'model_input_table__parquet'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'success'\u001B[0m: \u001B[3;92mTrue\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m" + "\u001b[1m{\u001b[0m\u001b[32m'model_input_table__parquet'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'success'\u001b[0m: \u001b[3;92mTrue\u001b[0m\u001b[1m}\u001b[0m\u001b[1m}\u001b[0m" ] }, "execution_count": 8, @@ -1643,7 +1650,7 @@ "\n" ], "text/plain": [ - "\u001B[1m<\u001B[0m\u001B[1;95mhamilton.driver.Driver\u001B[0m\u001B[39m object at \u001B[0m\u001B[1;36m0x7f267841b450\u001B[0m\u001B[1m>\u001B[0m" + "\u001b[1m<\u001b[0m\u001b[1;95mhamilton.driver.Driver\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x7f267841b450\u001b[0m\u001b[1m>\u001b[0m" ] }, "execution_count": 10, @@ -1695,10 +1702,10 @@ "\n" ], "text/plain": [ - "\u001B[2;36m[05/22/24 16:11:10]\u001B[0m\u001B[2;36m \u001B[0m\u001B[31mWARNING \u001B[0m \u001B]8;id=299905;file:///home/tjean/projects/dagworks/hamilton/ui/sdk/src/hamilton_sdk/adapters.py\u001B\\\u001B[2madapters.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=155714;file:///home/tjean/projects/dagworks/hamilton/ui/sdk/src/hamilton_sdk/adapters.py#163\u001B\\\u001B[2m163\u001B[0m\u001B]8;;\u001B\\\n", - "\u001B[2;36m \u001B[0m Capturing execution run. Results can be found at \u001B[2m \u001B[0m\n", - "\u001B[2;36m \u001B[0m \u001B[4;94mhttp://localhost:8242/dashboard/project/3/runs/32\u001B[0m \u001B[2m \u001B[0m\n", - "\u001B[2;36m \u001B[0m \u001B[2m \u001B[0m\n" + "\u001b[2;36m[05/22/24 16:11:10]\u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b]8;id=299905;file:///home/tjean/projects/dagworks/hamilton/ui/sdk/src/hamilton_sdk/adapters.py\u001b\\\u001b[2madapters.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=155714;file:///home/tjean/projects/dagworks/hamilton/ui/sdk/src/hamilton_sdk/adapters.py#163\u001b\\\u001b[2m163\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m Capturing execution run. Results can be found at \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[4;94mhttp://localhost:8242/dashboard/project/3/runs/32\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n" ] }, "metadata": {}, @@ -1711,7 +1718,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m \u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Loading data from \u001B[38;5;208mshuttles\u001B[0m \u001B[1m(\u001B[0mExcelDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=976064;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=997503;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001B\\\u001B[2m483\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Loading data from \u001b[38;5;208mshuttles\u001b[0m \u001b[1m(\u001b[0mExcelDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=976064;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=997503;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001b\\\u001b[2m483\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -1724,7 +1731,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m[05/22/24 16:11:13]\u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Loading data from \u001B[38;5;208mcompanies\u001B[0m \u001B[1m(\u001B[0mCSVDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=134319;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=446665;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001B\\\u001B[2m483\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m[05/22/24 16:11:13]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Loading data from \u001b[38;5;208mcompanies\u001b[0m \u001b[1m(\u001b[0mCSVDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=134319;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=446665;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001b\\\u001b[2m483\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -1737,7 +1744,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m \u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Loading data from \u001B[38;5;208mreviews\u001B[0m \u001B[1m(\u001B[0mCSVDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=620527;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=424729;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001B\\\u001B[2m483\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Loading data from \u001b[38;5;208mreviews\u001b[0m \u001b[1m(\u001b[0mCSVDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=620527;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=424729;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#483\u001b\\\u001b[2m483\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -1750,7 +1757,7 @@ "\n" ], "text/plain": [ - "\u001B[2;36m \u001B[0m\u001B[2;36m \u001B[0m\u001B[34mINFO \u001B[0m Saving data to \u001B[38;5;208mmodel_input_table\u001B[0m \u001B[1m(\u001B[0mParquetDataset\u001B[1m)\u001B[0m\u001B[33m...\u001B[0m \u001B]8;id=102118;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001B\\\u001B[2mdata_catalog.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=182015;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#525\u001B\\\u001B[2m525\u001B[0m\u001B]8;;\u001B\\\n" + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Saving data to \u001b[38;5;208mmodel_input_table\u001b[0m \u001b[1m(\u001b[0mParquetDataset\u001b[1m)\u001b[0m\u001b[33m...\u001b[0m \u001b]8;id=102118;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py\u001b\\\u001b[2mdata_catalog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=182015;file:///home/tjean/projects/dagworks/hamilton/examples/kedro/venv/lib/python3.11/site-packages/kedro/io/data_catalog.py#525\u001b\\\u001b[2m525\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -1766,10 +1773,10 @@ "\n" ], "text/plain": [ - "\u001B[2;36m \u001B[0m\u001B[2;36m \u001B[0m\u001B[31mWARNING \u001B[0m \u001B]8;id=48567;file:///home/tjean/projects/dagworks/hamilton/ui/sdk/src/hamilton_sdk/adapters.py\u001B\\\u001B[2madapters.py\u001B[0m\u001B]8;;\u001B\\\u001B[2m:\u001B[0m\u001B]8;id=639017;file:///home/tjean/projects/dagworks/hamilton/ui/sdk/src/hamilton_sdk/adapters.py#352\u001B\\\u001B[2m352\u001B[0m\u001B]8;;\u001B\\\n", - "\u001B[2;36m \u001B[0m Captured execution run. Results can be found at \u001B[2m \u001B[0m\n", - "\u001B[2;36m \u001B[0m \u001B[4;94mhttp://localhost:8242/dashboard/project/3/runs/32\u001B[0m \u001B[2m \u001B[0m\n", - "\u001B[2;36m \u001B[0m \u001B[2m \u001B[0m\n" + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b]8;id=48567;file:///home/tjean/projects/dagworks/hamilton/ui/sdk/src/hamilton_sdk/adapters.py\u001b\\\u001b[2madapters.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=639017;file:///home/tjean/projects/dagworks/hamilton/ui/sdk/src/hamilton_sdk/adapters.py#352\u001b\\\u001b[2m352\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m Captured execution run. Results can be found at \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[4;94mhttp://localhost:8242/dashboard/project/3/runs/32\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n" ] }, "metadata": {}, diff --git a/examples/lineage/README.md b/examples/lineage/README.md index 17846e9a3..fc289b530 100644 --- a/examples/lineage/README.md +++ b/examples/lineage/README.md @@ -1,3 +1,22 @@ + + # Lineage + Apache Hamilton ![Lineage Image](../../examples/lineage/lineage_v1.png) diff --git a/examples/lineage/data_loading.py b/examples/lineage/data_loading.py index 49390efd8..b053afee4 100644 --- a/examples/lineage/data_loading.py +++ b/examples/lineage/data_loading.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import List import pandas as pd diff --git a/examples/lineage/features.py b/examples/lineage/features.py index 1152da7b1..c185ea73a 100644 --- a/examples/lineage/features.py +++ b/examples/lineage/features.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np import pandas as pd from sklearn import preprocessing diff --git a/examples/lineage/lineage_commands.py b/examples/lineage/lineage_commands.py index 74b16f6d3..849c32682 100644 --- a/examples/lineage/lineage_commands.py +++ b/examples/lineage/lineage_commands.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ The code is an example utility script that you could write to help you interface with Hamilton and its lineage capabilities. diff --git a/examples/lineage/lineage_script.py b/examples/lineage/lineage_script.py index 24c3d2355..9e3946147 100644 --- a/examples/lineage/lineage_script.py +++ b/examples/lineage/lineage_script.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """This is a script at linearly walks through some lineage functionality that Hamilton has. It mirrors the code that was presented for the Lineage + Hamilton in 10 minutes blog post. diff --git a/examples/lineage/lineage_snippets.ipynb b/examples/lineage/lineage_snippets.ipynb index 9e5947f6d..72b2c4190 100644 --- a/examples/lineage/lineage_snippets.ipynb +++ b/examples/lineage/lineage_snippets.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/lineage/model_pipeline.py b/examples/lineage/model_pipeline.py index 5fe71a3c6..e25c666c4 100644 --- a/examples/lineage/model_pipeline.py +++ b/examples/lineage/model_pipeline.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Dict, Union import pandas as pd diff --git a/examples/lineage/sets.py b/examples/lineage/sets.py index 2482b0330..480f5003a 100644 --- a/examples/lineage/sets.py +++ b/examples/lineage/sets.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton.function_modifiers import tag diff --git a/examples/make_python_virtualenv.sh b/examples/make_python_virtualenv.sh index d2dc23b85..127014b50 100644 --- a/examples/make_python_virtualenv.sh +++ b/examples/make_python_virtualenv.sh @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + # This script is used to create separate python virtual environments for individual examples # A python virtual environment named "hamilton-env" is created in every directory containing requirements.txt file diff --git a/examples/materialization/README.md b/examples/materialization/README.md index a1d8684c4..206edd100 100644 --- a/examples/materialization/README.md +++ b/examples/materialization/README.md @@ -1,3 +1,22 @@ + + # Materialization Apache Hamilton's driver allows for ad-hoc materialization. This enables you to take a DAG you already have, diff --git a/examples/materialization/custom_materializers.py b/examples/materialization/custom_materializers.py index a2508ae43..95fe9da18 100644 --- a/examples/materialization/custom_materializers.py +++ b/examples/materialization/custom_materializers.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import dataclasses import pickle from typing import Any, Collection, Dict, Type diff --git a/examples/materialization/data_loaders.py b/examples/materialization/data_loaders.py index e31061eab..6cde1c4a3 100644 --- a/examples/materialization/data_loaders.py +++ b/examples/materialization/data_loaders.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np from sklearn import datasets, utils diff --git a/examples/materialization/datasaver_dataloader_example/README.md b/examples/materialization/datasaver_dataloader_example/README.md index ea163ab84..bff845555 100644 --- a/examples/materialization/datasaver_dataloader_example/README.md +++ b/examples/materialization/datasaver_dataloader_example/README.md @@ -1,3 +1,22 @@ + + # @datasaver and @dataloader example This example shows you can use the diff --git a/examples/materialization/datasaver_dataloader_example/notebook.ipynb b/examples/materialization/datasaver_dataloader_example/notebook.ipynb index 3d9eaaeb9..9f5ab77c9 100644 --- a/examples/materialization/datasaver_dataloader_example/notebook.ipynb +++ b/examples/materialization/datasaver_dataloader_example/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/materialization/datasaver_dataloader_example/run.py b/examples/materialization/datasaver_dataloader_example/run.py index bdedf98e0..3cfb2f100 100644 --- a/examples/materialization/datasaver_dataloader_example/run.py +++ b/examples/materialization/datasaver_dataloader_example/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import simple_etl from hamilton import driver diff --git a/examples/materialization/datasaver_dataloader_example/simple_etl.py b/examples/materialization/datasaver_dataloader_example/simple_etl.py index c7f02979c..d19584d0e 100644 --- a/examples/materialization/datasaver_dataloader_example/simple_etl.py +++ b/examples/materialization/datasaver_dataloader_example/simple_etl.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from sklearn import datasets diff --git a/examples/materialization/model_training.py b/examples/materialization/model_training.py index 894cc533a..2aa92f1e0 100644 --- a/examples/materialization/model_training.py +++ b/examples/materialization/model_training.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Dict import numpy as np diff --git a/examples/materialization/notebook.ipynb b/examples/materialization/notebook.ipynb index d1d117f09..951f88924 100644 --- a/examples/materialization/notebook.ipynb +++ b/examples/materialization/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/materialization/run.py b/examples/materialization/run.py index fce1faee7..30bf545eb 100644 --- a/examples/materialization/run.py +++ b/examples/materialization/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Example script showing how one might setup a generic model training pipeline that is quickly configurable. """ diff --git a/examples/mlflow/README.md b/examples/mlflow/README.md index 4c7e512bd..e49f7660f 100644 --- a/examples/mlflow/README.md +++ b/examples/mlflow/README.md @@ -1,3 +1,22 @@ + + # MLFLow plugin for Apache Hamilton [MLFlow](https://mlflow.org/) is an open-source Python framework for experiment tracking. It allows data science teams to store results, artifacts (machine learning models, figures, tables), and metadata in a principled way when executing data pipelines. diff --git a/examples/mlflow/tutorial.ipynb b/examples/mlflow/tutorial.ipynb index 0b06ddb04..db3c275f7 100644 --- a/examples/mlflow/tutorial.ipynb +++ b/examples/mlflow/tutorial.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/model_examples/README.md b/examples/model_examples/README.md index 3d1e5fa43..59c21ea6a 100644 --- a/examples/model_examples/README.md +++ b/examples/model_examples/README.md @@ -1,3 +1,22 @@ + + # Creating model training/predict workflows with Apache Hamilton Apache Hamilton is a general purpose dataflow framework. So you can diff --git a/examples/model_examples/modular_example/README.md b/examples/model_examples/modular_example/README.md index c0076c04b..46d4538f5 100644 --- a/examples/model_examples/modular_example/README.md +++ b/examples/model_examples/modular_example/README.md @@ -1,3 +1,22 @@ + + # Modular pipeline example In this example we show how you can compose a pipeline from multiple modules. diff --git a/examples/model_examples/modular_example/features.py b/examples/model_examples/modular_example/features.py index a18f7e84b..434f8931d 100644 --- a/examples/model_examples/modular_example/features.py +++ b/examples/model_examples/modular_example/features.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd diff --git a/examples/model_examples/modular_example/inference.py b/examples/model_examples/modular_example/inference.py index fdf79e73a..6fbdbbec5 100644 --- a/examples/model_examples/modular_example/inference.py +++ b/examples/model_examples/modular_example/inference.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Any import pandas as pd diff --git a/examples/model_examples/modular_example/notebook.ipynb b/examples/model_examples/modular_example/notebook.ipynb index c3c3eef07..8c913a4f7 100644 --- a/examples/model_examples/modular_example/notebook.ipynb +++ b/examples/model_examples/modular_example/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "metadata": {}, "cell_type": "code", diff --git a/examples/model_examples/modular_example/pipeline.py b/examples/model_examples/modular_example/pipeline.py index 0c7ebb0eb..7fc09caf6 100644 --- a/examples/model_examples/modular_example/pipeline.py +++ b/examples/model_examples/modular_example/pipeline.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Any import features diff --git a/examples/model_examples/modular_example/run.py b/examples/model_examples/modular_example/run.py index 415bd2863..d15c0d6d7 100644 --- a/examples/model_examples/modular_example/run.py +++ b/examples/model_examples/modular_example/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pipeline from hamilton import driver diff --git a/examples/model_examples/modular_example/train.py b/examples/model_examples/modular_example/train.py index 9d0d93bea..50caf6d79 100644 --- a/examples/model_examples/modular_example/train.py +++ b/examples/model_examples/modular_example/train.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Any import pandas as pd diff --git a/examples/model_examples/scikit-learn/Hamilton_for_ML_dataflows.ipynb b/examples/model_examples/scikit-learn/Hamilton_for_ML_dataflows.ipynb index 80ee07a76..081d8b3f7 100644 --- a/examples/model_examples/scikit-learn/Hamilton_for_ML_dataflows.ipynb +++ b/examples/model_examples/scikit-learn/Hamilton_for_ML_dataflows.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/model_examples/scikit-learn/README.md b/examples/model_examples/scikit-learn/README.md index 21e425326..ead8d390c 100644 --- a/examples/model_examples/scikit-learn/README.md +++ b/examples/model_examples/scikit-learn/README.md @@ -1,3 +1,22 @@ + + # Using Apache Hamilton for ML dataflows Here we have a simple example showing how you can diff --git a/examples/model_examples/scikit-learn/digit_loader.py b/examples/model_examples/scikit-learn/digit_loader.py index bbd640723..53cdfd9a5 100644 --- a/examples/model_examples/scikit-learn/digit_loader.py +++ b/examples/model_examples/scikit-learn/digit_loader.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np from sklearn import datasets, utils diff --git a/examples/model_examples/scikit-learn/iris_loader.py b/examples/model_examples/scikit-learn/iris_loader.py index e0ecb67e2..8688c7df9 100644 --- a/examples/model_examples/scikit-learn/iris_loader.py +++ b/examples/model_examples/scikit-learn/iris_loader.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np from sklearn import datasets, utils diff --git a/examples/model_examples/scikit-learn/my_train_evaluate_logic.py b/examples/model_examples/scikit-learn/my_train_evaluate_logic.py index 0c56cad3e..ccbdc69e8 100644 --- a/examples/model_examples/scikit-learn/my_train_evaluate_logic.py +++ b/examples/model_examples/scikit-learn/my_train_evaluate_logic.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Dict import numpy as np diff --git a/examples/model_examples/scikit-learn/run.py b/examples/model_examples/scikit-learn/run.py index d49ee5ba0..0928bb5ee 100644 --- a/examples/model_examples/scikit-learn/run.py +++ b/examples/model_examples/scikit-learn/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Example script showing how one might setup a generic model training pipeline that is quickly configurable. """ diff --git a/examples/model_examples/time-series/Hamilton-TimeSeriesmodel.ipynb b/examples/model_examples/time-series/Hamilton-TimeSeriesmodel.ipynb index 2214a641c..0adf25bd6 100644 --- a/examples/model_examples/time-series/Hamilton-TimeSeriesmodel.ipynb +++ b/examples/model_examples/time-series/Hamilton-TimeSeriesmodel.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/model_examples/time-series/README.md b/examples/model_examples/time-series/README.md index 3a91ed204..93412d65a 100644 --- a/examples/model_examples/time-series/README.md +++ b/examples/model_examples/time-series/README.md @@ -1,3 +1,22 @@ + + # Kaggle M5 Forecasting Source - https://www.kaggle.com/c/m5-forecasting-accuracy. diff --git a/examples/model_examples/time-series/data_loaders.py b/examples/model_examples/time-series/data_loaders.py index 6d0558fd7..8e2d4da8c 100644 --- a/examples/model_examples/time-series/data_loaders.py +++ b/examples/model_examples/time-series/data_loaders.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import gc import logging import os diff --git a/examples/model_examples/time-series/model_pipeline.py b/examples/model_examples/time-series/model_pipeline.py index bc7f0253b..1cdd63ed3 100644 --- a/examples/model_examples/time-series/model_pipeline.py +++ b/examples/model_examples/time-series/model_pipeline.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import gc import logging diff --git a/examples/model_examples/time-series/run.py b/examples/model_examples/time-series/run.py index 0c96d2686..64eb9e49e 100644 --- a/examples/model_examples/time-series/run.py +++ b/examples/model_examples/time-series/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging import sys import time diff --git a/examples/model_examples/time-series/transforms.py b/examples/model_examples/time-series/transforms.py index 4a9e8cac2..299a964a8 100644 --- a/examples/model_examples/time-series/transforms.py +++ b/examples/model_examples/time-series/transforms.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Tuple import pandas as pd diff --git a/examples/model_examples/time-series/utils.py b/examples/model_examples/time-series/utils.py index 5293d5e8c..854cd8713 100644 --- a/examples/model_examples/time-series/utils.py +++ b/examples/model_examples/time-series/utils.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging import numpy as np diff --git a/examples/module_overrides/README.md b/examples/module_overrides/README.md index 932ca07e6..14ca25f61 100644 --- a/examples/module_overrides/README.md +++ b/examples/module_overrides/README.md @@ -1,3 +1,22 @@ + + # Allowing modules to override same named functions When constructing the ``Driver``, we can import several modules: diff --git a/examples/module_overrides/module_a.py b/examples/module_overrides/module_a.py index b83d4001f..359922f2c 100644 --- a/examples/module_overrides/module_a.py +++ b/examples/module_overrides/module_a.py @@ -1,2 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + + def foo() -> str: return "This is module a." diff --git a/examples/module_overrides/module_b.py b/examples/module_overrides/module_b.py index a5db01b81..3003ebee0 100644 --- a/examples/module_overrides/module_b.py +++ b/examples/module_overrides/module_b.py @@ -1,2 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + + def foo() -> str: return "This is module b." diff --git a/examples/module_overrides/run.py b/examples/module_overrides/run.py index 20a8bf545..ec79ac5c6 100644 --- a/examples/module_overrides/run.py +++ b/examples/module_overrides/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import module_a import module_b diff --git a/examples/mutate/abstract_functionality_blueprint/README b/examples/mutate/abstract_functionality_blueprint/README index 342fc6033..012ec4e00 100644 --- a/examples/mutate/abstract_functionality_blueprint/README +++ b/examples/mutate/abstract_functionality_blueprint/README @@ -1,3 +1,22 @@ + + # Mutate We give some application suggestions for mutating the outputs of functions in a distributed manner with `@mutate.` diff --git a/examples/mutate/abstract_functionality_blueprint/mutate.py b/examples/mutate/abstract_functionality_blueprint/mutate.py index ae1d7326b..786e5982c 100644 --- a/examples/mutate/abstract_functionality_blueprint/mutate.py +++ b/examples/mutate/abstract_functionality_blueprint/mutate.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Any, List import pandas as pd diff --git a/examples/mutate/abstract_functionality_blueprint/mutate_on_output.py b/examples/mutate/abstract_functionality_blueprint/mutate_on_output.py index fb901adc3..571a44847 100644 --- a/examples/mutate/abstract_functionality_blueprint/mutate_on_output.py +++ b/examples/mutate/abstract_functionality_blueprint/mutate_on_output.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Any, Dict, List import pandas as pd diff --git a/examples/mutate/abstract_functionality_blueprint/mutate_twice_the_same.py b/examples/mutate/abstract_functionality_blueprint/mutate_twice_the_same.py index b67fa26a3..8ec0297dc 100644 --- a/examples/mutate/abstract_functionality_blueprint/mutate_twice_the_same.py +++ b/examples/mutate/abstract_functionality_blueprint/mutate_twice_the_same.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from hamilton.function_modifiers import mutate diff --git a/examples/mutate/abstract_functionality_blueprint/notebook.ipynb b/examples/mutate/abstract_functionality_blueprint/notebook.ipynb index f6061ea4c..a73c36ea7 100644 --- a/examples/mutate/abstract_functionality_blueprint/notebook.ipynb +++ b/examples/mutate/abstract_functionality_blueprint/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/mutate/abstract_functionality_blueprint/pipe_output.py b/examples/mutate/abstract_functionality_blueprint/pipe_output.py index f6c4fec38..47e8263e0 100644 --- a/examples/mutate/abstract_functionality_blueprint/pipe_output.py +++ b/examples/mutate/abstract_functionality_blueprint/pipe_output.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Any, List import pandas as pd diff --git a/examples/mutate/abstract_functionality_blueprint/pipe_output_on_output.py b/examples/mutate/abstract_functionality_blueprint/pipe_output_on_output.py index 7649778bf..a3ccdfac8 100644 --- a/examples/mutate/abstract_functionality_blueprint/pipe_output_on_output.py +++ b/examples/mutate/abstract_functionality_blueprint/pipe_output_on_output.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Dict from hamilton.function_modifiers import ( diff --git a/examples/mutate/abstract_functionality_blueprint/procedural.py b/examples/mutate/abstract_functionality_blueprint/procedural.py index f95d5a0a0..11b6b2ee0 100644 --- a/examples/mutate/abstract_functionality_blueprint/procedural.py +++ b/examples/mutate/abstract_functionality_blueprint/procedural.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Any, List import pandas as pd diff --git a/examples/narwhals/README.md b/examples/narwhals/README.md index 12e2d148e..d28901f29 100644 --- a/examples/narwhals/README.md +++ b/examples/narwhals/README.md @@ -1,3 +1,22 @@ + + # Narwhals [Narwhals](https://narwhals-dev.github.io/narwhals/) is a library that aims diff --git a/examples/narwhals/example.py b/examples/narwhals/example.py index 1b70310b3..c367d8765 100644 --- a/examples/narwhals/example.py +++ b/examples/narwhals/example.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import narwhals as nw import pandas as pd import polars as pl diff --git a/examples/narwhals/notebook.ipynb b/examples/narwhals/notebook.ipynb index a0fce5ab1..d7d7b0314 100644 --- a/examples/narwhals/notebook.ipynb +++ b/examples/narwhals/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/numpy/air-quality-analysis/README.md b/examples/numpy/air-quality-analysis/README.md index 4ac67336d..36215daea 100644 --- a/examples/numpy/air-quality-analysis/README.md +++ b/examples/numpy/air-quality-analysis/README.md @@ -1,3 +1,22 @@ + + # Air Quality Analysis This is taken from the numpy tutorial https://github.com/numpy/numpy-tutorials/blob/main/content/tutorial-air-quality-analysis.md. diff --git a/examples/numpy/air-quality-analysis/analysis_flow.py b/examples/numpy/air-quality-analysis/analysis_flow.py index c3b37c82a..1830db962 100644 --- a/examples/numpy/air-quality-analysis/analysis_flow.py +++ b/examples/numpy/air-quality-analysis/analysis_flow.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This code is based on the example presented in https://github.com/numpy/numpy-tutorials/blob/main/content/tutorial-air-quality-analysis.md diff --git a/examples/numpy/air-quality-analysis/hamilton_notebook.ipynb b/examples/numpy/air-quality-analysis/hamilton_notebook.ipynb index c75343bd9..86fbe5d94 100644 --- a/examples/numpy/air-quality-analysis/hamilton_notebook.ipynb +++ b/examples/numpy/air-quality-analysis/hamilton_notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/numpy/air-quality-analysis/run_analysis.py b/examples/numpy/air-quality-analysis/run_analysis.py index 754ae30a3..bfbd87739 100644 --- a/examples/numpy/air-quality-analysis/run_analysis.py +++ b/examples/numpy/air-quality-analysis/run_analysis.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import analysis_flow from hamilton import base, driver diff --git a/examples/openlineage/README.md b/examples/openlineage/README.md index 86cdc1458..973f49c34 100644 --- a/examples/openlineage/README.md +++ b/examples/openlineage/README.md @@ -1,3 +1,22 @@ + + # OpenLineage Adapter This is an example of how to use the OpenLineage adapter that can be used to send metadata to an OpenLineage server. diff --git a/examples/openlineage/fake_data.py b/examples/openlineage/fake_data.py index 02450ad9f..85f67e687 100644 --- a/examples/openlineage/fake_data.py +++ b/examples/openlineage/fake_data.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ Module to help generate fake data for testing purposes. """ diff --git a/examples/openlineage/notebook.ipynb b/examples/openlineage/notebook.ipynb index 3a9b95987..cababdcb4 100644 --- a/examples/openlineage/notebook.ipynb +++ b/examples/openlineage/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/openlineage/pipeline.py b/examples/openlineage/pipeline.py index f9b0c74b8..1178d3d5f 100644 --- a/examples/openlineage/pipeline.py +++ b/examples/openlineage/pipeline.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pickle from typing import Tuple diff --git a/examples/openlineage/run.py b/examples/openlineage/run.py index 6dcdf3e5e..deda4b147 100644 --- a/examples/openlineage/run.py +++ b/examples/openlineage/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import sqlite3 import pipeline diff --git a/examples/opentelemetry/README.md b/examples/opentelemetry/README.md index e98aad78f..53da2d44c 100644 --- a/examples/opentelemetry/README.md +++ b/examples/opentelemetry/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton + OpenTelemetry You can use the `hamilton.plugins.OpenTelemetryTracer()` to send telemetry diff --git a/examples/pandas/materialization/my_functions.py b/examples/pandas/materialization/my_functions.py index b54f6b171..c57618842 100644 --- a/examples/pandas/materialization/my_functions.py +++ b/examples/pandas/materialization/my_functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd """ diff --git a/examples/pandas/materialization/my_script.py b/examples/pandas/materialization/my_script.py index 252def815..d42fb192b 100644 --- a/examples/pandas/materialization/my_script.py +++ b/examples/pandas/materialization/my_script.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging import sqlite3 import sys diff --git a/examples/pandas/materialization/notebook.ipynb b/examples/pandas/materialization/notebook.ipynb index 601115b24..73a2677ee 100644 --- a/examples/pandas/materialization/notebook.ipynb +++ b/examples/pandas/materialization/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/pandas/split-apply-combine/README.md b/examples/pandas/split-apply-combine/README.md index 5ecca18cf..733679be4 100644 --- a/examples/pandas/split-apply-combine/README.md +++ b/examples/pandas/split-apply-combine/README.md @@ -1,3 +1,22 @@ + + # Split / Apply / Combine This example demonstrates how to perform diff --git a/examples/pandas/split-apply-combine/my_functions.py b/examples/pandas/split-apply-combine/my_functions.py index 218dda155..dda9b3bed 100644 --- a/examples/pandas/split-apply-combine/my_functions.py +++ b/examples/pandas/split-apply-combine/my_functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Dict import numpy as np diff --git a/examples/pandas/split-apply-combine/my_script.py b/examples/pandas/split-apply-combine/my_script.py index d1ca28297..5c3c49143 100644 --- a/examples/pandas/split-apply-combine/my_script.py +++ b/examples/pandas/split-apply-combine/my_script.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from inspect import cleandoc from io import StringIO diff --git a/examples/pandas/split-apply-combine/my_wrapper.py b/examples/pandas/split-apply-combine/my_wrapper.py index 95ee04dde..77c210aca 100644 --- a/examples/pandas/split-apply-combine/my_wrapper.py +++ b/examples/pandas/split-apply-combine/my_wrapper.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Dict import my_functions diff --git a/examples/pandas/split-apply-combine/notebook.ipynb b/examples/pandas/split-apply-combine/notebook.ipynb index 94b134d95..26af76012 100644 --- a/examples/pandas/split-apply-combine/notebook.ipynb +++ b/examples/pandas/split-apply-combine/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/pandas/with_columns/README b/examples/pandas/with_columns/README index 53a422d5a..78eec3c60 100644 --- a/examples/pandas/with_columns/README +++ b/examples/pandas/with_columns/README @@ -1,3 +1,22 @@ + + # Using with_columns with Pandas We show the ability to use the familiar `with_columns` from either `pyspark` or `polars` on a Pandas dataframe. diff --git a/examples/pandas/with_columns/my_functions.py b/examples/pandas/with_columns/my_functions.py index 5ce250227..35093b8bb 100644 --- a/examples/pandas/with_columns/my_functions.py +++ b/examples/pandas/with_columns/my_functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton.function_modifiers import config diff --git a/examples/pandas/with_columns/notebook.ipynb b/examples/pandas/with_columns/notebook.ipynb index 94953a288..affae9070 100644 --- a/examples/pandas/with_columns/notebook.ipynb +++ b/examples/pandas/with_columns/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/parallelism/README.md b/examples/parallelism/README.md index 02a6426f0..c8f47ba05 100644 --- a/examples/parallelism/README.md +++ b/examples/parallelism/README.md @@ -1,3 +1,22 @@ + + Here you'll find some examples that demonstrate how to use Apache Hamilton's parallelism features. Note: serialization caveats still apply. For more information see the diff --git a/examples/parallelism/file_processing/README.md b/examples/parallelism/file_processing/README.md index 9d412c4f3..dc3ae9455 100644 --- a/examples/parallelism/file_processing/README.md +++ b/examples/parallelism/file_processing/README.md @@ -1,3 +1,22 @@ + + # Parallelism Example ## Overview diff --git a/examples/parallelism/file_processing/aggregate_data.py b/examples/parallelism/file_processing/aggregate_data.py index 952a17d29..0c4075e85 100644 --- a/examples/parallelism/file_processing/aggregate_data.py +++ b/examples/parallelism/file_processing/aggregate_data.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton.htypes import Collect diff --git a/examples/parallelism/file_processing/list_data.py b/examples/parallelism/file_processing/list_data.py index 00b99416f..11da3307b 100644 --- a/examples/parallelism/file_processing/list_data.py +++ b/examples/parallelism/file_processing/list_data.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import dataclasses import os from typing import List diff --git a/examples/parallelism/file_processing/notebook.ipynb b/examples/parallelism/file_processing/notebook.ipynb index cd30a4e30..3d3025e2f 100644 --- a/examples/parallelism/file_processing/notebook.ipynb +++ b/examples/parallelism/file_processing/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/parallelism/file_processing/process_data.py b/examples/parallelism/file_processing/process_data.py index 8a6e36f94..b697c1a86 100644 --- a/examples/parallelism/file_processing/process_data.py +++ b/examples/parallelism/file_processing/process_data.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from list_data import CityData diff --git a/examples/parallelism/file_processing/run.py b/examples/parallelism/file_processing/run.py index d21f02dc2..e2f378325 100644 --- a/examples/parallelism/file_processing/run.py +++ b/examples/parallelism/file_processing/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging import aggregate_data diff --git a/examples/parallelism/graceful_running/README.md b/examples/parallelism/graceful_running/README.md index 635f89653..5215433a6 100644 --- a/examples/parallelism/graceful_running/README.md +++ b/examples/parallelism/graceful_running/README.md @@ -1,3 +1,22 @@ + + # Parallelism with GracefulErrorAdapter Example ## Overview diff --git a/examples/parallelism/graceful_running/functions.py b/examples/parallelism/graceful_running/functions.py index 07507ad53..9482ccce2 100644 --- a/examples/parallelism/graceful_running/functions.py +++ b/examples/parallelism/graceful_running/functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from itertools import cycle from typing import Any, Callable, Iterable, List, Tuple, Union diff --git a/examples/parallelism/graceful_running/run.py b/examples/parallelism/graceful_running/run.py index fd19881ce..43e747070 100644 --- a/examples/parallelism/graceful_running/run.py +++ b/examples/parallelism/graceful_running/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Iterable, Tuple import click diff --git a/examples/parallelism/lazy_threadpool_execution/README.md b/examples/parallelism/lazy_threadpool_execution/README.md index e374a9570..38a79db76 100644 --- a/examples/parallelism/lazy_threadpool_execution/README.md +++ b/examples/parallelism/lazy_threadpool_execution/README.md @@ -1,3 +1,22 @@ + + # Lazy threadpool execution [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/dagworks-inc/hamilton/blob/main/examples/parallelism/lazy_threadpool_execution/notebook.ipynb) diff --git a/examples/parallelism/lazy_threadpool_execution/my_functions.py b/examples/parallelism/lazy_threadpool_execution/my_functions.py index 59e9b9762..e8119072e 100644 --- a/examples/parallelism/lazy_threadpool_execution/my_functions.py +++ b/examples/parallelism/lazy_threadpool_execution/my_functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import time diff --git a/examples/parallelism/lazy_threadpool_execution/my_functions_async.py b/examples/parallelism/lazy_threadpool_execution/my_functions_async.py index a639ed963..8372b9838 100644 --- a/examples/parallelism/lazy_threadpool_execution/my_functions_async.py +++ b/examples/parallelism/lazy_threadpool_execution/my_functions_async.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import asyncio diff --git a/examples/parallelism/lazy_threadpool_execution/notebook.ipynb b/examples/parallelism/lazy_threadpool_execution/notebook.ipynb index a1253012c..a0e5f8f7c 100644 --- a/examples/parallelism/lazy_threadpool_execution/notebook.ipynb +++ b/examples/parallelism/lazy_threadpool_execution/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/parallelism/lazy_threadpool_execution/run.py b/examples/parallelism/lazy_threadpool_execution/run.py index 734842c39..3761be20c 100644 --- a/examples/parallelism/lazy_threadpool_execution/run.py +++ b/examples/parallelism/lazy_threadpool_execution/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import time import my_functions diff --git a/examples/parallelism/star_counting/README.md b/examples/parallelism/star_counting/README.md index f307238b6..496cdf904 100644 --- a/examples/parallelism/star_counting/README.md +++ b/examples/parallelism/star_counting/README.md @@ -1,3 +1,22 @@ + + # Star counting with Apache Hamilton/Parallelism This example goes along with the "Counting Stars with Apache Hamilton" blog post. diff --git a/examples/parallelism/star_counting/functions.py b/examples/parallelism/star_counting/functions.py index 5d5c74272..4118a6f1b 100644 --- a/examples/parallelism/star_counting/functions.py +++ b/examples/parallelism/star_counting/functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from datetime import datetime from typing import Dict, List, Tuple diff --git a/examples/parallelism/star_counting/notebook.ipynb b/examples/parallelism/star_counting/notebook.ipynb index 65f1a07ae..a7f798ec7 100644 --- a/examples/parallelism/star_counting/notebook.ipynb +++ b/examples/parallelism/star_counting/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/parallelism/star_counting/run.py b/examples/parallelism/star_counting/run.py index 7dd5f3844..8b6cc3b12 100644 --- a/examples/parallelism/star_counting/run.py +++ b/examples/parallelism/star_counting/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging from typing import Tuple diff --git a/examples/people_data_labs/README.md b/examples/people_data_labs/README.md index 02896ed4a..e2539b3c9 100644 --- a/examples/people_data_labs/README.md +++ b/examples/people_data_labs/README.md @@ -1,3 +1,22 @@ + + # People Data Labs [People Data Labs](https://www.peopledatalabs.com/) is a data provider that offers several data APIs for person enrichment & search, company enrichment & search, and IP enrichment. diff --git a/examples/people_data_labs/analysis.py b/examples/people_data_labs/analysis.py index ef527d643..57310a0ea 100644 --- a/examples/people_data_labs/analysis.py +++ b/examples/people_data_labs/analysis.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from pathlib import Path import pandas as pd diff --git a/examples/people_data_labs/download_data.py b/examples/people_data_labs/download_data.py index 5e4008a59..05d186e63 100644 --- a/examples/people_data_labs/download_data.py +++ b/examples/people_data_labs/download_data.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import boto3 diff --git a/examples/people_data_labs/notebook.ipynb b/examples/people_data_labs/notebook.ipynb index 113d10ba0..20f75f83c 100644 --- a/examples/people_data_labs/notebook.ipynb +++ b/examples/people_data_labs/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/people_data_labs/run.py b/examples/people_data_labs/run.py index 8edae24fd..77925abb9 100644 --- a/examples/people_data_labs/run.py +++ b/examples/people_data_labs/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import analysis from hamilton import driver diff --git a/examples/plotly/README.md b/examples/plotly/README.md index 941db33ef..5efc3c929 100644 --- a/examples/plotly/README.md +++ b/examples/plotly/README.md @@ -1,3 +1,22 @@ + + # Plotly materializer extension By importing `hamilton.plugins.plotly_extensions`, you can register two additional materializers for Plotly figures. The `to.plotly()` creates static image files ([docs](https://plotly.com/python/static-image-export/)) and the `to.html()` outputs interactive HTML files ([docs](https://plotly.com/python/interactive-html-export/)). diff --git a/examples/plotly/model_training.py b/examples/plotly/model_training.py index 5d148c9df..29448f1e2 100644 --- a/examples/plotly/model_training.py +++ b/examples/plotly/model_training.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Dict import numpy as np diff --git a/examples/plotly/notebook.ipynb b/examples/plotly/notebook.ipynb index 8d833727f..62d16abdd 100644 --- a/examples/plotly/notebook.ipynb +++ b/examples/plotly/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/polars/README.md b/examples/polars/README.md index 45c9aaabc..8ae20344d 100644 --- a/examples/polars/README.md +++ b/examples/polars/README.md @@ -1,3 +1,22 @@ + + # Classic Apache Hamilton Hello World In this example we show you how to create a simple hello world dataflow that diff --git a/examples/polars/lazyframe/README.md b/examples/polars/lazyframe/README.md index 23dbe5fa3..211d6f111 100644 --- a/examples/polars/lazyframe/README.md +++ b/examples/polars/lazyframe/README.md @@ -1,3 +1,22 @@ + + # Classic Apache Hamilton Hello World In this example we show you how to create a simple hello world dataflow that diff --git a/examples/polars/lazyframe/my_functions.py b/examples/polars/lazyframe/my_functions.py index cc1d6ef62..92e0153f0 100644 --- a/examples/polars/lazyframe/my_functions.py +++ b/examples/polars/lazyframe/my_functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import polars as pl from hamilton.function_modifiers import load_from, value diff --git a/examples/polars/lazyframe/my_script.py b/examples/polars/lazyframe/my_script.py index 0e0fe4ad9..3c51cdbc2 100644 --- a/examples/polars/lazyframe/my_script.py +++ b/examples/polars/lazyframe/my_script.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging import sys diff --git a/examples/polars/materialization/README.md b/examples/polars/materialization/README.md index fc3b8407b..a2f2b882f 100644 --- a/examples/polars/materialization/README.md +++ b/examples/polars/materialization/README.md @@ -1,3 +1,22 @@ + + # Polars materializer examples Specifically this example shows how one can "materialize" diff --git a/examples/polars/materialization/my_functions.py b/examples/polars/materialization/my_functions.py index 7b627b666..332c5a471 100644 --- a/examples/polars/materialization/my_functions.py +++ b/examples/polars/materialization/my_functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import polars as pl """ diff --git a/examples/polars/materialization/my_script.py b/examples/polars/materialization/my_script.py index b532ebf26..01593dd7c 100644 --- a/examples/polars/materialization/my_script.py +++ b/examples/polars/materialization/my_script.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging import sys diff --git a/examples/polars/materialization/notebook.ipynb b/examples/polars/materialization/notebook.ipynb index cec55598e..1b3fe0924 100644 --- a/examples/polars/materialization/notebook.ipynb +++ b/examples/polars/materialization/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/polars/my_functions.py b/examples/polars/my_functions.py index 89a6d60c6..caae9162a 100644 --- a/examples/polars/my_functions.py +++ b/examples/polars/my_functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import polars as pl from hamilton.function_modifiers import extract_columns diff --git a/examples/polars/my_script.py b/examples/polars/my_script.py index 112078b60..aa206b4d9 100644 --- a/examples/polars/my_script.py +++ b/examples/polars/my_script.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import logging import sys diff --git a/examples/polars/notebook.ipynb b/examples/polars/notebook.ipynb index b36ec9e99..31645e9c6 100644 --- a/examples/polars/notebook.ipynb +++ b/examples/polars/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/polars/with_columns/README b/examples/polars/with_columns/README index 385ef5fb7..c36330ca6 100644 --- a/examples/polars/with_columns/README +++ b/examples/polars/with_columns/README @@ -1,3 +1,22 @@ + + # Using with_columns with Polars We show the ability to use the familiar `with_columns` from `polars`. Supported for both: `pl.DataFrame` and `pl.LazyFrame`. diff --git a/examples/polars/with_columns/my_functions.py b/examples/polars/with_columns/my_functions.py index 3b2c401b9..ba20558a1 100644 --- a/examples/polars/with_columns/my_functions.py +++ b/examples/polars/with_columns/my_functions.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import polars as pl from hamilton.function_modifiers import config diff --git a/examples/polars/with_columns/my_functions_lazy.py b/examples/polars/with_columns/my_functions_lazy.py index 4b65b2ac2..f4bba063c 100644 --- a/examples/polars/with_columns/my_functions_lazy.py +++ b/examples/polars/with_columns/my_functions_lazy.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import polars as pl from hamilton.function_modifiers import config diff --git a/examples/polars/with_columns/notebook.ipynb b/examples/polars/with_columns/notebook.ipynb index 75174e6de..d827aa31d 100644 --- a/examples/polars/with_columns/notebook.ipynb +++ b/examples/polars/with_columns/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/prefect/README.md b/examples/prefect/README.md index 5deb9f74c..b2f84d988 100644 --- a/examples/prefect/README.md +++ b/examples/prefect/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton + Prefect In this example, were going to show how to run a simple `data preprocessing -> model training -> model evaluation` workflow using Apache Hamilton within Prefect tasks. diff --git a/examples/prefect/evaluate_model.py b/examples/prefect/evaluate_model.py index 6664d82a4..ed148b51d 100644 --- a/examples/prefect/evaluate_model.py +++ b/examples/prefect/evaluate_model.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np import scipy.stats as stats from sklearn.metrics import get_scorer diff --git a/examples/prefect/hamilton_prefect_notebook.ipynb b/examples/prefect/hamilton_prefect_notebook.ipynb index d746927c1..da7a294bc 100644 --- a/examples/prefect/hamilton_prefect_notebook.ipynb +++ b/examples/prefect/hamilton_prefect_notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/prefect/prepare_data.py b/examples/prefect/prepare_data.py index f1646e4f0..d4dd2c0a4 100644 --- a/examples/prefect/prepare_data.py +++ b/examples/prefect/prepare_data.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import List import numpy as np diff --git a/examples/prefect/run.py b/examples/prefect/run.py index b1a98ab5e..e6f1e907c 100644 --- a/examples/prefect/run.py +++ b/examples/prefect/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import evaluate_model import pandas as pd diff --git a/examples/prefect/train_model.py b/examples/prefect/train_model.py index 5d0fa22de..60a243164 100644 --- a/examples/prefect/train_model.py +++ b/examples/prefect/train_model.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Dict, List import numpy as np diff --git a/examples/ray/README.md b/examples/ray/README.md index c043eedb9..71bc3d9a7 100644 --- a/examples/ray/README.md +++ b/examples/ray/README.md @@ -1,3 +1,22 @@ + + # Scaling Apache Hamilton on Ray [Ray](https://ray.io) is a general purpose framework that allows for parallel diff --git a/examples/ray/hello_world/README.md b/examples/ray/hello_world/README.md index e40c3262c..0539cf496 100644 --- a/examples/ray/hello_world/README.md +++ b/examples/ray/hello_world/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton on Ray Here we have a hello world example showing how you can diff --git a/examples/ray/hello_world/data_loaders.py b/examples/ray/hello_world/data_loaders.py index 5d1b42b60..6af0467a4 100644 --- a/examples/ray/hello_world/data_loaders.py +++ b/examples/ray/hello_world/data_loaders.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd diff --git a/examples/ray/hello_world/notebook.ipynb b/examples/ray/hello_world/notebook.ipynb index 01a4fcb50..72221c516 100644 --- a/examples/ray/hello_world/notebook.ipynb +++ b/examples/ray/hello_world/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/ray/hello_world/run.py b/examples/ray/hello_world/run.py index bc82b7cc1..17cbd9305 100644 --- a/examples/ray/hello_world/run.py +++ b/examples/ray/hello_world/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import importlib import ray diff --git a/examples/ray/ray_Hamilton_UI_tracking/README b/examples/ray/ray_Hamilton_UI_tracking/README index 94cd6f8fc..8a249e683 100644 --- a/examples/ray/ray_Hamilton_UI_tracking/README +++ b/examples/ray/ray_Hamilton_UI_tracking/README @@ -1,3 +1,22 @@ + + # Tracking telemetry in Hamilton UI for Ray clusters We show the ability to combine the [RayGraphAdapter](https://hamilton.apache.org/reference/graph-adapters/RayGraphAdapter/) and [HamiltonTracker](https://hamilton.apache.org/concepts/ui/) to run a dummy DAG. diff --git a/examples/ray/ray_Hamilton_UI_tracking/hamilton_notebook.ipynb b/examples/ray/ray_Hamilton_UI_tracking/hamilton_notebook.ipynb index b061ff3c6..dcb1cab6b 100644 --- a/examples/ray/ray_Hamilton_UI_tracking/hamilton_notebook.ipynb +++ b/examples/ray/ray_Hamilton_UI_tracking/hamilton_notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, @@ -29,8 +36,8 @@ "from hamilton_sdk.adapters import HamiltonTracker\n", "\n", "# Inputs required to track into correct project in the UI\n", - "project_id = 2\n", - "username = \"admin\"\n", + "project_id = 1\n", + "username = \"elijah\"\n", "\n", "tracker_ray = HamiltonTracker(\n", " project_id=project_id,\n", diff --git a/examples/ray/ray_Hamilton_UI_tracking/ray_lineage.py b/examples/ray/ray_Hamilton_UI_tracking/ray_lineage.py index d9d20c2ca..003bee0c2 100644 --- a/examples/ray/ray_Hamilton_UI_tracking/ray_lineage.py +++ b/examples/ray/ray_Hamilton_UI_tracking/ray_lineage.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import time diff --git a/examples/ray/ray_Hamilton_UI_tracking/run_lineage.py b/examples/ray/ray_Hamilton_UI_tracking/run_lineage.py index 6d135efd1..264f9f344 100644 --- a/examples/ray/ray_Hamilton_UI_tracking/run_lineage.py +++ b/examples/ray/ray_Hamilton_UI_tracking/run_lineage.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import click import ray_lineage @@ -7,7 +24,7 @@ @click.command() -@click.option("--username", required=True, type=str) +@click.option("--username", default="elijah", required=True, type=str) @click.option("--project_id", default=1, type=int) def run(project_id, username): try: diff --git a/examples/reusing_functions/README.md b/examples/reusing_functions/README.md index 360b711c0..cecbb7624 100644 --- a/examples/reusing_functions/README.md +++ b/examples/reusing_functions/README.md @@ -1,3 +1,22 @@ + + # subdag operator This README demonstrates the use of the subdag operator. diff --git a/examples/reusing_functions/main.py b/examples/reusing_functions/main.py index 6eae4d76b..d74a252d5 100644 --- a/examples/reusing_functions/main.py +++ b/examples/reusing_functions/main.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Any, Dict import pandas as pd diff --git a/examples/reusing_functions/reusable_subdags.py b/examples/reusing_functions/reusable_subdags.py index f50773b57..2dac40971 100644 --- a/examples/reusing_functions/reusable_subdags.py +++ b/examples/reusing_functions/reusable_subdags.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd import unique_users diff --git a/examples/reusing_functions/reusing_functions.ipynb b/examples/reusing_functions/reusing_functions.ipynb index 24c05424d..7d8b8a69f 100644 --- a/examples/reusing_functions/reusing_functions.ipynb +++ b/examples/reusing_functions/reusing_functions.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/reusing_functions/unique_users.py b/examples/reusing_functions/unique_users.py index fe1a05be7..7d5e3c4a5 100644 --- a/examples/reusing_functions/unique_users.py +++ b/examples/reusing_functions/unique_users.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd _grain_mapping = {"day": "D", "week": "W", "month": "M"} diff --git a/examples/reverse_etl/README.md b/examples/reverse_etl/README.md index 48d44c2fa..ab03c98e6 100644 --- a/examples/reverse_etl/README.md +++ b/examples/reverse_etl/README.md @@ -1,3 +1,22 @@ + + # Reverse ETL for your timesheets This example shows how to create a timesheet from time tracking data generated by the command line tool [Timewarrior](https://timewarrior.net/) and upload it to Google Sheets. diff --git a/examples/reverse_etl/notebook.ipynb b/examples/reverse_etl/notebook.ipynb index e5c48810b..fe2d89a5b 100644 --- a/examples/reverse_etl/notebook.ipynb +++ b/examples/reverse_etl/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/reverse_etl/upload_timesheet.py b/examples/reverse_etl/upload_timesheet.py index 42c3c55b8..340d347c5 100644 --- a/examples/reverse_etl/upload_timesheet.py +++ b/examples/reverse_etl/upload_timesheet.py @@ -1,4 +1,21 @@ #!/usr/bin/env python3 +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import json import pathlib import sys diff --git a/examples/schema/README.md b/examples/schema/README.md index f3303e8cc..0762de1b7 100644 --- a/examples/schema/README.md +++ b/examples/schema/README.md @@ -1,3 +1,22 @@ + + # Schema tracking and validation This examples showcases the `SchemaValidator()` adapter. At runtime, it will collect the schema of DataFrame-like objects and stored them as `pyarrow.Schema` objects. On subsequent runs, it will check if the schema of a noed output matches the stored reference schema. diff --git a/examples/schema/dataflow.py b/examples/schema/dataflow.py index 9eb28d01b..8329eeb31 100644 --- a/examples/schema/dataflow.py +++ b/examples/schema/dataflow.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd diff --git a/examples/schema/multi_dataflow.py b/examples/schema/multi_dataflow.py index 62da6efb7..cc307191a 100644 --- a/examples/schema/multi_dataflow.py +++ b/examples/schema/multi_dataflow.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import duckdb import ibis import ibis.expr.types as ir diff --git a/examples/scikit-learn/species_distribution_modeling/README.md b/examples/scikit-learn/species_distribution_modeling/README.md index 62be47b81..c7e68e6f3 100644 --- a/examples/scikit-learn/species_distribution_modeling/README.md +++ b/examples/scikit-learn/species_distribution_modeling/README.md @@ -1,3 +1,22 @@ + + # Species distribution modeling We translate the Species distribution modeling from scikit-learn into Apache Hamilton to showcase `pipe` and`pipe_output`. diff --git a/examples/scikit-learn/species_distribution_modeling/grids.py b/examples/scikit-learn/species_distribution_modeling/grids.py index cad14858b..6c1ebe013 100644 --- a/examples/scikit-learn/species_distribution_modeling/grids.py +++ b/examples/scikit-learn/species_distribution_modeling/grids.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Tuple import numpy as np diff --git a/examples/scikit-learn/species_distribution_modeling/hamilton_notebook.ipynb b/examples/scikit-learn/species_distribution_modeling/hamilton_notebook.ipynb index 8a2d37f33..1e6656a9f 100644 --- a/examples/scikit-learn/species_distribution_modeling/hamilton_notebook.ipynb +++ b/examples/scikit-learn/species_distribution_modeling/hamilton_notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/scikit-learn/species_distribution_modeling/load_data.py b/examples/scikit-learn/species_distribution_modeling/load_data.py index 4e142cfd2..00da84035 100644 --- a/examples/scikit-learn/species_distribution_modeling/load_data.py +++ b/examples/scikit-learn/species_distribution_modeling/load_data.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from sklearn.datasets import fetch_species_distributions from sklearn.utils._bunch import Bunch diff --git a/examples/scikit-learn/species_distribution_modeling/original_script.py b/examples/scikit-learn/species_distribution_modeling/original_script.py index 9fb62b740..5e8d0662f 100644 --- a/examples/scikit-learn/species_distribution_modeling/original_script.py +++ b/examples/scikit-learn/species_distribution_modeling/original_script.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + # Authors: Peter Prettenhofer # Jake Vanderplas # diff --git a/examples/scikit-learn/species_distribution_modeling/postprocessing_results.py b/examples/scikit-learn/species_distribution_modeling/postprocessing_results.py index 4fab10686..a4fce770c 100644 --- a/examples/scikit-learn/species_distribution_modeling/postprocessing_results.py +++ b/examples/scikit-learn/species_distribution_modeling/postprocessing_results.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Any, Dict, Tuple import numpy as np diff --git a/examples/scikit-learn/species_distribution_modeling/preprocessing.py b/examples/scikit-learn/species_distribution_modeling/preprocessing.py index 5302364d0..083e8b27a 100644 --- a/examples/scikit-learn/species_distribution_modeling/preprocessing.py +++ b/examples/scikit-learn/species_distribution_modeling/preprocessing.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Dict, Tuple import numpy as np diff --git a/examples/scikit-learn/species_distribution_modeling/run.py b/examples/scikit-learn/species_distribution_modeling/run.py index 6cd737372..bc8f5a53e 100644 --- a/examples/scikit-learn/species_distribution_modeling/run.py +++ b/examples/scikit-learn/species_distribution_modeling/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import matplotlib.pyplot as plt diff --git a/examples/scikit-learn/species_distribution_modeling/train_and_predict.py b/examples/scikit-learn/species_distribution_modeling/train_and_predict.py index cda35a2bf..ea3a78c21 100644 --- a/examples/scikit-learn/species_distribution_modeling/train_and_predict.py +++ b/examples/scikit-learn/species_distribution_modeling/train_and_predict.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np import numpy.typing as npt from sklearn import svm diff --git a/examples/scikit-learn/species_distribution_modeling/train_and_predict_using_mutate.py b/examples/scikit-learn/species_distribution_modeling/train_and_predict_using_mutate.py index 8e823c025..d9dd06f8a 100644 --- a/examples/scikit-learn/species_distribution_modeling/train_and_predict_using_mutate.py +++ b/examples/scikit-learn/species_distribution_modeling/train_and_predict_using_mutate.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import numpy as np import numpy.typing as npt from sklearn import svm diff --git a/examples/scikit-learn/transformer/README.md b/examples/scikit-learn/transformer/README.md index 1fe1eb696..1483af5ce 100644 --- a/examples/scikit-learn/transformer/README.md +++ b/examples/scikit-learn/transformer/README.md @@ -1,3 +1,22 @@ + + # Classic Apache Hamilton Hello World In this example we show you a custom scikit-learn `Transformer` class. This class should be compliant with [scikit-learn transformers specifications](https://scikit-learn.org/stable/developers/develop.html). This class is meant to be used as part of broader scikit-learn pipelines. Scikit-learn estimators and pipelines allow for stateful objects, which are helpful when applying transformations on train-test splits notably. Also, all pipeline, estimator, and transformer objects should be picklable, enabling reproducible pipelines. diff --git a/examples/scikit-learn/transformer/hamilton_notebook.ipynb b/examples/scikit-learn/transformer/hamilton_notebook.ipynb index 29922e904..76036e0e7 100644 --- a/examples/scikit-learn/transformer/hamilton_notebook.ipynb +++ b/examples/scikit-learn/transformer/hamilton_notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/scikit-learn/transformer/my_functions_a.py b/examples/scikit-learn/transformer/my_functions_a.py index 3da0e8333..3937c657a 100644 --- a/examples/scikit-learn/transformer/my_functions_a.py +++ b/examples/scikit-learn/transformer/my_functions_a.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd diff --git a/examples/scikit-learn/transformer/my_functions_b.py b/examples/scikit-learn/transformer/my_functions_b.py index 1fde4288d..4babc9429 100644 --- a/examples/scikit-learn/transformer/my_functions_b.py +++ b/examples/scikit-learn/transformer/my_functions_b.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd diff --git a/examples/scikit-learn/transformer/run.py b/examples/scikit-learn/transformer/run.py index 2df045a5b..ed131037e 100644 --- a/examples/scikit-learn/transformer/run.py +++ b/examples/scikit-learn/transformer/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from __future__ import annotations import importlib diff --git a/examples/slack/README.md b/examples/slack/README.md index f6e9b3ead..8e1880e19 100644 --- a/examples/slack/README.md +++ b/examples/slack/README.md @@ -1,3 +1,22 @@ + + # Slack notifier example This example demonstrates how to use the Slack notifier. diff --git a/examples/slack/notebook.ipynb b/examples/slack/notebook.ipynb index ff4d26199..edf26e766 100644 --- a/examples/slack/notebook.ipynb +++ b/examples/slack/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/slack/slack_notification_example.py b/examples/slack/slack_notification_example.py index 29a1c3005..d34884d5f 100644 --- a/examples/slack/slack_notification_example.py +++ b/examples/slack/slack_notification_example.py @@ -1,23 +1,40 @@ -import pandas as pd - -from hamilton import driver -from hamilton.plugins.h_slack import SlackNotifier - - -def test_function() -> pd.DataFrame: - raise Exception("test exception") - return pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]}) - - -if __name__ == "__main__": - import __main__ - - api_key = "YOUR_API_KEY" - channel = "YOUR_CHANNEL" - dr = ( - driver.Builder() - .with_modules(__main__) - .with_adapters(SlackNotifier(api_key=api_key, channel=channel)) - .build() - ) - print(dr.execute(["test_function"])) +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import pandas as pd + +from hamilton import driver +from hamilton.plugins.h_slack import SlackNotifier + + +def test_function() -> pd.DataFrame: + raise Exception("test exception") + return pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]}) + + +if __name__ == "__main__": + import __main__ + + api_key = "YOUR_API_KEY" + channel = "YOUR_CHANNEL" + dr = ( + driver.Builder() + .with_modules(__main__) + .with_adapters(SlackNotifier(api_key=api_key, channel=channel)) + .build() + ) + print(dr.execute(["test_function"])) diff --git a/examples/snowflake/hamilton_ui/Dockerfile b/examples/snowflake/hamilton_ui/Dockerfile index 0433ae7a8..a71115660 100644 --- a/examples/snowflake/hamilton_ui/Dockerfile +++ b/examples/snowflake/hamilton_ui/Dockerfile @@ -1,14 +1,31 @@ -FROM python:3.13.1-slim - -RUN apt update -RUN apt upgrade sqlite3 -y -RUN pip install "sf-hamilton[ui,sdk]" -RUN pip install flask - -ENV HAMILTON_ALLOWED_HOSTS=".snowflakecomputing.app" -ENV SERVER_PORT=8001 - -COPY pipeline_endpoint.py /pipeline_endpoint.py -COPY my_functions.py /my_functions.py - -ENTRYPOINT /bin/bash -c "(hamilton ui --base-dir /hamilton-basedir &) && python /pipeline_endpoint.py" +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +FROM python:3.13.1-slim + +RUN apt update +RUN apt upgrade sqlite3 -y +RUN pip install "sf-hamilton[ui,sdk]" +RUN pip install flask + +ENV HAMILTON_ALLOWED_HOSTS=".snowflakecomputing.app" +ENV SERVER_PORT=8001 + +COPY pipeline_endpoint.py /pipeline_endpoint.py +COPY my_functions.py /my_functions.py + +ENTRYPOINT /bin/bash -c "(hamilton ui --base-dir /hamilton-basedir &) && python /pipeline_endpoint.py" diff --git a/examples/snowflake/hamilton_ui/README.md b/examples/snowflake/hamilton_ui/README.md index 05d58a9f5..b810b14f7 100644 --- a/examples/snowflake/hamilton_ui/README.md +++ b/examples/snowflake/hamilton_ui/README.md @@ -1,3 +1,22 @@ + + # Running the Apache Hamilton & the Apache Hamilton UI in Snowflake This example is code for the ["Observability of Python code and application logic with Apache Hamilton UI on Snowflake Container Services" post](https://medium.com/@pkantyka/observability-of-python-code-and-application-logic-with-hamilton-ui-on-snowflake-container-services-a26693b46635) by diff --git a/examples/snowflake/hamilton_ui/my_functions.py b/examples/snowflake/hamilton_ui/my_functions.py index 387d0b9fc..4babc9429 100644 --- a/examples/snowflake/hamilton_ui/my_functions.py +++ b/examples/snowflake/hamilton_ui/my_functions.py @@ -1,21 +1,38 @@ -import pandas as pd - - -def spend_mean(spend: pd.Series) -> float: - """Shows function creating a scalar. In this case it computes the mean of the entire column.""" - return spend.mean() - - -def spend_zero_mean(spend: pd.Series, spend_mean: float) -> pd.Series: - """Shows function that takes a scalar. In this case to zero mean spend.""" - return spend - spend_mean - - -def spend_std_dev(spend: pd.Series) -> float: - """Function that computes the standard deviation of the spend column.""" - return spend.std() - - -def spend_zero_mean_unit_variance(spend_zero_mean: pd.Series, spend_std_dev: float) -> pd.Series: - """Function showing one way to make spend have zero mean and unit variance.""" - return spend_zero_mean / spend_std_dev +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import pandas as pd + + +def spend_mean(spend: pd.Series) -> float: + """Shows function creating a scalar. In this case it computes the mean of the entire column.""" + return spend.mean() + + +def spend_zero_mean(spend: pd.Series, spend_mean: float) -> pd.Series: + """Shows function that takes a scalar. In this case to zero mean spend.""" + return spend - spend_mean + + +def spend_std_dev(spend: pd.Series) -> float: + """Function that computes the standard deviation of the spend column.""" + return spend.std() + + +def spend_zero_mean_unit_variance(spend_zero_mean: pd.Series, spend_std_dev: float) -> pd.Series: + """Function showing one way to make spend have zero mean and unit variance.""" + return spend_zero_mean / spend_std_dev diff --git a/examples/snowflake/hamilton_ui/pipeline_endpoint.py b/examples/snowflake/hamilton_ui/pipeline_endpoint.py index 217077f0b..9acaeff97 100644 --- a/examples/snowflake/hamilton_ui/pipeline_endpoint.py +++ b/examples/snowflake/hamilton_ui/pipeline_endpoint.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """ This module: - Defines a flask app that listens for POST requests on /echo diff --git a/examples/snowflake/hamilton_ui/snowflake.sql b/examples/snowflake/hamilton_ui/snowflake.sql index ba1afc159..3520c8d3f 100644 --- a/examples/snowflake/hamilton_ui/snowflake.sql +++ b/examples/snowflake/hamilton_ui/snowflake.sql @@ -1,103 +1,120 @@ --- For more details visit: --- https://medium.com/@pkantyka/observability-of-python-code-and-application-logic-with-hamilton-ui-on-snowflake-container-services-a26693b46635 - -CREATE OR REPLACE IMAGE REPOSITORY images; --- then docker build -t /snowflake-hamilton-ui . --- docker login -u --- docker push /snowflake-hamilton-ui -SHOW IMAGES IN IMAGE REPOSITORY ; - -CREATE STAGE hamilton_base ENCRYPTION = (type = 'SNOWFLAKE_SSE'); - - -CREATE SERVICE public.hamilton_ui -IN COMPUTE POOL TEST_POOL -FROM SPECIFICATION $$ -spec: - containers: - - name: hamiltonui - image: ////snowflake-hamilton-ui - volumeMounts: - - name: hamilton-basedir - mountPath: /hamilton-basedir - endpoints: - - name: entrypoint - port: 8001 - - name: hamilton - port: 8241 - public: true - volumes: - - name: hamilton-basedir - source: "@..hamilton_base" - $$ -QUERY_WAREHOUSE = -; - -CALL SYSTEM$GET_SERVICE_STATUS('..hamilton_ui'); - -CALL SYSTEM$GET_SERVICE_LOGS('..hamilton_ui', '0', 'hammiltonui', 1000); - -SHOW ENDPOINTS IN SERVICE public.hamilton_ui; - -CREATE OR REPLACE FUNCTION public.hamilton_pipeline (prj_id number, signups variant, spend variant, output_columns variant) - RETURNS VARIANT - SERVICE=public.hamilton_ui - ENDPOINT=entrypoint - AS '/echo'; - - -SELECT - public.hamilton_pipeline ( - 1, - [1, 10, 50, 100, 200, 400], - [10, 10, 20, 40, 40, 50], - [ 'spend', 'signups', 'spend_std_dev', 'spend_zero_mean_unit_variance' ] - ) as data; - -WITH input_data AS ( - SELECT - public.hamilton_pipeline ( - 1, - [1, 10, 50, 100, 200, 400], - [10, 10, 20, 40, 40, 50], - [ 'spend', 'signups', 'spend_std_dev', 'spend_zero_mean_unit_variance' ] - ) as data -), -flattened AS ( - SELECT - key AS metric_key, - value AS metric_value - FROM - input_data - left join LATERAL FLATTEN(input_data.data) -) -SELECT - * -FROM - flattened f; - -WITH input_data AS ( - SELECT - public.hamilton_pipeline ( - 1, - [1, 10, 50, 100, 200, 400], - [10, 10, 20, 40, 40, 50], - [ 'spend', 'signups', 'spend_std_dev', 'spend_zero_mean_unit_variance' ] - ) as data -), -flattened AS ( - SELECT - key AS metric_key, - value AS metric_value - FROM - input_data - left join LATERAL FLATTEN(input_data.data) -) -SELECT - f2.key, - f2.value -FROM - flattened f - left join lateral flatten(metric_value) f2 -where - metric_key = 'spend_zero_mean_unit_variance'; +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. + +-- For more details visit: +-- https://medium.com/@pkantyka/observability-of-python-code-and-application-logic-with-hamilton-ui-on-snowflake-container-services-a26693b46635 + +CREATE OR REPLACE IMAGE REPOSITORY images; +-- then docker build -t /snowflake-hamilton-ui . +-- docker login -u +-- docker push /snowflake-hamilton-ui +SHOW IMAGES IN IMAGE REPOSITORY ; + +CREATE STAGE hamilton_base ENCRYPTION = (type = 'SNOWFLAKE_SSE'); + + +CREATE SERVICE public.hamilton_ui +IN COMPUTE POOL TEST_POOL +FROM SPECIFICATION $$ +spec: + containers: + - name: hamiltonui + image: ////snowflake-hamilton-ui + volumeMounts: + - name: hamilton-basedir + mountPath: /hamilton-basedir + endpoints: + - name: entrypoint + port: 8001 + - name: hamilton + port: 8241 + public: true + volumes: + - name: hamilton-basedir + source: "@..hamilton_base" + $$ +QUERY_WAREHOUSE = +; + +CALL SYSTEM$GET_SERVICE_STATUS('..hamilton_ui'); + +CALL SYSTEM$GET_SERVICE_LOGS('..hamilton_ui', '0', 'hammiltonui', 1000); + +SHOW ENDPOINTS IN SERVICE public.hamilton_ui; + +CREATE OR REPLACE FUNCTION public.hamilton_pipeline (prj_id number, signups variant, spend variant, output_columns variant) + RETURNS VARIANT + SERVICE=public.hamilton_ui + ENDPOINT=entrypoint + AS '/echo'; + + +SELECT + public.hamilton_pipeline ( + 1, + [1, 10, 50, 100, 200, 400], + [10, 10, 20, 40, 40, 50], + [ 'spend', 'signups', 'spend_std_dev', 'spend_zero_mean_unit_variance' ] + ) as data; + +WITH input_data AS ( + SELECT + public.hamilton_pipeline ( + 1, + [1, 10, 50, 100, 200, 400], + [10, 10, 20, 40, 40, 50], + [ 'spend', 'signups', 'spend_std_dev', 'spend_zero_mean_unit_variance' ] + ) as data +), +flattened AS ( + SELECT + key AS metric_key, + value AS metric_value + FROM + input_data + left join LATERAL FLATTEN(input_data.data) +) +SELECT + * +FROM + flattened f; + +WITH input_data AS ( + SELECT + public.hamilton_pipeline ( + 1, + [1, 10, 50, 100, 200, 400], + [10, 10, 20, 40, 40, 50], + [ 'spend', 'signups', 'spend_std_dev', 'spend_zero_mean_unit_variance' ] + ) as data +), +flattened AS ( + SELECT + key AS metric_key, + value AS metric_value + FROM + input_data + left join LATERAL FLATTEN(input_data.data) +) +SELECT + f2.key, + f2.value +FROM + flattened f + left join lateral flatten(metric_value) f2 +where + metric_key = 'spend_zero_mean_unit_variance'; diff --git a/examples/spark/README.md b/examples/spark/README.md index d6eb61bc7..fe0067b63 100644 --- a/examples/spark/README.md +++ b/examples/spark/README.md @@ -1,3 +1,22 @@ + + # Scaling Apache Hamilton on Spark ## Pyspark diff --git a/examples/spark/pandas_on_spark/README.md b/examples/spark/pandas_on_spark/README.md index 3c93c5cdb..dd11e85f9 100644 --- a/examples/spark/pandas_on_spark/README.md +++ b/examples/spark/pandas_on_spark/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton on Koalas Spark 3.2+ Here we have a hello world example showing how you can diff --git a/examples/spark/pandas_on_spark/data_loaders.py b/examples/spark/pandas_on_spark/data_loaders.py index aa087248a..b189f39ee 100644 --- a/examples/spark/pandas_on_spark/data_loaders.py +++ b/examples/spark/pandas_on_spark/data_loaders.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd import pyspark.pandas as ps diff --git a/examples/spark/pandas_on_spark/run.py b/examples/spark/pandas_on_spark/run.py index 93f546313..429685711 100644 --- a/examples/spark/pandas_on_spark/run.py +++ b/examples/spark/pandas_on_spark/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import importlib import pyspark.pandas as ps diff --git a/examples/spark/pyspark/README.md b/examples/spark/pyspark/README.md index feb016639..a9bb3cfc3 100644 --- a/examples/spark/pyspark/README.md +++ b/examples/spark/pyspark/README.md @@ -1,3 +1,22 @@ + + # Apache Hamilton and Pyspark **TL;DR** Apache Hamilton now has a full pyspark integration. This enables you to build modular pyspark applications diff --git a/examples/spark/pyspark/dataflow.py b/examples/spark/pyspark/dataflow.py index 8f40f5937..f5bfed60e 100644 --- a/examples/spark/pyspark/dataflow.py +++ b/examples/spark/pyspark/dataflow.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Dict import map_transforms diff --git a/examples/spark/pyspark/map_transforms.py b/examples/spark/pyspark/map_transforms.py index 876268414..9c2553f38 100644 --- a/examples/spark/pyspark/map_transforms.py +++ b/examples/spark/pyspark/map_transforms.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton.htypes import column diff --git a/examples/spark/pyspark/notebook.ipynb b/examples/spark/pyspark/notebook.ipynb index 2b2264a9d..ee79c008c 100644 --- a/examples/spark/pyspark/notebook.ipynb +++ b/examples/spark/pyspark/notebook.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/spark/pyspark/run.py b/examples/spark/pyspark/run.py index 227f8a5a0..326a6aa90 100644 --- a/examples/spark/pyspark/run.py +++ b/examples/spark/pyspark/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import dataflow import map_transforms diff --git a/examples/spark/pyspark_feature_catalog/column_features.py b/examples/spark/pyspark_feature_catalog/column_features.py index 3917869ba..faef3835a 100644 --- a/examples/spark/pyspark_feature_catalog/column_features.py +++ b/examples/spark/pyspark_feature_catalog/column_features.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton import htypes diff --git a/examples/spark/pyspark_feature_catalog/example_usage.ipynb b/examples/spark/pyspark_feature_catalog/example_usage.ipynb index 8c1b72a4b..4ff38f04c 100644 --- a/examples/spark/pyspark_feature_catalog/example_usage.ipynb +++ b/examples/spark/pyspark_feature_catalog/example_usage.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/spark/pyspark_feature_catalog/features.py b/examples/spark/pyspark_feature_catalog/features.py index 670360239..92e45dcd4 100644 --- a/examples/spark/pyspark_feature_catalog/features.py +++ b/examples/spark/pyspark_feature_catalog/features.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pyspark.sql as ps from column_features import darkshore_flag, durotar_flag from pyspark.sql import functions as sf diff --git a/examples/spark/pyspark_udfs/README.md b/examples/spark/pyspark_udfs/README.md index c24e1fd16..a8d52b7ed 100644 --- a/examples/spark/pyspark_udfs/README.md +++ b/examples/spark/pyspark_udfs/README.md @@ -1,3 +1,22 @@ + + # Using Apache Hamilton to help manage your pyspark UDFs Here we have a version of the Apache Hamilton hello world example showing how you can take some Apache Hamilton functions and then diff --git a/examples/spark/pyspark_udfs/pandas_udfs.py b/examples/spark/pyspark_udfs/pandas_udfs.py index 2525cdd80..408a6e6d7 100644 --- a/examples/spark/pyspark_udfs/pandas_udfs.py +++ b/examples/spark/pyspark_udfs/pandas_udfs.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Pandas UDFs. Has to only contain map operations! Aggregations, filters, etc. are not supported. diff --git a/examples/spark/pyspark_udfs/run.py b/examples/spark/pyspark_udfs/run.py index 232a69896..14e7fe7e7 100644 --- a/examples/spark/pyspark_udfs/run.py +++ b/examples/spark/pyspark_udfs/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Spark driver and Hamilton driver code.""" import pandas as pd diff --git a/examples/spark/pyspark_udfs/vanilla_udfs.py b/examples/spark/pyspark_udfs/vanilla_udfs.py index 6b7c8d343..c5f822433 100644 --- a/examples/spark/pyspark_udfs/vanilla_udfs.py +++ b/examples/spark/pyspark_udfs/vanilla_udfs.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + """Pyspark UDFs Has to only contain map operations! diff --git a/examples/spark/tpc-h/README.md b/examples/spark/tpc-h/README.md index 18e348f2b..eb81edea3 100644 --- a/examples/spark/tpc-h/README.md +++ b/examples/spark/tpc-h/README.md @@ -1,3 +1,22 @@ + + # TPC-H We've represented a few TPC-h queries using pyspark + hamilton. diff --git a/examples/spark/tpc-h/csv_data_loaders.py b/examples/spark/tpc-h/csv_data_loaders.py index 3aca0f042..8cc328c03 100644 --- a/examples/spark/tpc-h/csv_data_loaders.py +++ b/examples/spark/tpc-h/csv_data_loaders.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import os import pyspark.sql as ps diff --git a/examples/spark/tpc-h/query_1.py b/examples/spark/tpc-h/query_1.py index 673a83fef..80a16d778 100644 --- a/examples/spark/tpc-h/query_1.py +++ b/examples/spark/tpc-h/query_1.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import datetime import pandas as pd diff --git a/examples/spark/tpc-h/query_12.py b/examples/spark/tpc-h/query_12.py index 4c5e2c42f..696ec1ffc 100644 --- a/examples/spark/tpc-h/query_12.py +++ b/examples/spark/tpc-h/query_12.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd import pyspark.sql as ps from pyspark.sql import functions as F diff --git a/examples/spark/tpc-h/query_8.py b/examples/spark/tpc-h/query_8.py index d6957d7b3..97ea6eb3b 100644 --- a/examples/spark/tpc-h/query_8.py +++ b/examples/spark/tpc-h/query_8.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd import pyspark.sql as ps import pyspark.sql.functions as F diff --git a/examples/spark/tpc-h/run.py b/examples/spark/tpc-h/run.py index 7cc7af6e0..10435b839 100644 --- a/examples/spark/tpc-h/run.py +++ b/examples/spark/tpc-h/run.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import click exec("from hamilton.plugins import h_spark") diff --git a/examples/spark/world_of_warcraft/README.md b/examples/spark/world_of_warcraft/README.md index ed8eab54a..84b8dc675 100644 --- a/examples/spark/world_of_warcraft/README.md +++ b/examples/spark/world_of_warcraft/README.md @@ -1,3 +1,22 @@ + + # Example Feature Pipeline for both Spark and Pandas This folder contains code to create features from World of Warcraft data. diff --git a/examples/spark/world_of_warcraft/world_of_warcraft__pandas.ipynb b/examples/spark/world_of_warcraft/world_of_warcraft__pandas.ipynb index 5e5e1ee67..8b8d5b3f8 100644 --- a/examples/spark/world_of_warcraft/world_of_warcraft__pandas.ipynb +++ b/examples/spark/world_of_warcraft/world_of_warcraft__pandas.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/spark/world_of_warcraft/world_of_warcraft__spark_v1.ipynb b/examples/spark/world_of_warcraft/world_of_warcraft__spark_v1.ipynb index 5ef0821cc..e39984f83 100644 --- a/examples/spark/world_of_warcraft/world_of_warcraft__spark_v1.ipynb +++ b/examples/spark/world_of_warcraft/world_of_warcraft__spark_v1.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/spark/world_of_warcraft/world_of_warcraft__spark_v2.ipynb b/examples/spark/world_of_warcraft/world_of_warcraft__spark_v2.ipynb index abc426320..86e064921 100644 --- a/examples/spark/world_of_warcraft/world_of_warcraft__spark_v2.ipynb +++ b/examples/spark/world_of_warcraft/world_of_warcraft__spark_v2.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Licensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/spark/world_of_warcraft/zone_features__common.py b/examples/spark/world_of_warcraft/zone_features__common.py index c09ddacc1..308c98aa1 100644 --- a/examples/spark/world_of_warcraft/zone_features__common.py +++ b/examples/spark/world_of_warcraft/zone_features__common.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton import htypes diff --git a/examples/spark/world_of_warcraft/zone_features__pandas.py b/examples/spark/world_of_warcraft/zone_features__pandas.py index c1d47eb54..8c0587137 100644 --- a/examples/spark/world_of_warcraft/zone_features__pandas.py +++ b/examples/spark/world_of_warcraft/zone_features__pandas.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd from hamilton.function_modifiers import extract_columns diff --git a/examples/spark/world_of_warcraft/zone_features__spark_v1.py b/examples/spark/world_of_warcraft/zone_features__spark_v1.py index 93ea23886..305e80f8d 100644 --- a/examples/spark/world_of_warcraft/zone_features__spark_v1.py +++ b/examples/spark/world_of_warcraft/zone_features__spark_v1.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pyspark.sql as ps from pyspark.sql import functions as sf diff --git a/examples/spark/world_of_warcraft/zone_features__spark_v2.py b/examples/spark/world_of_warcraft/zone_features__spark_v2.py index 0dd014ac2..d1b58dfa5 100644 --- a/examples/spark/world_of_warcraft/zone_features__spark_v2.py +++ b/examples/spark/world_of_warcraft/zone_features__spark_v2.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pyspark.sql as ps from pyspark.sql import functions as sf from zone_features__common import ( diff --git a/examples/streamlit/README.md b/examples/streamlit/README.md index bda7d070d..2120a323e 100644 --- a/examples/streamlit/README.md +++ b/examples/streamlit/README.md @@ -1,3 +1,22 @@ + + # Streamlit + Apache Hamilton > This example accompanies the documentation page for [Streamlit](https://hamilton.apache.org/integrations/streamlit/) integration. diff --git a/examples/streamlit/app.py b/examples/streamlit/app.py index bc9bef89a..e816722ef 100644 --- a/examples/streamlit/app.py +++ b/examples/streamlit/app.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + from typing import Optional import logic diff --git a/examples/streamlit/logic.py b/examples/streamlit/logic.py index 92a1a9738..ea69e3ba6 100644 --- a/examples/streamlit/logic.py +++ b/examples/streamlit/logic.py @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + import pandas as pd import plotly.express as px from plotly.graph_objs import Figure diff --git a/examples/styling_visualization/README.md b/examples/styling_visualization/README.md index a3b2ebf56..e018ec8b5 100644 --- a/examples/styling_visualization/README.md +++ b/examples/styling_visualization/README.md @@ -1,3 +1,22 @@ + + # Style your dataflow visualizations A core feature of Apache Hamilton is the ability to generate visualizations directly from your code. By default, each nodes is labelled with its name and type and is stylized (shape, color, outline, etc.). diff --git a/examples/styling_visualization/dag.png b/examples/styling_visualization/dag.png index ceda0c39ef560207a5e9a44dbebc86338c9806e4..3e710da299483476238879ba2e67a40a6c29f57a 100644 GIT binary patch literal 333312 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