clientside_aws 0.0.24 → 0.0.25

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fa4605924db8e40740bbe014617f533b9a0ddc50
4
- data.tar.gz: 4c9c9f6e90281a6dbff7e03d9d1851f5d950d501
3
+ metadata.gz: 8269c596909ba636737c30f536e8bf9b140360c7
4
+ data.tar.gz: df95be118f5e808665fba5d17b6357667f3ff254
5
5
  SHA512:
6
- metadata.gz: 186e49b50aea5a13d9819213d82942c07d5dcbe6bb6203e22b982515503a557580f7675397760fb157f6e903c29a7cbec756fa4a51cdb5103a6f0a18a994108b
7
- data.tar.gz: 52f690874266a4bec8892b33e8a4099c8213a6872ababbd54041f9eecf6bab39d70b4c369cb0176e3e91562034925c3da1dd5f2219b0487780d597bf369fabf3
6
+ metadata.gz: f36b7bcf69a94c70d341af1d20c165810962ee192f72e9ab354efd62d1fe223da1a290053178d7fd578bd814ca79bac0f8a3210e55f9cf4cf8f498deab1b3a48
7
+ data.tar.gz: f9ddeca0dbe59eba1cb861a7ce7f35c0a1db480bd484fd9823936230cc4009b6d2341e5e0050bc9167853ffb1bccca82608964724a1636a6a5ae40064e8cf8ae
data/Dockerfile CHANGED
@@ -11,7 +11,7 @@ RUN mkdir /mnt/redis
11
11
 
12
12
  RUN apt-add-repository ppa:brightbox/ruby-ng -y
13
13
  RUN apt-get update && apt-get install -y ruby2.4 ruby2.4-dev git-core build-essential zlib1g-dev
14
- RUN apt-get install -y wget curl
14
+ RUN apt-get install -y wget curl telnet
15
15
 
16
16
  RUN cd /opt ; wget "http://download.redis.io/releases/redis-2.8.24.tar.gz"
17
17
  RUN cd /opt ; gunzip redis-2.8.24.tar.gz ; tar -xvf redis-2.8.24.tar
data/Gemfile CHANGED
@@ -4,19 +4,19 @@ source 'https://rubygems.org'
4
4
 
5
5
  # These are gem dependencies for our Docker image,
6
6
  # not for our Gemfile which points clients to our docker image
7
- gem 'aws-sdk', '2.10.26'
8
- gem 'aws-sdk-v1', '1.66.0'
7
+ gem 'aws-sdk', '~> 2'
8
+ gem 'aws-sdk-v1'
9
9
  gem 'builder', '~> 3.2'
10
10
  gem 'httparty', '0.15.6'
11
11
  gem 'json', '1.8.6'
12
12
  gem 'json_pure', '1.8.6'
13
13
  gem 'monkey-lib', '0.5.4'
14
14
  gem 'pry'
15
- gem 'rack', '1.5.2'
15
+ gem 'rack', '~> 1.5'
16
16
  gem 'rack-cors', '0.2.9', require: 'rack/cors'
17
17
  gem 'rack-test', '0.5.7'
18
18
  gem 'redis', '~> 4.0'
19
- gem 'rspec', '~> 3.0'
19
+ gem 'rspec', '~> 3'
20
20
  gem 'sinatra', '1.4.8'
21
21
  gem 'sinatra-reloader', '0.5.0'
22
22
  gem 'webmock', '3.1.0'
data/README.md CHANGED
@@ -1,120 +1,125 @@
1
- clientside_aws
2
- ===================
1
+ # Benefits
3
2
 
4
- Run selected AWS services via a docker container locally, for more effective development and testing.
3
+ If you require the Internet to develop and test your next ruby application, then **your dev environment is broken**.
5
4
 
6
- ## Install
5
+ With Clientside AWS, you can:
7
6
 
