When generating API stubs with the scaffold utility using, e.g., `python -m localstack.aws.scaffold sns`,
the scaffold creates method names from operation names, which are ugly when acronyms (subsequent uppercase characters that belong together).

Example:
`CreateSMSSandboxPhoneNumber` -> `create_s_m_s_sandbox_phone_number`

it would be nicer to have `create_sms_sandbox_phone_number`

This is a limitation of this method: https://github.com/localstack/localstack/blob/1888e66b85d7e6a8ee457bc7a732984fcf7aa830/localstack/utils/common.py#L978-L979
cmd = "echo 'foobar'"
        result = common.run(cmd)
        self.assertEqual("foobar", result.strip())
    def test_run_with_cache(self):
        cmd = "python3 -c 'import time; print(int(time.time() * 1000))'"
        d1 = float(common.run(cmd))
        d2 = float(common.run(cmd, cache_duration_secs=1))
        d3 = float(common.run(cmd, cache_duration_secs=1))
        self.assertNotEqual(d1, d2)
        self.assertEqual(d2, d3)
    def test_run_with_cache_expiry(self):
        cmd = "python3 -c 'import time; print(int(time.time() * 1000))'"
        d1 = float(common.run(cmd, cache_duration_secs=0.5))
        d2 = float(common.run(cmd, cache_duration_secs=0.5))
        time.sleep(0.8)
        d3 = float(common.run(cmd, cache_duration_secs=0.5))
        self.assertEqual(d1, d2)
        self.assertNotEqual(d2, d3)
    def test_is_command_available(self):
        self.assertTrue(common.is_command_available("python3"))
        self.assertFalse(common.is_command_available("hopefullydoesntexist"))
    def test_camel_to_snake_case(self):
        fn = common.camel_to_snake_case
        self.assertEqual("foo", fn("Foo"))
        self.assertEqual("foobar_ed", fn("FoobarEd"))
        self.assertEqual("foo_bar_ed", fn("FooBarEd"))
        self.assertEqual("foo_bar", fn("Foo_Bar"))
        self.assertEqual("foo__bar", fn("Foo__Bar"))
        self.assertEqual("foo_b_a_r", fn("FooBAR"))
    def test_snake_to_camel_case(self):