agile-proxy-jruby 0.1.25-jruby

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/.bowerrc +3 -0
  3. data/.gitignore +10 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +36 -0
  6. data/.travis.yml +10 -0
  7. data/Gemfile +4 -0
  8. data/Guardfile +20 -0
  9. data/LICENSE +22 -0
  10. data/README.md +131 -0
  11. data/Rakefile +15 -0
  12. data/agile-proxy.gemspec +60 -0
  13. data/assets/index.html +39 -0
  14. data/assets/ui/app/AgileProxyApi.js +31 -0
  15. data/assets/ui/app/app.js +1 -0
  16. data/assets/ui/app/controller/Stubs.js +64 -0
  17. data/assets/ui/app/controller/main.js +12 -0
  18. data/assets/ui/app/directive/AppEnhancedFormElement.js +21 -0
  19. data/assets/ui/app/directive/AppFor.js +16 -0
  20. data/assets/ui/app/directive/AppResponseEditor.js +54 -0
  21. data/assets/ui/app/model/RequestSpec.js +6 -0
  22. data/assets/ui/app/routes.js +11 -0
  23. data/assets/ui/app/service/Dialog.js +49 -0
  24. data/assets/ui/app/service/DomId.js +10 -0
  25. data/assets/ui/app/service/Error.js +7 -0
  26. data/assets/ui/app/service/Stub.js +36 -0
  27. data/assets/ui/app/view/404.html +2 -0
  28. data/assets/ui/app/view/dialog/error.html +10 -0
  29. data/assets/ui/app/view/dialog/yesNo.html +8 -0
  30. data/assets/ui/app/view/responses/editForm.html +78 -0
  31. data/assets/ui/app/view/status.html +1 -0
  32. data/assets/ui/app/view/stubs.html +19 -0
  33. data/assets/ui/app/view/stubs/edit.html +58 -0
  34. data/assets/ui/css/main.css +3 -0
  35. data/bin/agile_proxy +4 -0
  36. data/bower.json +27 -0
  37. data/config.yml +6 -0
  38. data/db.yml +10 -0
  39. data/db/migrations/20140818110800_create_users.rb +9 -0
  40. data/db/migrations/20140818134700_create_applications.rb +10 -0
  41. data/db/migrations/20140818135200_create_request_specs.rb +13 -0
  42. data/db/migrations/20140821115300_create_responses.rb +14 -0
  43. data/db/migrations/20140823082900_add_method_to_request_specs.rb +7 -0
  44. data/db/migrations/20140823083900_rename_request_spec_columns.rb +8 -0
  45. data/db/migrations/20141031072100_add_url_type_to_request_specs.rb +8 -0
  46. data/db/migrations/20141105125600_add_conditions_to_request_specs.rb +7 -0
  47. data/db/migrations/20141106083100_add_username_and_password_to_applications.rb +8 -0
  48. data/db/migrations/20141119143800_add_record_to_applications.rb +7 -0
  49. data/db/migrations/20141119174300_create_recordings.rb +18 -0
  50. data/db/migrations/20150221152500_add_record_requests_to_request_specs.rb +7 -0
  51. data/db/schema.rb +78 -0
  52. data/db/seed.rb +26 -0
  53. data/echo_server.rb +19 -0
  54. data/examples/README.md +1 -0
  55. data/examples/facebook_api.html +59 -0
  56. data/examples/tumblr_api.html +22 -0
  57. data/lib/agile_proxy.rb +8 -0
  58. data/lib/agile_proxy/api/applications.rb +77 -0
  59. data/lib/agile_proxy/api/recordings.rb +52 -0
  60. data/lib/agile_proxy/api/request_spec_recordings.rb +52 -0
  61. data/lib/agile_proxy/api/request_specs.rb +86 -0
  62. data/lib/agile_proxy/api/root.rb +45 -0
  63. data/lib/agile_proxy/cli.rb +116 -0
  64. data/lib/agile_proxy/config.rb +66 -0
  65. data/lib/agile_proxy/handlers/handler.rb +43 -0
  66. data/lib/agile_proxy/handlers/proxy_handler.rb +111 -0
  67. data/lib/agile_proxy/handlers/request_handler.rb +75 -0
  68. data/lib/agile_proxy/handlers/stub_handler.rb +146 -0
  69. data/lib/agile_proxy/mitm.crt +22 -0
  70. data/lib/agile_proxy/mitm.key +27 -0
  71. data/lib/agile_proxy/model/application.rb +20 -0
  72. data/lib/agile_proxy/model/recording.rb +17 -0
  73. data/lib/agile_proxy/model/request_spec.rb +48 -0
  74. data/lib/agile_proxy/model/response.rb +51 -0
  75. data/lib/agile_proxy/model/user.rb +17 -0
  76. data/lib/agile_proxy/proxy_connection.rb +112 -0
  77. data/lib/agile_proxy/rack/get_only_cache.rb +30 -0
  78. data/lib/agile_proxy/route.rb +106 -0
  79. data/lib/agile_proxy/router.rb +99 -0
  80. data/lib/agile_proxy/server.rb +119 -0
  81. data/lib/agile_proxy/servers/api.rb +40 -0
  82. data/lib/agile_proxy/servers/request_spec.rb +40 -0
  83. data/lib/agile_proxy/servers/request_spec_direct.rb +35 -0
  84. data/lib/agile_proxy/version.rb +6 -0
  85. data/load_proxy.js +39 -0
  86. data/log/.gitkeep +0 -0
  87. data/spec/common_helper.rb +32 -0
  88. data/spec/fixtures/example_static_file.html +1 -0
  89. data/spec/fixtures/test-server.crt +15 -0
  90. data/spec/fixtures/test-server.key +15 -0
  91. data/spec/integration/helpers/request_spec_helper.rb +84 -0
  92. data/spec/integration/specs/lib/server_spec.rb +474 -0
  93. data/spec/integration_spec_helper.rb +16 -0
  94. data/spec/spec_helper.rb +39 -0
  95. data/spec/support/test_server.rb +105 -0
  96. data/spec/unit/agile_proxy/api/applications_spec.rb +102 -0
  97. data/spec/unit/agile_proxy/api/common_helper.rb +31 -0
  98. data/spec/unit/agile_proxy/api/recordings_spec.rb +115 -0
  99. data/spec/unit/agile_proxy/api/request_spec_recordings_spec.rb +119 -0
  100. data/spec/unit/agile_proxy/api/request_specs_spec.rb +159 -0
  101. data/spec/unit/agile_proxy/handlers/handler_spec.rb +8 -0
  102. data/spec/unit/agile_proxy/handlers/proxy_handler_spec.rb +138 -0
  103. data/spec/unit/agile_proxy/handlers/request_handler_spec.rb +76 -0
  104. data/spec/unit/agile_proxy/handlers/stub_handler_spec.rb +177 -0
  105. data/spec/unit/agile_proxy/model/recording_spec.rb +0 -0
  106. data/spec/unit/agile_proxy/model/request_spec_spec.rb +45 -0
  107. data/spec/unit/agile_proxy/model/response_spec.rb +38 -0
  108. data/spec/unit/agile_proxy/server_spec.rb +91 -0
  109. data/spec/unit/agile_proxy/servers/api_spec.rb +35 -0
  110. data/spec/unit/agile_proxy/servers/request_spec_direct_spec.rb +51 -0
  111. data/spec/unit/agile_proxy/servers/request_spec_spec.rb +35 -0
  112. metadata +736 -0