8
- In your gemfile:
7
+ - Write code on a plane: Interact with AWS services like S3, SQS and DynamoDb, without Internet access
8
+ - Eliminate tedious configuration of WebMock-powered mock AWS responses in your unit tests
9
+ - Save time and money by avoiding the need for a test account in AWS where you upload S3 files and interact with DynamoDb databases along with other developers on your team
10
+ - Instantly restore your development and test environments to Known Good States
9
11
 
10
- gem 'clientside_aws', require: 'clientside_aws'
12
+ # Alternatives
11
13
 
12
- ## Features
14
+ ### [Fake S3](https://github.com/jubos/fake-s3)
13
15
 
14
- - Write code on a plane: Interact with AWS services like S3, SQS and DynamoDb, without internet access
15
- - No more tedious configuration of mocked responses in your unit tests
16
- - Save time and money by avoiding the need for a 'test' account in AWS where you upload S3 files and interact with DynamoDb databases along with other developers on your team
17
- - Instantly restore your development and test environments to known good states
16
+ Pro: Very complete implementation of the AWS S3 protocol.
17
+ Cons: Nonstandard license; no support for running docker; only mocks S3 (not other services)
18
18
 
19
- Think about how
19
+ ### [DynamoDB local](https://aws.amazon.com/blogs/aws/dynamodb-local-for-desktop-development/)
20
20
 
21
+ Pros: Complete implementation of the DynamoDB protocol
22
+ Cons: Requires java installation locally; no docker support
21
23
 
22
- This code is meant to be used by developers who are attempting to build web applications on AWS but wish to run client-side testing and validation. Presently, this project mocks DynamoDB and SQS.
24
+ ### [LocalStack](https://github.com/localstack/localstack)
23
25
 
24
- While creating and tearing down "free-tier" SQS and DynamoDB databases may be an acceptable solution for some, the time required (tens of seconds or minutes) quickly makes TDD (test-driven development) impractical. Just like we can use an in-memory sqlite3-based solution for mocking Mysql databases with ActiveRecord, we can now mock SQS and DynamoDB databases in memory using Redis.
26
+ Pros: Implementations of a large number of AWS services; uses docker; supported by Atlassian.
27
+ Cons: Unclear licensing; probably not free in the long-run. Does not offer ruby bindings.
25
28
 
26
- To run this code, you will need ruby, sinatra, httparty, and the json and redis rubygems. I also use the sinatra/reloader gem to aid in development, but it is not necessary.
29
+ # Installation
27
30
 
28
- You will also need redis-server installed locally
31
+ There are two parts to installation: running a docker container that mocks the AWS services, and including the `clientside_aws` gem in your application.
29
32
 
30
- Make sure redis-server is in your path
33
+ ## Container configuration
31
34
 
32
- Then, from the command line, run:
35
+ From OSX, type:
33
36
 
34
- ruby spec/dynamodb_spec.rb
35
- or
37
+ gem install clientside_aws
36
38
 
37
- ruby spec/sqs_spec.rb
39
+ This will install a gem and a script that lets you build the Clientside AWS docker image. Once the `clientside_aws` gem is installed locally on OSX, you will need to build the Clientside AWS docker image. Run:
38
40
 
39
- That will run the unit tests against this code.
41
+ clientside_aws_build
40
42
 
41
- Overview
42
- --------
43
+ Once that docker image is built, it will be available for you to manually launch or include in `docker-compose.yml` files.
43
44
 
44
- This code works by overwriting the AWS service URLs in the aws-sdk gem, then monkeypatching the AWS::Core::Client request methods to use Rack's put, get, post and delete methods (see aws_mock.rb). This points to a Sinatra endpoint that processes the DynamoDB requests. Provided you are using the DynamoDB methods defined in aws-sdk when running tests and validations, the ruby client never knows it isn't talking to the real service.
45
+ $ docker images
46
+ REPOSITORY TAG IMAGE ID CREATED SIZE
47
+ clientside_aws latest fec78caf81be just now 881MB
48
+ mysql 5.7 e27c7a14671f 20 months ago 361MB
49
+ redis latest 93a08017b97e 22 months ago 151MB
50
+ memcached latest 355142d48ea3 22 months ago 132MB
45
51
 
