mockly 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ce4062d908a409afdfc060cd69c375a55c50a47eef2814f73f90e5d507b205d3
4
+ data.tar.gz: 03d5b270eff8554aa71b099d6d731ed54b3753d914706c0061130cf943a87613
5
+ SHA512:
6
+ metadata.gz: 16c559edf9b0e3c7d977fe72e7b43b626cbe80de16d70c0d7e496604d8194c72a9979f5591e231eb4614c441b6ab58c5f66c1ff9a98844492c9cd80e6b853eab
7
+ data.tar.gz: 98a90186286dbcf6109878a37a2273c2a96e0184439c780f57d2dd8660d1abd47b6a1f341cd44b431244809ac03fd009de934ad42cabd731cc057e2e6607f16d
data/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # Mockly
2
+
3
+ A small, file-based API mock server for local testing.
4
+
5
+ ## Status
6
+
7
+ Early development. More documentation will be added soon.
data/bin/mockly ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ require 'mockly'
3
+ require 'colsole'
4
+ include Colsole
5
+
6
+ runner = Mockly::CLI.runner
7
+
8
+ begin
9
+ exit runner.run ARGV
10
+ rescue Interrupt
11
+ say! "\nGoodbye"
12
+ exit 1
13
+ rescue => e
14
+ puts e.backtrace.reverse if ENV['DEBUG']
15
+ say! "rib` #{e.class} `\n#{e.message}"
16
+ exit 1
17
+ end
data/lib/mockly/app.rb ADDED
@@ -0,0 +1,61 @@
1
+ require 'sinatra/base'
2
+ require 'json'
3
+ require 'mime/types'
4
+
5
+ module Mockly
6
+ class App < Sinatra::Base
7
+ configure do
8
+ set :bind, '0.0.0.0'
9
+ set :port, 3000
10
+ set :server, :puma
11
+ set :environment, :production
12
+ set :mock_root, File.expand_path('mocks', Dir.pwd)
13
+ set :asset_root, File.join(settings.mock_root, 'assets')
14
+ end
15
+
16
+ before do
17
+ content_type 'application/json'
18
+ end
19
+
20
+ helpers do
21
+ def candidates(path, method)
22
+ clean = path.gsub(%r{/$}, '')
23
+ base = File.basename(clean)
24
+ dir = File.dirname(clean)
25
+ method_tag = method.downcase
26
+
27
+ dir = '' if dir == '.'
28
+ full_dir = dir.empty? ? settings.mock_root : "#{settings.mock_root}/#{dir}"
29
+
30
+ [
31
+ "#{full_dir}/#{method_tag}-#{base}.json",
32
+ "#{full_dir}/#{base}/#{method_tag}.json",
33
+ "#{full_dir}/#{base}.json",
34
+ ]
35
+ end
36
+
37
+ def resolve_mock(path, method)
38
+ candidates(path, method).find { |file| File.file?(file) }
39
+ end
40
+ end
41
+
42
+ %w[GET POST PUT PATCH DELETE OPTIONS].each do |verb|
43
+ send(verb.downcase, '/*') do
44
+ req_path = params['splat'].first
45
+
46
+ exact = File.expand_path req_path, settings.mock_root
47
+
48
+ if exact.start_with?(settings.mock_root) && File.file?(exact)
49
+ content_type MIME::Types.type_for(exact).first.to_s
50
+ return send_file exact
51
+ end
52
+
53
+ file = resolve_mock req_path, request.request_method
54
+ return File.read file if file
55
+
56
+ status 404
57
+ JSON.dump error: "No mock for #{request.request_method} #{request.path}"
58
+ end
59
+ end
60
+ end
61
+ end
data/lib/mockly/cli.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'mister_bin'
2
+
3
+ module Mockly
4
+ class CLI
5
+ def self.runner
6
+ MisterBin::Runner.new header: 'Mockly - Mock Server for API Testing',
7
+ handler: Command
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,29 @@
1
+ require 'mister_bin'
2
+
3
+ module Mockly
4
+ class Command < MisterBin::Command
5
+ summary 'Start the mock server'
6
+
7
+ version Mockly::VERSION
8
+
9
+ usage 'mockly [--port N --host IP --root PATH]'
10
+ usage 'mockly (-h|--help)'
11
+
12
+ option '-p --port N', 'Port number [default: 3000]'
13
+ option '-b --host IP', 'Binding address [default: 0.0.0.0]'
14
+ option '-r --root PATH', 'Root mocks directory [default: ./mocks]'
15
+
16
+ def run
17
+ port = (args['--port']).to_i
18
+ host = args['--host']
19
+ mock_root = File.expand_path args['--root']
20
+
21
+ App.set :bind, host
22
+ App.set :port, port
23
+ App.set :mock_root, mock_root
24
+ App.set :asset_root, File.join(mock_root, 'assets')
25
+
26
+ App.run!
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,3 @@
1
+ module Mockly
2
+ VERSION = '0.0.1'
3
+ end
data/lib/mockly.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'mockly/version'
2
+ require 'mockly/app'
3
+ require 'mockly/command'
4
+ require 'mockly/cli'
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mockly
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Danny Ben Shitrit
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: json
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '2.18'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '2.18'
26
+ - !ruby/object:Gem::Dependency
27
+ name: mime-types
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '3.6'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '3.6'
40
+ - !ruby/object:Gem::Dependency
41
+ name: mister_bin
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.7'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.7'
54
+ - !ruby/object:Gem::Dependency
55
+ name: puma
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '7.1'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '7.1'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rackup
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.1'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '2.1'
82
+ - !ruby/object:Gem::Dependency
83
+ name: sinatra
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '4.2'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '4.2'
96
+ description: Set up a testing server using a directory structure
97
+ email: db@dannyben.com
98
+ executables:
99
+ - mockly
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - README.md
104
+ - bin/mockly
105
+ - lib/mockly.rb
106
+ - lib/mockly/app.rb
107
+ - lib/mockly/cli.rb
108
+ - lib/mockly/command.rb
109
+ - lib/mockly/version.rb
110
+ homepage: https://github.com/DannyBen/mockly
111
+ licenses:
112
+ - MIT
113
+ metadata:
114
+ bug_tracker_uri: https://github.com/DannyBen/mockly/issues
115
+ changelog_uri: https://github.com/DannyBen/mockly/blob/master/CHANGELOG.md
116
+ source_code_uri: https://github.com/DannyBen/mockly
117
+ rubygems_mfa_required: 'true'
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '3.2'
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ requirements: []
132
+ rubygems_version: 4.0.3
133
+ specification_version: 4
134
+ summary: File based API mock server
135
+ test_files: []