@@ -0,0 +1,12 @@
1
+ angular.module('AgileProxy').controller('MainCtrl', function ($scope) {
2
+ $scope.tabs = [
3
+ { title:'Dynamic Title 1', content:'Dynamic content 1' },
4
+ { title:'Dynamic Title 2', content:'Dynamic content 2', disabled: true }
5
+ ];
6
+ $scope.alertMe = function() {
7
+ setTimeout(function() {
8
+ alert('You\'ve selected the alert tab!');
9
+ });
10
+ };
11
+
12
+ });
@@ -0,0 +1,21 @@
1
+ angular.module('AgileProxy').directive('appEnhancedFormElement', function ($rootScope, $compile, DomIdService) {
2
+ return {
3
+ restrict: 'A',
4
+ scope: true,
5
+ link: function (scope, element, attrs) {
6
+ var label, localScope;
7
+ if (element.attr('id') === undefined) {
8
+ element.attr('id', DomIdService.nextId());
9
+ }
10
+ localScope = $rootScope.$new(true);
11
+ angular.extend(localScope, {
12
+ elementId: element.attr('id'),
13
+ labelText: attrs.label
14
+ });
15
+ label = $compile('<label class="control-label" for="elementId">{{labelText}}</label>')(localScope);
16
+ element.wrap('<div class="form-group">');
17
+ element.parent().prepend(label);
18
+
19
+ }
20
+ };
21
+ });
@@ -0,0 +1,16 @@
1
+ angular.module('AgileProxy').directive('appFor', function (DomIdService) {
2
+ return {
3
+ restrict: 'A',
4
+ link: function (scope, element, attrs) {
5
+ var inputElement;
6
+ inputElement = element.parent().find('[name="' + attrs.appFor + '"]').first();
7
+ if (!inputElement) {
8
+ return;
9
+ }
10
+ if (!inputElement.attr('id')) {
11
+ inputElement.attr('id', DomIdService.nextId());
12
+ }
13
+ element.attr('for', inputElement.attr('id'));
14
+ }
15
+ };
16
+ });
@@ -0,0 +1,54 @@
1
+ angular.module('AgileProxy').directive('appResponseEditor', function () {
2
+ return {
3
+ restrict: 'EA',
4
+ replace: true,
5
+ templateUrl: '/ui/app/view/responses/editForm.html',
6
+ scope: {
7
+ response: '=ngModel'
8
+ }, controller: function ($scope) {
9
+ var aceInstance, beautifiers;
10
+ beautifiers = {
11
+ 'json': function () {
12
+ $scope.response.content = JSON.stringify(JSON.parse($scope.response.content), null, 4);
13
+ }
14
+ };
15
+ angular.extend($scope, {
16
+ hasBeautifier: hasBeautifier(),
17
+ aceMode: contentTypeToAceMode($scope.response.contentType),
18
+ onAceLoaded: function (instance) {
19
+ aceInstance = instance;
20
+ },
21
+ reformat: function () {
22
+ var type;
23
+ type = contentTypeToAceMode($scope.response.contentType);
24
+ if (beautifiers.hasOwnProperty(type)) {
25
+ beautifiers[type].apply($scope, []);
26
+ }
27
+ },
28
+ onContentTypeChange: function (contentType) {
29
+
30
+ var type = contentTypeToAceMode(contentType);
31
+ aceInstance.getSession().setMode('ace/mode/' + type);
32
+ $scope.hasBeautifier = (beautifiers.hasOwnProperty(type));
33
+ }
34
+ });
35
+ function contentTypeToAceMode(contentType) {
36
+ switch (contentType) {
37
+ case "application/json":
38
+ return 'json';
39
+ case "application/javascript":
40
+ return 'javascript';
41
+ case "text/html":
42
+ return 'html';
43
+ case "text/plain":
44
+ return "plain_text";
45
+ default:
46
+ return "plain_text";
47
+ }
48
+ }
49
+ function hasBeautifier() {
50
+ return beautifiers.hasOwnProperty(contentTypeToAceMode($scope.response.contentType));
51
+ }
52
+ }
53
+ };
54
+ });
@@ -0,0 +1,6 @@
1
+ angular.module('AgileProxy').config(function(restmodProvider) {
2
+ restmodProvider.rebase('DefaultPacker');
3
+ });
4
+ angular.module('AgileProxy').factory('RequestSpecModel', function ($resource, restmod) {
5
+ return restmod.model('/api/v1/users/1/applications/1/request_specs', 'AgileProxyApi');
6
+ });
@@ -0,0 +1,11 @@
1
+ angular.module('AgileProxy').config(function ($routeProvider) {
2
+ $routeProvider.when('/status', {
3
+ templateUrl: '/ui/app/view/status.html'
4
+ }).when('/stubs', {
5
+ templateUrl: '/ui/app/view/stubs.html',
6
+ controller: 'StubsCtrl'
7
+ }).otherwise({
8
+ templateUrl: '/ui/app/view/stubs.html',
9
+ controller: 'StubsCtrl'
10
+ })
11
+ });
@@ -0,0 +1,49 @@
1
+ angular.module('AgileProxy').factory('DialogService', function ($modal, $q, $rootScope) {
2
+ return {
3
+ yesNo: function (message) {
4
+ var modalInstance, localScope, deferred;
5
+ localScope = $rootScope.$new(true);
6
+ deferred = $q.defer();
7
+ angular.extend(localScope, {
8
+ message: message,
9
+ yes: function () {
10
+ modalInstance.close();
11
+ deferred.resolve();
12
+
13
+ },
14
+ no: function () {
15
+ modalInstance.close();
16
+ deferred.reject('User Cancelled');
17
+ }
18
+ });
19
+ modalInstance = $modal.open({
20
+ templateUrl: '/ui/app/view/dialog/yesNo.html',
21
+ size: 'lg',
22
+ scope: localScope
23
+ });
24
+ return deferred.promise;
25
+
26
+
27
+ },
28
+ error: function (title, message) {
29
+ var modalInstance, localScope, deferred;
30
+ localScope = $rootScope.$new(true);
31
+ deferred = $q.defer();
32
+ angular.extend(localScope, {
33
+ title: title,
34
+ message: message,
35
+ close: function () {
36
+ modalInstance.close();
37
+ deferred.resolve({});
38
+ }
39
+ });
40
+ modalInstance = $modal.open({
41
+ templateUrl: '/ui/app/view/dialog/error.html',
42
+ size: 'lg',
43
+ scope: localScope
44
+ });
45
+ return deferred.promise;
46
+
47
+ }
48
+ };
49
+ });
@@ -0,0 +1,10 @@
1
+ angular.module('AgileProxy').factory('DomIdService', function () {
2
+ var nextIdNumber;
3
+ return {
4
+ nextId: function () {
5
+ nextIdNumber = nextIdNumber || 0;
6
+ nextIdNumber = nextIdNumber + 1;
7
+ return 'element-' + nextIdNumber;
8
+ }
9
+ };
10
+ });
@@ -0,0 +1,7 @@
1
+ angular.module('AgileProxy').factory('ErrorService', function (DialogService) {
2
+ return {
3
+ serverError: function (response) {
4
+ DialogService.error('Server Error', response.statusText);
5
+ }
6
+ };
7
+ });
@@ -0,0 +1,36 @@
1
+ angular.module('AgileProxy').factory('StubService', function ($modal, $q, $rootScope, RequestSpecModel) {
2
+ return {
3
+ addStub: function (scope) {
4
+ var stub;
5
+ stub = scope.requestSpecs.$build({httpMethod: 'GET', urlType: "url", response: {contentType: 'text/html', statusCode: 200}});
6
+ return this.openEditor(stub, scope);
7
+ },
8
+ editStub: function (stub, scope) {
9
+ return this.openEditor(stub, scope);
10
+ },
11
+ openEditor: function (stub, scope) {
12
+ var modalInstance, localScope, deferred;
13
+ function closeEditor() {
14
+ modalInstance.close();
15
+ }
16
+ localScope = scope ? scope.$new() : $rootScope.$new();
17
+ deferred = $q.defer();
18
+ angular.extend(localScope, {
19
+ stub: stub,
20
+ onOk: function (stub) {
21
+ deferred.resolve({stub: stub, close: closeEditor});
22
+ },
23
+ onCancel: function (stub) {
24
+ closeEditor();
25
+ deferred.reject('User Cancelled', stub);
26
+ }
27
+ });
28
+ modalInstance = $modal.open({
29
+ templateUrl: '/ui/app/view/stubs/edit.html',
30
+ size: 'lg',
31
+ scope: localScope
32
+ });
33
+ return deferred.promise;
34
+ }
35
+ };
36
+ });
@@ -0,0 +1,2 @@
1
+ <h1>Error</h1>
2
+ <p>Page not found</p>
@@ -0,0 +1,10 @@
1
+ <div class="modal-header text-center text-danger">
2
+ <span class="glyphicon glyphicon-warning-sign"></span>
3
+ <span class="text-uppercase">{{title}}</span>
4
+ </div>
5
+ <div class="modal-body text-center">
6
+ {{message}}
7
+ </div>
8
+ <div class="modal-footer">
9
+ <button ng-click="close()" class="btn btn-default">OK</button>
10
+ </div>
@@ -0,0 +1,8 @@
1
+ <div class="modal-header">Confirmation</div>
2
+ <div class="modal-body">
3
+ {{message}}
4
+ </div>
5
+ <div class="modal-footer">
6
+ <button ng-click="no()" class="btn btn-warning">No</button>
7
+ <button ng-click="yes()" class="btn btn-default">Yes</button>
8
+ </div>
@@ -0,0 +1,78 @@
1
+ <form name="editResponseForm" class="form-horizontal" novalidate>
2
+ <div class="form-group">
3
+ <label app-for="name" class="col-xs-2">Name</label>
4
+ <div class="col-xs-10">
5
+ <input name="name" class="form-control" type="text" ng-model="response.name"/>
6
+ </div>
7
+ </div>
8
+ <div class="form-group">
9
+ <label app-for="contentType" class="col-xs-2">Content Type</label>
10
+ <div class="col-xs-10">
11
+ <select ng-change="onContentTypeChange(response.contentType)" name="contentType" class="form-control" ng-model="response.contentType">
12
+ <option value="text/html">Text / HTML</option>
13
+ <option value="application/json">JSON</option>
14
+ <option value="application/javascript">Javascript</option>
15
+ <option value="text/plain">Plain Text</option>
16
+ </select>
17
+ </div>
18
+ </div>
19
+ <div class="form-group">
20
+ <label app-for="statusCode" class="col-xs-2">Status Code</label>
21
+ <div class="col-xs-10">
22
+ <select name="statusCode" class="form-control" ng-model="response.statusCode">
23
+ <option value="200">200 OK</option>
24
+ <option value="404">404 Not Found</option>
25
+ <option value="100">100 Continue</option>
26
+ <option value="101">101 Switching Protocols</option>
27
+ <option value="102">102 Processing</option>
28
+ <option value="201">201 Created</option>
29
+ <option value="202">202 Accepted</option>
30
+ <option value="203">203 Non-Authoritative Information</option>
31
+ <option value="204">204 No Content</option>
32
+ <option value="205">205 Reset Content</option>
33
+ <option value="206">206 Partial Content</option>
34
+ <option value="207">207 Multi-Status</option>
35
+ <option value="208">208 Already Reported</option>
36
+ <option value="226">226 IM Used</option>
37
+ <option value="300">300 Multiple Choices</option>
38
+ <option value="301">301 Moved Permanently</option>
39
+ <option value="302">302 Found</option>
40
+ <option value="303">303 See Other</option>
41
+ <option value="304">304 Not Modified</option>
42
+ <option value="305">305 Use Proxy</option>
43
+ <option value="306">306 Switch Proxy</option>
44
+ <option value="307">307 Temporary Redirect</option>
45
+ <option value="308">308 Permanent Redirect</option>
46
+ <option value="400">400 Bad Request</option>
47
+ <option value="401">401 Unauthorized</option>
48
+ <option value="402">402 Payment Required</option>
49
+ <option value="403">403 Forbidden</option>
50
+ <option value="405">405 Method Not Allowed</option>
51
+ <option value="406">406 Not Acceptible</option>
52
+ <option value="407">407 Proxy Authentication Required</option>
53
+ <option value="408">408 Request Timeout</option>
54
+ <option value="409">409 Conflict</option>
55
+ <option value="410">410 Gone</option>
56
+ <option value="411">411 Length Required</option>
57
+ <option value="422">422 Unprocessable Entity</option>
58
+ <option value="500">500 Internal Server Error</option>
59
+ <option value="501">501 Not Implemented</option>
60
+ </select>
61
+ </div>
62
+ </div>
63
+ <div class="form-group">
64
+ <div class="text-center">
65
+ <label app-for="content">Content</label>
66
+ </div>
67
+ <div>
68
+ <div class="btn-toolbar">
69
+ <label app-for="isTemplate">Is Template ?</label>
70
+ <input type="checkbox" ng-model="response.isTemplate" />
71
+
72
+ <button ng-show="hasBeautifier" ng-click="reformat()" class="btn btn-xs pull-right">Re Format</button>
73
+ </div>
74
+ <div style="height: 400px;" ui-ace="{mode: aceMode, useWrapMode: true, onLoad: onAceLoaded}" name="content" class="form-control" ng-model="response.content" required></div>
75
+ </div>
76
+ </div>
77
+
78
+ </form>
@@ -0,0 +1 @@
1
+ <h1>Status</h1>
@@ -0,0 +1,19 @@
1
+ <div class="panel panel-default">
2
+ <div class="panel-heading">
3
+ <span>HTTP Stubs</span>
4
+ <button ng-click="deleteSelection()" class="btn btn-xs pull-right" ng-disabled="selectionCount < 1">Delete Selected</button>
5
+ <button ng-click="addStub()" class="btn btn-xs pull-right">Add Stub</button>
6
+ </div>
7
+ <div class="panel-body">
8
+ <table class="table table-striped">
9
+ <tr ng-repeat="stub in requestSpecs">
10
+ <td>{{stub.http_method}}</td>
11
+ <td>{{stub.url}}</td>
12
+ <td><button ng-click="editStub(stub)" class="btn btn-xs btn-default">Edit</button></td>
13
+ <td><button ng-click="deleteStub(stub)" class="btn btn-xs btn-danger">Delete</button></td>
14
+ <td><input type="checkbox" ng-model="stub.$isSelected" ng-change="updateSelection(stub)" /></td>
15
+ </tr>
16
+
17
+ </table>
18
+ </div>
19
+ </div>
@@ -0,0 +1,58 @@
1
+ <div class="modal-header text-center text-uppercase">Edit / Create Stub</div>
2
+ <div class="modal-body">
3
+ <div class="container-fluid">
4
+ <form name="editStubForm" class="form-horizontal" role="form" novalidate>
5
+ <div class="form-group">
6
+ <label app-for="httpMethod" class="col-xs-2">Method</label>
7
+ <div class="col-xs-3">
8
+ <select name="httpMethod" class="form-control" ng-model="stub.httpMethod" required>
9
+ <option value="GET">Get</option>
10
+ <option value="POST">Post</option>
11
+ <option value="UPDATE">Update</option>
12
+ <option value="DELETE">Delete</option>
13
+ </select>
14
+ </div>
15
+
16
+ </div>
17
+ <div class="form-group">
18
+ <label app-for="url" class="col-xs-2">URL</label>
19
+ <div class="col-xs-6">
20
+ <input name="url" class="form-control" type="url" ng-model="stub.url" required/>
21
+ </div>
22
+ <label app-for="urlType" class="col-xs-1">Match</label>
23
+ <div class="col-xs-3">
24
+ <select name="urlType" class="form-control" ng-model="stub.urlType">
25
+ <option value="url">Exact</option>
26
+ <option value="regex">Regex</option>
27
+ </select>
28
+ </div>
29
+
30
+ </div>
31
+ <div class="form-group">
32
+ <label app-for="conditions" class="col-xs-2">Conditions</label>
33
+ <div class="col-xs-10">
34
+ <textarea rows="3" class="form-control" ng-model="stub.conditions"></textarea>
35
+ </div>
36
+
37
+
38
+ </div>
39
+ <div class="form-group">
40
+ <label app-for="note" class="col-xs-2">Note</label>
41
+ <div class="col-xs-10">
42
+ <textarea name="note" class="form-control" ng-model="stub.note"></textarea>
43
+ </div>
44
+ </div>
45
+ <fieldset>
46
+ <legend>Response</legend>
47
+ <app-response-editor ng-model="stub.response"></app-response-editor>
48
+ </fieldset>
49
+ </form>
50
+ </div>
51
+
52
+ </div>
53
+ <div class="modal-footer">
54
+ <button ng-click="onCancel(stub)" class="btn btn-warning">Cancel</button>
55
+ <button ng-disabled="editStubForm.$invalid || editStubForm.$pristine" ng-click="onOk(stub)" class="btn btn-default">
56
+ OK
57
+ </button>
58
+ </div>
@@ -0,0 +1,3 @@
1
+ tr.selected {
2
+ background-color: cornflowerblue;
3
+ }
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'agile_proxy/cli'
3
+ AgileProxy::Cli.start(ARGV)
4
+ # AgileProxy::Server.new.start(false)
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "agile-proxy",
3
+ "version": "0.0.1",
4
+ "authors": [
5
+ "Gary Taylor <gary.taylor@hismessages.com>"
6
+ ],
7
+ "description": "Http Flexible Proxy",
8
+ "license": "MIT",
9
+ "private": true,
10
+ "ignore": [
11
+ "**/.*",
12
+ "node_modules",
13
+ "bower_components",
14
+ "test",
15
+ "tests"
16
+ ],
17
+ "dependencies": {
18
+ "angular": "~1.3.0",
19
+ "angular-bootstrap": "~0.11.2",
20
+ "bootstrap": "~3.2.0",
21
+ "angular-route": "~1.3.0",
22
+ "angular-resource": "~1.3.0",
23
+ "jquery": "~2.1.1",
24
+ "angular-restmod": "~1.1.3",
25
+ "angular-ui-ace": "~0.1.1"
26
+ }
27
+ }