46
- I have not packaged this up as a gem, because it needs to be a standalone sinatra project so you can launch a server from the command line (see below). I am open to suggestions about how to make it easier/cleaner to include dynamodb_mock into your actual project; right now you have to use a require statement that has knowledge of your directory structure.
52
+ To manually launch a docker container running Clientside AWS, run:
47
53
 
48
- Adding to your project
49
- ---------------------------
54
+ docker run -d --rm -p <YOUR_PREFERRED_PORT>:4567 --name clientside_aws clientside_aws:latest
50
55
 
51
- First, if you plan on running any rspec unit tests, you should update the REDIS_PATH variable in spec_helper.rb to point to your redis binary.
56
+ Or, run:
52
57
 
53
- To start clientside_aws stand-alone, from the command line, run:
58
+ clientside_aws_run
54
59
 
55
- cd ~/clientside_aws/
56
- ruby index.rb -p 4568
60
+ To include in a `docker-compose.yml` file, see [the example](/examples/dockerized/docker-compose.yml).
57
61
 
58
- This launches a Sinatra app, running on port 4568, that can respond to and support various services using the AWS protocol. You have your own, client-side SQS and DynamoDB server! If you are capable of mocking the requests in your language of choice to point to localhost:4568 you are ready to go. Included in this project is the code to mock in Ruby.
62
+ ## Application configuration
59
63
 
60
- For example, here's how I added clientside_aws to my Sinatra project:
64
+ In your gemfile:
61
65
 
62
- configure :development do
63
- require 'clientside_aws'
64
- DYNAMODB = AWS::DynamoDB.new(
65
- :access_key_id => "...",
66
- :secret_access_key => "...")
67
- # more config
68
- end
66
+ gem 'clientside_aws', require: 'clientside_aws'
69
67
 
70
- I can then access the DynamoDB API from my code using the standard ruby aws-sdk DynamoDB class, discussed in more detail here:
71
- http://rubydoc.info/github/amazonwebservices/aws-sdk-for-ruby/master/AWS/DynamoDB
68
+ Then, at the top of your application where you are configuring global services, type:
72
69
 
73
- Assuming you are including the 'aws_mock' file, you can call DynamoDB just as you normally would in your code. For example:
70
+ config = { region: 'us-mockregion-1',
71
+ access_key_id: '...',
72
+ secret_access_key: '...' }
74
73
 
75
- dynamo_db = AWS::DynamoDB.new(
76
- :access_key_id => "...",
77
- :secret_access_key => "...")
74
+ Aws.config.update(config)
75
+ AWS.config(config)
78
76
 
79
- visitors_table = dynamo_db.tables.create("visitors", 10, 5,
80
- :hash_key => { :creator_id => :number },
81
- :range_key => {:date => :number})
77
+ You can see that you do not need to specify a valid access_key_id nor secret_access_key, but you must set the region to be `us-mockregion-1` -- this is how Clientside AWS identifies and redirects requests to AWS services.
82
78
 
