ocean-rails 7.0.5 → 7.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/initializers/_aws_config.rb +1 -1
- data/config/initializers/_ocean_constants.rb +8 -8
- data/config/initializers/{_zeromq_logger.rb → _ocean_logger.rb} +5 -5
- data/lib/generators/ocean_setup/templates/config.yml.example +1 -14
- data/lib/ocean-rails.rb +16 -18
- data/lib/ocean/ocean_logger.rb +114 -0
- data/lib/ocean/selective_rack_logger.rb +2 -0
- data/lib/ocean/version.rb +1 -1
- metadata +25 -48
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d602214f6705ec4f0af21ed3adcc1ce63de746e
|
4
|
+
data.tar.gz: e99a2a9a8d7484a8da4b3dc7e52bddb5e65838df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67ca3ce19054513e77fb2697668bc659a8813ddc90955573802e9ffff443c6266554701e86fe7116b268c396e35dc157730525e8d10c2c896eeacb41f9be8c5f
|
7
|
+
data.tar.gz: c19110d878f51a4fd403734ea90fe680a79181ff4aecec25718cf8f7f65e1e19a16bc9762ebac8b38edbc015a57efdd04170721d1b3391f61f9bac836aaece9b
|
@@ -13,7 +13,7 @@ else
|
|
13
13
|
|
14
14
|
# This is the tailored file, not under source control.
|
15
15
|
f = File.join(Rails.root, "config/aws.yml")
|
16
|
-
|
16
|
+
|
17
17
|
# If the tailored file doesn't exist, and we're running in test mode
|
18
18
|
# (which is the case under TeamCity), use the example file as-is.
|
19
19
|
unless File.exists?(f)
|
@@ -3,16 +3,16 @@
|
|
3
3
|
# YOU SHOULD NEVER CHANGE THE CONTENTS OF THIS FILE.
|
4
4
|
#
|
5
5
|
# Backend developers should never need to override the value here.
|
6
|
-
# The reason for this is that when developing services locally,
|
7
|
-
# their tests run in isolation with all external calls mocked away,
|
8
|
-
# and thus it doesn't matter what URLs a service generates when
|
6
|
+
# The reason for this is that when developing services locally,
|
7
|
+
# their tests run in isolation with all external calls mocked away,
|
8
|
+
# and thus it doesn't matter what URLs a service generates when
|
9
9
|
# running tests locally on a developer's machine.
|
10
10
|
#
|
11
11
|
# If you're a frontend developer, however, the point of your testing
|
12
|
-
# is to exercise
|
12
|
+
# is to exercise multiple services and thus you need access to a
|
13
13
|
# complete and fully functional system (which might or might not
|
14
14
|
# make calls to partners' systems, such as for hotel bookings).
|
15
|
-
#
|
15
|
+
#
|
16
16
|
# Thus, if you are a frontend developer, you override the string
|
17
17
|
# constant here to reflect the Ocean environment (dev, staging)
|
18
18
|
# you wish to run your local tests against by defining the environment
|
@@ -21,11 +21,11 @@
|
|
21
21
|
|
22
22
|
BASE_DOMAIN = "example.com" unless defined?(BASE_DOMAIN) # For the Rails template generator
|
23
23
|
|
24
|
-
OCEAN_API_HOST = (ENV['OCEAN_API_HOST'] ||
|
25
|
-
(Rails.env == 'test' && "forbidden.#{BASE_DOMAIN}") ||
|
24
|
+
OCEAN_API_HOST = (ENV['OCEAN_API_HOST'] ||
|
25
|
+
(Rails.env == 'test' && "forbidden.#{BASE_DOMAIN}") ||
|
26
26
|
"dev-api.#{BASE_DOMAIN}"
|
27
27
|
).sub("<default>", "dev")
|
28
|
-
|
28
|
+
|
29
29
|
OCEAN_API_URL = "https://#{OCEAN_API_HOST}"
|
30
30
|
|
31
31
|
INTERNAL_OCEAN_API_URL = OCEAN_API_URL.sub("https://", "http://")
|
@@ -1,4 +1,4 @@
|
|
1
|
-
if Rails.env == 'production'
|
1
|
+
if false # Rails.env == 'production'
|
2
2
|
|
3
3
|
def remove_existing_log_subscriptions
|
4
4
|
ActiveSupport::LogSubscriber.log_subscribers.each do |subscriber|
|
@@ -84,10 +84,10 @@ if Rails.env == 'production' && ENV['NO_ZEROMQ_LOGGING'].blank?
|
|
84
84
|
data[:remote_ip] = request.remote_ip
|
85
85
|
data[:path] = request.filtered_path
|
86
86
|
|
87
|
-
if (ac = request.env["action_controller.instance"]) &&
|
88
|
-
(response = ac.response) &&
|
87
|
+
if (ac = request.env["action_controller.instance"]) &&
|
88
|
+
(response = ac.response) &&
|
89
89
|
(body = response.body) &&
|
90
|
-
body.present? &&
|
90
|
+
body.present? &&
|
91
91
|
body =~ /\A\{"_api_error"/
|
92
92
|
data[:_api_error] = JSON.parse(body)['_api_error']
|
93
93
|
end
|
@@ -97,7 +97,7 @@ if Rails.env == 'production' && ENV['NO_ZEROMQ_LOGGING'].blank?
|
|
97
97
|
end
|
98
98
|
|
99
99
|
ex = request.env["action_dispatch.exception"]
|
100
|
-
if ex
|
100
|
+
if ex
|
101
101
|
if data[:status] == 404
|
102
102
|
data[:path] = request.env["REQUEST_PATH"]
|
103
103
|
else
|
@@ -3,7 +3,7 @@
|
|
3
3
|
# You can use this file as a template: simply copy it, rename it and tailor its
|
4
4
|
# contents. All data in this file will be used to define constants in your application
|
5
5
|
# namespace. Please note that both config.yml and config.yml.example must exist.
|
6
|
-
#
|
6
|
+
#
|
7
7
|
# Any constants declared here can be overridden by corresponding environment variables
|
8
8
|
# starting with OVERRIDE_. Thus, BASE_DOMAIN can be overridden by the environment
|
9
9
|
# variable OVERRIDE_BASE_DOMAIN, and so forth. The API_PASSWORD receives special
|
@@ -32,12 +32,6 @@ BASE_DOMAIN: example.com
|
|
32
32
|
API_VERSIONS:
|
33
33
|
_default: v1
|
34
34
|
|
35
|
-
# This is the list of IP numbers for the Varnish instances. (For PURGE and BAN.)
|
36
|
-
LOAD_BALANCERS: []
|
37
|
-
|
38
|
-
# This is the list of IP numbers for the ZeroMQ log hosts. (Only used in production.)
|
39
|
-
LOG_HOSTS: []
|
40
|
-
|
41
35
|
# The Ocean environment
|
42
36
|
OCEAN_ENV: master
|
43
37
|
|
@@ -58,10 +52,3 @@ test:
|
|
58
52
|
|
59
53
|
|
60
54
|
production:
|
61
|
-
LOAD_BALANCERS:
|
62
|
-
- 1.1.1.1
|
63
|
-
- 2.2.2.2
|
64
|
-
|
65
|
-
LOG_HOSTS:
|
66
|
-
- 3.3.3.3
|
67
|
-
- 4.4.4.4
|
data/lib/ocean-rails.rb
CHANGED
@@ -7,11 +7,9 @@ require "ocean/ocean_resource_model" if defined? ActiveRecord || defined? OceanD
|
|
7
7
|
require "ocean/ocean_resource_controller" if defined? ActionController
|
8
8
|
require "ocean/ocean_application_controller"
|
9
9
|
|
10
|
-
if ENV['RAILS_ENV'] == "production"
|
11
|
-
require "ocean/
|
12
|
-
|
13
|
-
require "ocean/selective_rack_logger"
|
14
|
-
end
|
10
|
+
#if ENV['RAILS_ENV'] == "production"
|
11
|
+
# require "ocean/selective_rack_logger"
|
12
|
+
#end
|
15
13
|
|
16
14
|
require "ocean/api_remote_resource"
|
17
15
|
|
@@ -26,16 +24,16 @@ UUID_REGEX = /([0-9a-f]+-){4}[0-9a-f]+/
|
|
26
24
|
|
27
25
|
module Ocean
|
28
26
|
|
29
|
-
if ENV['RAILS_ENV'] == "production"
|
27
|
+
if ENV['RAILS_ENV'] == "production"
|
30
28
|
class Railtie < Rails::Railtie
|
31
29
|
# Silence the /alive action
|
32
|
-
initializer "ocean.swap_logging_middleware" do |app|
|
33
|
-
|
34
|
-
end
|
30
|
+
#initializer "ocean.swap_logging_middleware" do |app|
|
31
|
+
# app.middleware.swap Rails::Rack::Logger, SelectiveRackLogger
|
32
|
+
#end
|
35
33
|
# Make sure the generators use the gem's templates first
|
36
34
|
config.app_generators do |g|
|
37
35
|
g.templates.unshift File::expand_path('../templates', __FILE__)
|
38
|
-
end
|
36
|
+
end
|
39
37
|
end
|
40
38
|
end
|
41
39
|
|
@@ -44,15 +42,15 @@ end
|
|
44
42
|
|
45
43
|
#
|
46
44
|
# For stubbing successful authorisation calls. Makes <tt>Api.permitted?</tt> return
|
47
|
-
# the status, and a body containing a partial authentication containing the +user_id+
|
45
|
+
# the status, and a body containing a partial authentication containing the +user_id+
|
48
46
|
# and +creator_uri+ given by the parameters. It also allows the value of 'right' to
|
49
47
|
# be specified: this will restrict all SQL queries accordingly.
|
50
48
|
#
|
51
49
|
def permit_with(status, user_id: "1-2-3-4-5", creator_uri: "https://api.example.com/v1/api_users/#{user_id}",
|
52
50
|
right: nil, group_names: [])
|
53
51
|
allow(Api).to receive(:permitted?).
|
54
|
-
and_return(double(:status => status,
|
55
|
-
:body => {'authentication' =>
|
52
|
+
and_return(double(:status => status,
|
53
|
+
:body => {'authentication' =>
|
56
54
|
{'right' => right,
|
57
55
|
'group_names' => group_names,
|
58
56
|
'_links' => { 'creator' => {'href' => creator_uri,
|
@@ -66,7 +64,7 @@ end
|
|
66
64
|
#
|
67
65
|
def deny_with(status, *error_messages)
|
68
66
|
allow(Api).to receive(:permitted?).
|
69
|
-
and_return(double(:status => status,
|
67
|
+
and_return(double(:status => status,
|
70
68
|
:body => {'_api_error' => error_messages}))
|
71
69
|
end
|
72
70
|
|
@@ -113,8 +111,8 @@ def hyperlinks(links={})
|
|
113
111
|
result = {}
|
114
112
|
links.each do |qi, val|
|
115
113
|
next unless val.present?
|
116
|
-
result[qi.to_s] = {
|
117
|
-
"href" => val.kind_of?(String) ? val : val[:href],
|
114
|
+
result[qi.to_s] = {
|
115
|
+
"href" => val.kind_of?(String) ? val : val[:href],
|
118
116
|
"type" => val.kind_of?(String) ? "application/json" : val[:type]
|
119
117
|
}
|
120
118
|
end
|
@@ -142,11 +140,11 @@ end
|
|
142
140
|
# authorisation belongs to one or more of a list of Groups.
|
143
141
|
#
|
144
142
|
def member_of_group?(*names)
|
145
|
-
@group_names && @group_names.intersect?(names.to_set)
|
143
|
+
@group_names && @group_names.intersect?(names.to_set)
|
146
144
|
end
|
147
145
|
|
148
146
|
#
|
149
|
-
# Returns true if the ApiUser behind the current authorisation belongs
|
147
|
+
# Returns true if the ApiUser behind the current authorisation belongs
|
150
148
|
# to the Ocean Group "Superusers".
|
151
149
|
#
|
152
150
|
def superuser?
|
@@ -0,0 +1,114 @@
|
|
1
|
+
#
|
2
|
+
# This class is a drop-in replacement for the standard Rails logger. It
|
3
|
+
# implements enough of the Logger interface to allow it to override the
|
4
|
+
# standard logger.
|
5
|
+
#
|
6
|
+
class OceanLogger
|
7
|
+
|
8
|
+
attr_accessor :level, :formatter
|
9
|
+
|
10
|
+
#
|
11
|
+
# Obtains the IP of the current process, initialises the @logger object
|
12
|
+
# by instantiating a ZeroLog object which then is used to set up the
|
13
|
+
# log data sender.
|
14
|
+
#
|
15
|
+
def initialize
|
16
|
+
super
|
17
|
+
# Get info about our environment
|
18
|
+
@ip = Socket.ip_address_list.detect{|intf| intf.ipv4_private?}.getnameinfo[0]
|
19
|
+
# Set up the logger
|
20
|
+
@logger = ZeroLog.new "/tmp/sub_push_#{Process.pid}", @log_hosts
|
21
|
+
@formatter = ::Logger::Formatter.new
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# Utility function which returns true if the current log level is +DEBUG+ or lower.
|
26
|
+
#
|
27
|
+
def debug?() @level <= 0; end
|
28
|
+
|
29
|
+
#
|
30
|
+
# Utility function which returns true if the current log level is +INFO+ or lower.
|
31
|
+
#
|
32
|
+
def info?() @level <= 1; end
|
33
|
+
|
34
|
+
#
|
35
|
+
# Utility function which returns true if the current log level is +WARN+ or lower.
|
36
|
+
#
|
37
|
+
def warn?() @level <= 2; end
|
38
|
+
|
39
|
+
#
|
40
|
+
# Utility function which returns true if the current log level is +ERROR+ or lower.
|
41
|
+
#
|
42
|
+
def error?() @level <= 3; end
|
43
|
+
|
44
|
+
#
|
45
|
+
# Utility function which returns true if the current log level is +FATAL+ or lower.
|
46
|
+
#
|
47
|
+
def fatal?() @level <= 4; end
|
48
|
+
|
49
|
+
|
50
|
+
#
|
51
|
+
# This is the core method to add new log messages to the Rails log. It does nothing
|
52
|
+
# if the level of the message is lower than the current log level, or if the message
|
53
|
+
# is blank. Otherwise it creates a JSON log message as a hash, with data for the
|
54
|
+
# following keys:
|
55
|
+
#
|
56
|
+
# +timestamp+: The time in milliseconds since the start of the Unix epoch.
|
57
|
+
#
|
58
|
+
# +ip+: The IP of the logging entity.
|
59
|
+
#
|
60
|
+
# +pid+: The Process ID of the logging process.
|
61
|
+
#
|
62
|
+
# +service+: The name of the service.
|
63
|
+
#
|
64
|
+
# +level+: The log level of the message (0=debug, 1=info, 2=warn, etc).
|
65
|
+
#
|
66
|
+
# +msg+: The log message itself.
|
67
|
+
#
|
68
|
+
def add(level, msg)
|
69
|
+
return true if level < @level
|
70
|
+
return true if msg.blank?
|
71
|
+
# Compensate for bug in Rails 4.2.x
|
72
|
+
return true if msg =~ /Couldn't find template for digesting/
|
73
|
+
data = { ip: @ip,
|
74
|
+
pid: Process.pid,
|
75
|
+
service: APP_NAME,
|
76
|
+
level: level
|
77
|
+
}
|
78
|
+
data[:token] = Thread.current[:x_api_token] if Thread.current[:x_api_token].present?
|
79
|
+
data[:username] = Thread.current[:username] if Thread.current[:username].present?
|
80
|
+
data[:msg] = msg if msg.is_a?(String)
|
81
|
+
data[:timestamp] = (Time.now.utc.to_f * 1000).to_i unless data[:timestamp]
|
82
|
+
data[:metadata] = Thread.current[:metadata] if Thread.current[:metadata].present?
|
83
|
+
data = data.merge msg if msg.is_a?(Hash)
|
84
|
+
@logger.log data
|
85
|
+
true
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
def debug(*args)
|
90
|
+
return if args.blank?
|
91
|
+
add 0, *args
|
92
|
+
end
|
93
|
+
|
94
|
+
def info(*args)
|
95
|
+
return if args.blank?
|
96
|
+
add 1, *args
|
97
|
+
end
|
98
|
+
|
99
|
+
def warn(*args)
|
100
|
+
return if args.blank?
|
101
|
+
add 2, *args
|
102
|
+
end
|
103
|
+
|
104
|
+
def error(*args)
|
105
|
+
return if args.blank?
|
106
|
+
add 3, *args
|
107
|
+
end
|
108
|
+
|
109
|
+
def fatal(*args)
|
110
|
+
return if args.blank?
|
111
|
+
add 4, *args
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
data/lib/ocean/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ocean-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.0.
|
4
|
+
version: 7.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Bengtson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: typhoeus
|
@@ -24,34 +24,6 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: ffi
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: ffi-rzmq
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
27
|
- !ruby/object:Gem::Dependency
|
56
28
|
name: rack-attack
|
57
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,23 +164,27 @@ dependencies:
|
|
192
164
|
- - "~>"
|
193
165
|
- !ruby/object:Gem::Version
|
194
166
|
version: '4.0'
|
195
|
-
description:
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
is
|
167
|
+
description: |-
|
168
|
+
== Ocean
|
169
|
+
|
170
|
+
Ocean is an architecture for creating server-oriented architectures (SOAs) in the cloud.
|
171
|
+
It consists of two separate parts which can be used separately or in conjunction: Ocean and OceanFront.
|
172
|
+
|
173
|
+
Ocean is a complete and very scalable back end solution for RESTful JSON web services and web applications,
|
174
|
+
featuring aggressive caching and full HTTP client abstraction. Ocean fully implements HATEOAS principles,
|
175
|
+
allowing the programming object model to move fully out onto the net, while maintaining a very high degree
|
176
|
+
of decoupling.
|
177
|
+
|
178
|
+
Ocean is also a development, staging and deployment pipeline featuring continuous integration and testing in a
|
179
|
+
TDD and/or BDD environment. Ocean can be used for continuous deployment or for scheduled releases. Front end tests
|
180
|
+
are run in parallel using a matrix of operating systems and browser types. The pipeline can very easily be extended
|
181
|
+
with new development branches and quality assurance environments with automatic testing and deployment.
|
182
|
+
|
183
|
+
OceanFront is a cross-platform Javascript front end browser client library supporting all major browsers and
|
184
|
+
platforms. OceanFront is object oriented, widget-based and HTML-less.
|
185
|
+
|
186
|
+
Together, Ocean and OceanFront allow you to write front end code completely independent of browser type and client
|
187
|
+
OS, and back end code completely agnostic of whether it is called by a client browser or another server system.
|
212
188
|
email:
|
213
189
|
- peter@peterbengtson.com
|
214
190
|
executables: []
|
@@ -223,7 +199,7 @@ files:
|
|
223
199
|
- config/initializers/_api_constants.rb
|
224
200
|
- config/initializers/_aws_config.rb
|
225
201
|
- config/initializers/_ocean_constants.rb
|
226
|
-
- config/initializers/
|
202
|
+
- config/initializers/_ocean_logger.rb
|
227
203
|
- config/routes.rb
|
228
204
|
- lib/generators/ocean_scaffold/USAGE
|
229
205
|
- lib/generators/ocean_scaffold/ocean_scaffold_generator.rb
|
@@ -265,6 +241,7 @@ files:
|
|
265
241
|
- lib/ocean/api_resource.rb
|
266
242
|
- lib/ocean/engine.rb
|
267
243
|
- lib/ocean/ocean_application_controller.rb
|
244
|
+
- lib/ocean/ocean_logger.rb
|
268
245
|
- lib/ocean/ocean_resource_controller.rb
|
269
246
|
- lib/ocean/ocean_resource_model.rb
|
270
247
|
- lib/ocean/selective_rack_logger.rb
|