diff --git a/examples/calculator_tools/__init__.py b/examples/calculator_tools/__init__.py new file mode 100644 index 00000000..71a9e94a --- /dev/null +++ b/examples/calculator_tools/__init__.py @@ -0,0 +1 @@ +# Init file for calculator_tools example module. diff --git a/examples/calculator_tools/calculator_tools.py b/examples/calculator_tools/calculator_tools.py new file mode 100644 index 00000000..87ec2692 --- /dev/null +++ b/examples/calculator_tools/calculator_tools.py @@ -0,0 +1,57 @@ +# Copyright (C) 2018 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Simple calculator example Fire CLI. + +This module demonstrates the use of Fire without specifying a target component. +All functions become CLI commands when Fire() is invoked in main(). + +Example usage: + calculator_tools add 2 3 + calculator_tools subtract 10 4 + calculator_tools multiply 5 6 + calculator_tools divide 20 5 +""" + +import fire + + +def add(a=0, b=0): + """Return the sum of a and b.""" + return a + b + + +def subtract(a=0, b=0): + """Return a - b.""" + return a - b + + +def multiply(a=0, b=0): + """Return a * b.""" + return a * b + + +def divide(a=0, b=1): + """Return a / b.""" + if b == 0: + raise ZeroDivisionError("Cannot divide by zero.") + return a / b + + +def main(): + fire.Fire(name='calculator_tools') + + +if __name__ == '__main__': + main() diff --git a/examples/calculator_tools/calculator_tools_test.py b/examples/calculator_tools/calculator_tools_test.py new file mode 100644 index 00000000..362e560c --- /dev/null +++ b/examples/calculator_tools/calculator_tools_test.py @@ -0,0 +1,42 @@ +# Copyright (C) 2018 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for the calculator_tools module.""" + +from fire import testutils +from examples.calculator_tools import calculator_tools + + +class CalculatorToolsTest(testutils.BaseTestCase): + + def testCalculatorTools(self): + # add + self.assertEqual(calculator_tools.add(2, 3), 5) + + # subtract + self.assertEqual(calculator_tools.subtract(10, 4), 6) + + # multiply + self.assertEqual(calculator_tools.multiply(5, 2), 10) + + # divide + self.assertEqual(calculator_tools.divide(20, 5), 4) + + # division by zero + with self.assertRaises(ZeroDivisionError): + calculator_tools.divide(10, 0) + + +if __name__ == '__main__': + testutils.main() diff --git a/examples/string_tools/__init__.py b/examples/string_tools/__init__.py new file mode 100644 index 00000000..856b55c2 --- /dev/null +++ b/examples/string_tools/__init__.py @@ -0,0 +1 @@ +# string_tools package for Python Fire examples diff --git a/examples/string_tools/string_tools.py b/examples/string_tools/string_tools.py new file mode 100644 index 00000000..2bcf40f8 --- /dev/null +++ b/examples/string_tools/string_tools.py @@ -0,0 +1,50 @@ +# Copyright (C) 2018 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""String tools example Fire CLI. + +This module demonstrates the use of Fire without specifying a target component. +By calling Fire() without arguments in main(), all functions defined in this +module become available as CLI commands. + +Example usage: + string_tools reverse "Hello World" + string_tools uppercase "hello" + string_tools count-words "Hello world from Fire" +""" + +import fire + + +def reverse(text=''): + """Return the reversed string.""" + return text[::-1] + + +def uppercase(text=''): + """Return the text in uppercase.""" + return text.upper() + + +def count_words(text=''): + """Return the number of words in the text.""" + return len(text.split()) + + +def main(): + fire.Fire(name='string_tools') + + +if __name__ == '__main__': + main() diff --git a/examples/string_tools/string_tools_test.py b/examples/string_tools/string_tools_test.py new file mode 100644 index 00000000..701874a1 --- /dev/null +++ b/examples/string_tools/string_tools_test.py @@ -0,0 +1,37 @@ +# Copyright (C) 2018 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for the string_tools module.""" + +from fire import testutils + +from examples.string_tools import string_tools + + +class StringToolsTest(testutils.BaseTestCase): + + def testStringTools(self): + # reverse + self.assertEqual(string_tools.reverse("Hello"), "olleh") + + # uppercase + self.assertEqual(string_tools.uppercase("hello"), "HELLO") + + # count_words + self.assertEqual(string_tools.count_words("Hello world"), 2) + self.assertEqual(string_tools.count_words("one two three four"), 4) + + +if __name__ == '__main__': + testutils.main() diff --git a/examples/time_tools/__init__.py b/examples/time_tools/__init__.py new file mode 100644 index 00000000..aa4de40e --- /dev/null +++ b/examples/time_tools/__init__.py @@ -0,0 +1 @@ +# Init file for time_tools example module. diff --git a/examples/time_tools/time_tools.py b/examples/time_tools/time_tools.py new file mode 100644 index 00000000..3a32eeb9 --- /dev/null +++ b/examples/time_tools/time_tools.py @@ -0,0 +1,53 @@ +# Copyright (C) 2018 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Simple time utilities Fire CLI. + +This example demonstrates exposing simple time helper functions using Fire. +Fire() is called with no target component so all functions in this module +become CLI commands. + +Example usage: + time_tools now + time_tools to-seconds 1 30 + time_tools add-seconds "2024-01-01 10:00:00" 120 +""" + +import fire +import datetime + + +def now(): + """Return the current datetime as a string.""" + return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + +def to_seconds(minutes=0, seconds=0): + """Return minutes + seconds converted to total seconds.""" + return minutes * 60 + seconds + + +def add_seconds(time_string="", seconds=0): + """Add seconds to a datetime string.""" + dt = datetime.datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S") + new_dt = dt + datetime.timedelta(seconds=seconds) + return new_dt.strftime("%Y-%m-%d %H:%M:%S") + + +def main(): + fire.Fire(name="time_tools") + + +if __name__ == "__main__": + main() diff --git a/examples/time_tools/time_tools_test.py b/examples/time_tools/time_tools_test.py new file mode 100644 index 00000000..aa058b4b --- /dev/null +++ b/examples/time_tools/time_tools_test.py @@ -0,0 +1,33 @@ +# Copyright (C) 2018 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for the time_tools module.""" + +from fire import testutils +from examples.time_tools import time_tools + + +class TimeToolsTest(testutils.BaseTestCase): + + def testToSeconds(self): + self.assertEqual(time_tools.to_seconds(1, 30), 90) + self.assertEqual(time_tools.to_seconds(0, 45), 45) + + def testAddSeconds(self): + result = time_tools.add_seconds("2024-01-01 10:00:00", 120) + self.assertEqual(result, "2024-01-01 10:02:00") + + +if __name__ == "__main__": + testutils.main()