83
- visitors_table.hash_key = [:creator_id, :number]
84
- visitors_table.range_key = [:date, :number]
79
+ Clientside AWS is also capable of mocking requests from the v1 and v2 versions of the [aws-sdk-ruby](https://github.com/aws/aws-sdk-ruby) gem. It is not yet tested with v3.
85
80
 
86
- (0..10).each do |idx|
87
- visitors_table.items.put(:creator_id => 1, :date => Time.now.to_f - (60 * idx), :target_id => 10 + idx)
88
- end
81
+ See [the example](/examples/dockerized/app/index.rb) for how to configure Clientside AWS in your application.
89
82
 
90
- You can check out the dynamodb_spec.rb file for more unit tests and sample DynamoDB ruby code.
83
+ # Classic development approach
91
84
 
92
- If testing on a localhost(which you most likely are), you will need to add this line to your /etc/hosts file:
85
+ ![Classic approach diagram](/examples/documentation/classic_model.png)
93
86
 
94
- 127.0.0.1 test.localhost
87
+ In the classic approach to development, you would install application services like mysql, redis and memcached locally on OSX. You would then install the ruby runtime, with tools like [rvm](https://rvm.io/). With luck, you wouldn't encounter OSX-specific bugs, [like this one](https://blog.phusion.nl/2017/10/13/why-ruby-app-servers-break-on-macos-high-sierra-and-what-can-be-done-about-it/).
95
88
 
96
- Amazon sticks the bucket to the front of the localhost to create a subdomain
89
+ When you needed to interact with AWS services, you would either use [WebMock](https://github.com/bblimke/webmock) to provide a known response to outbound requests (probably in your rspec tests), and for development you would create a test account on AWS that had empty S3 buckets and DynamoDb databases. This account might have been shared with other developers, and could (over time) get polluted with development data. It was flushed infrequently, if ever. It also cost money, even if a nominal amount.
97
90
 
98
- TODO
99
- --------------------
91
+ # Clientside AWS approach
92
+
93
+ With Clientside AWS, you have two approaches to configuring your application services: Partial or Full Docker.
94
+
95
+ ## Partial docker
100
96
 
101
- I am developing this code for my own test purposes as I go along. There are certainly bugs and I have not yet implemented all the DynamoDB methods. Code lacks support at this time for the following:
97
+ ![Partial docker diagram](/examples/documentation/partial_docker.png)
102
98
 
103
- * Scan
104
- * UpdateTable
105
- * BatchGetItem
99
+ With the partial docker approach, you continue to install runtime environments locally on OSX like [rvm](https://rvm.io/), but you also install [Docker for Mac](https://www.docker.com/docker-mac), on which you launch a container running Clientside AWS. You then `require clientside_aws` in your application which redirects AWS requests to the container. You also may consider running other services, like mysql, memcached and redis, inside a docker container.
106
100
 
107
- I also have very a limited test suite; I will expand as I can. Feel free to fork, add, and submit a pull request.
101
+ See [this example](/examples/local/) for how to configure a partial docker development approach.
108
102
 
109
- There are clearly many more AWS services one can mock up.
103
+ ## Full docker
104
+
105
+ ![Full docker diagram](/examples/documentation/full_docker.png)
106
+
107
+ With the full docker approach, you do 100% of your web application development from within Docker. Your OSX laptop only need to have a web browser, a text editor, and docker installed (and if you are doing mobile development, Xcode/Android Studio).
108
+
109
+ When developing with the full docker approach, your application runtime it itself running in a container. However, because your application code will be changing and churning constantly, it doesn't make sense to run a COPY command and seal it up, as one normally does with docker containers that you are shipping to other places. Instead, you mount your local OSX filesystem into an Ubuntu container, on which you have also installed the ruby runtime. You also execute an interactive bash script on that container, so you can easily do things like stop and restart your web server. This container creates network links between itself and your other services, including Clientside AWS, mysql, redis, memcached, postgres, etc.
110
+
111
+ See [this example](/examples/dockerized/) for how to figure a full docker development approach.
112
+
113
+ TODO
114
+ =======
115
+ * Add support for V3 of the aws-sdk gem
110
116
 
111
- * * *
112
117
 
113
118
  License
114
119
  =======
115
- MIT License (http://en.wikipedia.org/wiki/MIT_License). Some parts of this code were adapted from the aws-sdk project, which can be found at: https://github.com/amazonwebservices/aws-sdk-for-ruby and is itself licensed under the Apache 2.0 license.
120
+ [MIT License](http://en.wikipedia.org/wiki/MIT_License). Some parts of this code were adapted from the [aws-sdk project](https://github.com/aws/aws-sdk-core-ruby), which is itself licensed under the Apache 2.0 license.
116
121
 
117
- Copyright (C) 2012 Perry Street Software, Inc.
122
+ Copyright (C) 2012-2017 Perry Street Software, Inc.
118
123
 
119
124
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
120
125
 
@@ -21,11 +21,11 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency 'rake', '10.1.0'
22
22
  spec.add_development_dependency 'rack-test', '0.5.7'
23
23
  spec.add_development_dependency 'bundler', '~> 1.3'
24
- spec.add_dependency 'aws-sdk-v1', '1.66.0'
25
- spec.add_dependency 'aws-sdk', '~> 2.0'
24
+ spec.add_dependency 'aws-sdk-v1', '1.67.0'
25
+ spec.add_dependency 'aws-sdk', '~> 2'
26
26
  spec.add_dependency 'builder', '~> 3.1'
27
27
  spec.add_dependency 'httparty', '~> 0.15'
28
28
  spec.add_dependency 'json', '~> 1.8'
29
29
  spec.add_dependency 'webmock', '~> 3.1'
30
- spec.add_dependency 'rspec', '~> 3.0'
30
+ spec.add_dependency 'rspec', '~> 3'
31
31
  end
@@ -1,17 +1,36 @@
1
1
  helpers do
2
+ def read_s3_input(bucket:, path:)
3
+ bucket = Aws::S3::Resource.new(S3_CONFIG).bucket(bucket)
4
+ object = bucket.object(path)
5
+
6
+ object.get.body.read if object.exists?
7
+ end
8
+
9
+ def write_s3_output(bucket:, path:, data:, content_type:)
10
+ bucket_obj = Aws::S3::Resource.new(S3_CONFIG).bucket(bucket)
11
+ object = bucket_obj.object(path)
12
+
13
+ object.put(body: data,
14
+ content_type: content_type,
15
+ acl: 'private')
16
+ puts "JUST WROTE #{bucket} path #{path} data #{data.length}"
17
+ end
18
+
2
19
  def encode_video(source_key, dest_key, pipeline_id)
3
20
  pipeline = JSON.parse(AWS_REDIS.get("pipeline:#{pipeline_id}"))
4
- bucket = pipeline['InputBucket']
21
+ input_bucket = pipeline['InputBucket']
5
22
  input_obj_name = source_key
6
- input_obj_key = "s3:bucket:#{bucket}:#{input_obj_name}"
7
23
 
8
- bucket = pipeline['OutputBucket']
24
+ input_data = read_s3_input(bucket: input_bucket,
25
+ path: input_obj_name)
26
+
27
+ output_bucket = pipeline['OutputBucket']
9
28
  output_obj_name = dest_key
10
- output_obj_key = "s3:bucket:#{bucket}:#{output_obj_name}"
11
- input_obj_body = AWS_REDIS.hget input_obj_key, 'body'
29
+ # output_obj_key = "s3:bucket:#{bucket}:#{output_obj_name}"
30
+ # input_obj_body = AWS_REDIS.hget input_obj_key, 'body'
12
31
 
13
32
  tmp = Tempfile.new(source_key)
14
- tmp.write(input_obj_body)
33
+ tmp.write(input_data)
15
34
  tmp.close
16
35
 
17
36
  # Setup paths
@@ -37,8 +56,10 @@ helpers do
37
56
  video = file.read
38
57
  file.close
39
58
 
40
- AWS_REDIS.hset output_obj_key, 'body', video
41
- AWS_REDIS.hset output_obj_key, 'content-type', 'video/mp4'
59
+ write_s3_output(bucket: output_bucket,
60
+ path: output_obj_name,
61
+ data: video,
62
+ content_type: 'video/mp4')
42
63
 
43
64
  begin
44
65
  File.delete(final_path) if File.exist?(final_path)
@@ -0,0 +1,21 @@
1
+ # Installation
2
+
3
+ To run this example, type
4
+
5
+ docker-compose up -d
6
+
7
+ Once it has launched, run
8
+
9
+ docker ps
10
+
11
+ This should show you something like this:
12
+
13
+ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14
+ ec9815828e64 clientside_aws_test_app "/sbin/my_init" 3 seconds ago Up 1 second 0.0.0.0:32847->4567/tcp clientside_aws_test_app
15
+ b19233b502f8 clientside_aws:latest "/sbin/my_init" 5 seconds ago Up 2 seconds 0.0.0.0:32846->4567/tcp clientside_aws_test_aws
16
+
17
+ You can see that the `clientside_aws_test_app` container is running on port `32847`. Thus, from your local web browser, type in:
18
+
19
+ http://localhost:32847/
20
+
21
+ And you should see the example running there.
@@ -0,0 +1,11 @@
1
+ # Installation
2
+
3
+ This example assumes you have a dockerized clientside_aws container already running. If you do not, after you have installed clientside_aws locally on OSX and built its image, run
4
+
5
+ clientside_aws_run
6
+
7
+ This will launch a container running on the correct port for this example to work. Then, simply run:
8
+
9
+ ruby test.rb
10
+
11
+ And you should see this example run successfully.
data/index.rb CHANGED
@@ -11,6 +11,7 @@ require 'base64'
11
11
  require 'rack'
12
12
  require 'rack/cors'
13
13
  require 'rack/protection'
14
+ require 'aws-sdk'
14
15
 
15
16
  ENV['RACK_ENV'] = 'development' unless ENV['RACK_ENV']
16
17
 
@@ -51,6 +52,14 @@ end
51
52
 
52
53
  DYNAMODB_PREFIX = 'DynamoDBv20110924'.freeze
53
54
 
55
+ S3_CONFIG = {
56
+ region: 'us-mockregion-1',
57
+ access_key_id: '...',
58
+ secret_access_key: '...',
59
+ force_path_style: true,
60
+ endpoint: 'http://app_rspec_localstack:4572'
61
+ }.freeze
62
+
54
63
  get '/' do
55
64
  'hello'
56
65
  end
@@ -1,3 +1,3 @@
1
1
  module ClientsideAws
2
- VERSION = '0.0.24'.freeze
2
+ VERSION = '0.0.25'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clientside_aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.24
4
+ version: 0.0.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Perry Street Software, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-18 00:00:00.000000000 Z
11
+ date: 2018-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -58,28 +58,28 @@ dependencies:
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 1.66.0
61
+ version: 1.67.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 1.66.0
68
+ version: 1.67.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: aws-sdk
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '2.0'
75
+ version: '2'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '2.0'
82
+ version: '2'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: builder
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -142,14 +142,14 @@ dependencies:
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '3.0'
145
+ version: '3'
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '3.0'
152
+ version: '3'
153
153
  description: This code is meant to be used by developers who are attempting to build
154
154
  web applications on AWS but wish to run client-side testing and validation.
155
155
  email:
@@ -188,11 +188,16 @@ files:
188
188
  - docker/clientside-aws-run
189
189
  - docker/redis-server-run
190
190
  - examples/dockerized/Dockerfile
191
+ - examples/dockerized/README.md
191
192
  - examples/dockerized/app-run
192
193
  - examples/dockerized/app/Gemfile
193
194
  - examples/dockerized/app/index.rb
194
195
  - examples/dockerized/app/views/index.erb
195
196
  - examples/dockerized/docker-compose.yml
197
+ - examples/documentation/classic_model.png
198
+ - examples/documentation/full_docker.png
199
+ - examples/documentation/partial_docker.png
200
+ - examples/local/README.md
196
201
  - examples/local/test.rb
197
202
  - index.rb
198
203
  - lib/clientside_aws.rb