tms_bridge 0.0.10
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 +15 -0
- data/.gitignore +18 -0
- data/.rvmrc +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +90 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/lib/iron_cacher.rb +33 -0
- data/lib/tms_bridge/controller_support.rb +135 -0
- data/lib/tms_bridge/model_support.rb +8 -0
- data/lib/tms_bridge/version.rb +3 -0
- data/lib/tms_bridge.rb +10 -0
- data/spec/iron_cacher_spec.rb +58 -0
- data/spec/tms_bridge/controller_support_spec.rb +271 -0
- data/spec/tms_bridge/mocks.rb +51 -0
- data/spec/tms_bridge/model_support_spec.rb +23 -0
- data/tms_bridge.gemspec +29 -0
- metadata +178 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
!binary "U0hBMQ==":
|
|
3
|
+
metadata.gz: !binary |-
|
|
4
|
+
NzM4YTZkNDI2MWFlM2VmMWI0NzBhNDIyNjhjNTllNWRkZDdhZDk4Zg==
|
|
5
|
+
data.tar.gz: !binary |-
|
|
6
|
+
MDIwODJkZDY5OWRlZDEzMzljNGI0ZDBiYTAyMDE0YzM1MTU2Mzc2Mg==
|
|
7
|
+
SHA512:
|
|
8
|
+
metadata.gz: !binary |-
|
|
9
|
+
YWRhYjc0YTMzMDEyMTJiOGQ2MDc1MWQ2YzJhNWMzODRmYTA3OWM4OTE4OWI3
|
|
10
|
+
NTNiNTYyYjAyYWFlOWYzNDI4NGE0YTViNWM2MTFhMDVjMTEyYjQ3NTBkMDUw
|
|
11
|
+
YzE2YjgxYjBkYzQzZDQ5MTUyNGMwNjllODZhMTBiNTk1OGZjMzU=
|
|
12
|
+
data.tar.gz: !binary |-
|
|
13
|
+
Y2I2MGYxODc5YmJiZjEzOWYzZDJhODE1ZTRmZjU5NjQ0ZTE4NTMzMTI1MzUz
|
|
14
|
+
ZWJhYzk0M2M0YzQ0ZWNhNmVhYWNkYmEwMzg2NTAzOTcyOGEyZjBkOTU4MjQ5
|
|
15
|
+
NGI5MmM1YmY2NTg2MDI1YTQ3MzUwZDAzNTJjZTBkZWZiMDNhNzQ=
|
data/.gitignore
ADDED
data/.rvmrc
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:$DYLD_LIBRARY_PATH"
|
|
2
|
+
export RUBYOPT=-Ku
|
|
3
|
+
export IRON_CACHE_TOKEN="6P0Hr8umXZruKzS3SbKF1vuu1E8"
|
|
4
|
+
export IRON_CACHE_PROJECT_ID="50a79df0a6498073e700560c"
|
|
5
|
+
export CC_BRIDGE_SALT="c7b5fae1-d719-4c8e-b92b-1c4c5e26ca10"
|
|
6
|
+
|
|
7
|
+
rvm --create use 1.9.3@tms.bridge > /dev/null
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
tms_bridge (0.0.9)
|
|
5
|
+
actionpack (>= 3.2.0)
|
|
6
|
+
activerecord (>= 3.2.0)
|
|
7
|
+
iron_cache
|
|
8
|
+
typhoeus
|
|
9
|
+
uuidtools
|
|
10
|
+
|
|
11
|
+
GEM
|
|
12
|
+
remote: https://rubygems.org/
|
|
13
|
+
specs:
|
|
14
|
+
actionpack (3.2.13)
|
|
15
|
+
activemodel (= 3.2.13)
|
|
16
|
+
activesupport (= 3.2.13)
|
|
17
|
+
builder (~> 3.0.0)
|
|
18
|
+
erubis (~> 2.7.0)
|
|
19
|
+
journey (~> 1.0.4)
|
|
20
|
+
rack (~> 1.4.5)
|
|
21
|
+
rack-cache (~> 1.2)
|
|
22
|
+
rack-test (~> 0.6.1)
|
|
23
|
+
sprockets (~> 2.2.1)
|
|
24
|
+
activemodel (3.2.13)
|
|
25
|
+
activesupport (= 3.2.13)
|
|
26
|
+
builder (~> 3.0.0)
|
|
27
|
+
activerecord (3.2.13)
|
|
28
|
+
activemodel (= 3.2.13)
|
|
29
|
+
activesupport (= 3.2.13)
|
|
30
|
+
arel (~> 3.0.2)
|
|
31
|
+
tzinfo (~> 0.3.29)
|
|
32
|
+
activesupport (3.2.13)
|
|
33
|
+
i18n (= 0.6.1)
|
|
34
|
+
multi_json (~> 1.0)
|
|
35
|
+
arel (3.0.2)
|
|
36
|
+
builder (3.0.4)
|
|
37
|
+
diff-lcs (1.2.4)
|
|
38
|
+
erubis (2.7.0)
|
|
39
|
+
ethon (0.5.12)
|
|
40
|
+
ffi (>= 1.3.0)
|
|
41
|
+
mime-types (~> 1.18)
|
|
42
|
+
ffi (1.8.1)
|
|
43
|
+
hike (1.2.3)
|
|
44
|
+
i18n (0.6.1)
|
|
45
|
+
iron_cache (1.4.0)
|
|
46
|
+
iron_core (>= 0.5.1)
|
|
47
|
+
iron_core (0.6.2)
|
|
48
|
+
rest (>= 2.2.0)
|
|
49
|
+
journey (1.0.4)
|
|
50
|
+
mime-types (1.23)
|
|
51
|
+
multi_json (1.7.6)
|
|
52
|
+
net-http-persistent (2.8)
|
|
53
|
+
rack (1.4.5)
|
|
54
|
+
rack-cache (1.2)
|
|
55
|
+
rack (>= 0.4)
|
|
56
|
+
rack-test (0.6.2)
|
|
57
|
+
rack (>= 1.0)
|
|
58
|
+
rake (10.0.4)
|
|
59
|
+
rest (2.6.2)
|
|
60
|
+
net-http-persistent
|
|
61
|
+
rest-client (>= 0.3.0)
|
|
62
|
+
rest-client (1.6.7)
|
|
63
|
+
mime-types (>= 1.16)
|
|
64
|
+
rspec (2.13.0)
|
|
65
|
+
rspec-core (~> 2.13.0)
|
|
66
|
+
rspec-expectations (~> 2.13.0)
|
|
67
|
+
rspec-mocks (~> 2.13.0)
|
|
68
|
+
rspec-core (2.13.1)
|
|
69
|
+
rspec-expectations (2.13.0)
|
|
70
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
|
71
|
+
rspec-mocks (2.13.1)
|
|
72
|
+
sprockets (2.2.2)
|
|
73
|
+
hike (~> 1.2)
|
|
74
|
+
multi_json (~> 1.0)
|
|
75
|
+
rack (~> 1.0)
|
|
76
|
+
tilt (~> 1.1, != 1.3.0)
|
|
77
|
+
tilt (1.4.1)
|
|
78
|
+
typhoeus (0.6.3)
|
|
79
|
+
ethon (~> 0.5.11)
|
|
80
|
+
tzinfo (0.3.37)
|
|
81
|
+
uuidtools (2.1.4)
|
|
82
|
+
|
|
83
|
+
PLATFORMS
|
|
84
|
+
ruby
|
|
85
|
+
|
|
86
|
+
DEPENDENCIES
|
|
87
|
+
bundler (~> 1.3)
|
|
88
|
+
rake
|
|
89
|
+
rspec (~> 2.6)
|
|
90
|
+
tms_bridge!
|
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Copyright (c) 2013 erichhorde
|
|
2
|
+
|
|
3
|
+
MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Bridge
|
|
2
|
+
|
|
3
|
+
TODO: Write a gem description
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Add this line to your application's Gemfile:
|
|
8
|
+
|
|
9
|
+
gem 'bridge'
|
|
10
|
+
|
|
11
|
+
And then execute:
|
|
12
|
+
|
|
13
|
+
$ bundle
|
|
14
|
+
|
|
15
|
+
Or install it yourself as:
|
|
16
|
+
|
|
17
|
+
$ gem install bridge
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
TODO: Write usage instructions here
|
|
22
|
+
|
|
23
|
+
## Contributing
|
|
24
|
+
|
|
25
|
+
1. Fork it
|
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
27
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/iron_cacher.rb
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'iron_cache'
|
|
2
|
+
require 'uuidtools'
|
|
3
|
+
|
|
4
|
+
module IronCacher
|
|
5
|
+
CACHE_NAME='bridge-troll'
|
|
6
|
+
DEFAULT_EXPIRES_IN = 60*5
|
|
7
|
+
def iron_cache_client
|
|
8
|
+
IronCache::Client.new(project_id: ENV['IRON_CACHE_PROJECT_ID'], token: ENV['IRON_CACHE_TOKEN'])
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def iron_cache(cache_name=CACHE_NAME)
|
|
12
|
+
iron_cache_client.cache(cache_name)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def add_to_cache(token, task_id, cache_name=CACHE_NAME)
|
|
16
|
+
iron_cache(cache_name).put(token, task_id, expires_in: IronCacher::DEFAULT_EXPIRES_IN)
|
|
17
|
+
token
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def retrieve_from_cache(token, cache_name=CACHE_NAME)
|
|
21
|
+
if item=iron_cache(cache_name).get(token)
|
|
22
|
+
return item.value
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def random_key_and_value(cache_name)
|
|
27
|
+
key = UUIDTools::UUID.random_create.to_s
|
|
28
|
+
value = UUIDTools::UUID.random_create.to_s
|
|
29
|
+
add_to_cache(key, value, cache_name)
|
|
30
|
+
|
|
31
|
+
return [key, value]
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
require 'iron_cacher'
|
|
2
|
+
module TmsBridge
|
|
3
|
+
module ControllerSupport
|
|
4
|
+
|
|
5
|
+
module Redact
|
|
6
|
+
def redacts_tms(as, _bridged_resource_names)
|
|
7
|
+
extend TmsBridge::ControllerSupport::Security unless (class << self; included_modules; end).include?(TmsBridge::ControllerSupport::Security)
|
|
8
|
+
self.secure_tms_bridge(as)
|
|
9
|
+
extend TmsBridge::ControllerSupport::Redact::ClassMethods unless (class << self; included_modules; end).include?(TmsBridge::ControllerSupport::Redact::ClassMethods)
|
|
10
|
+
include TmsBridge::ControllerSupport::Redact::InstanceMethods unless included_modules.include?(TmsBridge::ControllerSupport::Redact::InstanceMethods)
|
|
11
|
+
|
|
12
|
+
self.bridged_resource_names=_bridged_resource_names
|
|
13
|
+
|
|
14
|
+
class_eval <<-RUBY, __FILE__, __LINE__+1
|
|
15
|
+
def create
|
|
16
|
+
@record_class = self.bridged_resource_class
|
|
17
|
+
if @record_class
|
|
18
|
+
if @record = @record_class.find_by_tms_id(@json['tms_id'])
|
|
19
|
+
@record.destroy
|
|
20
|
+
end
|
|
21
|
+
render text: 'success'
|
|
22
|
+
else
|
|
23
|
+
head :ok
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
RUBY
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
module ClassMethods
|
|
30
|
+
def self.extended(base)
|
|
31
|
+
base.class_attribute(:bridged_resource_names)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
module InstanceMethods
|
|
37
|
+
def bridged_resource_class
|
|
38
|
+
class_name = @json['record_class']
|
|
39
|
+
eval(class_name) if self.class.bridged_resource_names.include?(class_name)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
module Publish
|
|
45
|
+
def publishes_tms(as, options={:update_only=>false})
|
|
46
|
+
extend TmsBridge::ControllerSupport::Security unless (class << self; included_modules; end).include?(TmsBridge::ControllerSupport::Security)
|
|
47
|
+
extend TmsBridge::ControllerSupport::Publish::ClassMethods unless (class << self; included_modules; end).include?(TmsBridge::ControllerSupport::Publish::ClassMethods)
|
|
48
|
+
include TmsBridge::ControllerSupport::Publish::InstanceMethods unless included_modules.include?(TmsBridge::ControllerSupport::Publish::InstanceMethods)
|
|
49
|
+
|
|
50
|
+
self.secure_tms_bridge(as)
|
|
51
|
+
class_name = self.bridged_resources.classify
|
|
52
|
+
|
|
53
|
+
self.update_only = options[:update_only]
|
|
54
|
+
class_eval <<-RUBY, __FILE__, __LINE__+1
|
|
55
|
+
def create
|
|
56
|
+
@#{self.bridged_resource} = #{class_name}.find_by_tms_id(@json['tms_id'])
|
|
57
|
+
|
|
58
|
+
@#{self.bridged_resource} = #{class_name}.new if @#{self.bridged_resource}.nil? && !self.update_only?
|
|
59
|
+
if @#{self.bridged_resource}
|
|
60
|
+
@#{self.bridged_resource}.attributes = @json['#{self.bridged_resource}'].slice(*#{class_name}.published_attribute_names)
|
|
61
|
+
@#{self.bridged_resource}.save(validate: false)
|
|
62
|
+
end
|
|
63
|
+
render text: 'success'
|
|
64
|
+
end
|
|
65
|
+
RUBY
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
module ClassMethods
|
|
71
|
+
def self.extended(base)
|
|
72
|
+
base.class_attribute :update_only
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
module InstanceMethods
|
|
77
|
+
def update_only?
|
|
78
|
+
self.class.update_only
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
module Security
|
|
85
|
+
|
|
86
|
+
def secure_tms_bridge(as)
|
|
87
|
+
include TmsBridge::ControllerSupport::Security::InstanceMethods
|
|
88
|
+
extend TmsBridge::ControllerSupport::Security::ClassMethods
|
|
89
|
+
self.as = as.to_s
|
|
90
|
+
self.bridged_resources = self.name.split('::').last.gsub(/Controller/, '').underscore
|
|
91
|
+
self.bridged_resource = self.bridged_resources.singularize
|
|
92
|
+
self.queue_name = self.as + '_'+self.bridged_resources
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
module InstanceMethods
|
|
96
|
+
include IronCacher
|
|
97
|
+
protected
|
|
98
|
+
def parse_iron_mq_json
|
|
99
|
+
@json=JSON.parse(request.raw_post) unless request.raw_post.blank?
|
|
100
|
+
unless @json && @json['tms_id']
|
|
101
|
+
head :ok
|
|
102
|
+
return false
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def valid_bridge_request?
|
|
107
|
+
if @json && @json['cache_key']
|
|
108
|
+
value = Digest::SHA2.hexdigest("---#{ENV['CC_BRIDGE_SALT']}--#{@json['tms_id']}--#{self.class.queue_name}--#{IronCacher::CACHE_NAME}--")
|
|
109
|
+
return value == retrieve_from_cache(@json['cache_key'], IronCacher::CACHE_NAME)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
module ClassMethods
|
|
116
|
+
def self.extended(base)
|
|
117
|
+
base.class_attribute(:queue_name)
|
|
118
|
+
base.class_attribute(:as)
|
|
119
|
+
base.class_attribute(:bridged_resource)
|
|
120
|
+
base.class_attribute(:bridged_resources)
|
|
121
|
+
|
|
122
|
+
base.before_filter :parse_iron_mq_json
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
ActionController::Base.send(:extend, TmsBridge::ControllerSupport::Publish)
|
|
135
|
+
ActionController::Base.send(:extend, TmsBridge::ControllerSupport::Redact)
|
data/lib/tms_bridge.rb
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'rspec'
|
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/iron_cacher')
|
|
3
|
+
|
|
4
|
+
describe IronCacher do
|
|
5
|
+
class MockIronCache
|
|
6
|
+
extend IronCacher
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe "iron_cache_client" do
|
|
10
|
+
it "return an iron cache client instance" do
|
|
11
|
+
MockIronCache.iron_cache_client.should be_is_a(IronCache::Client)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should use a separate config file from the iron.json" do
|
|
15
|
+
MockIronCache.iron_cache_client.project_id.should == ENV['IRON_CACHE_PROJECT_ID']
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe "iron_cache" do
|
|
21
|
+
it "return an iron cache instance" do
|
|
22
|
+
MockIronCache.iron_cache.should be_is_a(IronCache::Cache)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should should return the cache with the name of the as CACHE_NAME" do
|
|
26
|
+
MockIronCache.iron_cache.name.should == IronCacher::CACHE_NAME
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe "add_to_cache" do
|
|
31
|
+
before(:each) do
|
|
32
|
+
@key=Time.now.to_f.to_s
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should return the key" do
|
|
36
|
+
MockIronCache.add_to_cache(@key, 'value').should == @key
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "should add an expiry" do
|
|
40
|
+
MockIronCache.add_to_cache(@key, 'value')
|
|
41
|
+
expires = MockIronCache.iron_cache.get(@key)['expires']
|
|
42
|
+
DateTime.parse(expires).should < DateTime.parse('9999-01-01T00:00:00+00:00')
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe "random_key_and_value" do
|
|
48
|
+
it "should return an array" do
|
|
49
|
+
MockIronCache.random_key_and_value(IronCacher::CACHE_NAME).class.should == Array
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "should return the key as the first element and value in cache as the second" do
|
|
53
|
+
key,value = MockIronCache.random_key_and_value(IronCacher::CACHE_NAME)
|
|
54
|
+
MockIronCache.iron_cache.get(key).value.should == value
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
require 'rspec'
|
|
2
|
+
require 'tms_bridge'
|
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/mocks')
|
|
4
|
+
|
|
5
|
+
describe TmsBridge::ControllerSupport::Security do
|
|
6
|
+
include IronCacher
|
|
7
|
+
|
|
8
|
+
class SecuritiesController<MockController
|
|
9
|
+
extend TmsBridge::ControllerSupport::Security
|
|
10
|
+
secure_tms_bridge :some_client
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe "class attributes" do
|
|
14
|
+
it "should define and set 'as' " do
|
|
15
|
+
SecuritiesController.as.should == 'some_client'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should define and set 'bridged_resource' " do
|
|
19
|
+
SecuritiesController.bridged_resource.should == 'security'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should define and set 'bridged_resources' " do
|
|
23
|
+
SecuritiesController.bridged_resources.should == 'securities'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should define and set 'queue_name' " do
|
|
27
|
+
SecuritiesController.queue_name.should == 'some_client_securities'
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "should add :parse_iron_mq_json to the before_filters" do
|
|
31
|
+
SecuritiesController.before_filters.should include(:parse_iron_mq_json)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
describe "validate_bridge_request?" do
|
|
35
|
+
before(:each) do
|
|
36
|
+
@cache_key = 'cache_key'
|
|
37
|
+
@tms_id = Time.now.to_i
|
|
38
|
+
@digest = Digest::SHA2.hexdigest("---#{ENV['CC_BRIDGE_SALT']}--#{@tms_id}--some_client_securities--#{IronCacher::CACHE_NAME}--")
|
|
39
|
+
yield if block_given?
|
|
40
|
+
add_to_cache(@cache_key, @digest)
|
|
41
|
+
end
|
|
42
|
+
def controller
|
|
43
|
+
@controller ||= SecuritiesController.new
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "should do something " do
|
|
47
|
+
controller.json = {'cache_key'=>@cache_key, 'tms_id'=>@tms_id}
|
|
48
|
+
controller.should be_valid_bridge_request
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "should be false if the hash does not match" do
|
|
52
|
+
controller.json = {'cache_key'=>Digest::SHA2.hexdigest("---#{ENV['CC_BRIDGE_SALT']}--#{@tms_id}--does_not_match--#{IronCacher::CACHE_NAME}--"), 'tms_id'=>@tms_id}
|
|
53
|
+
controller.should_not be_valid_bridge_request
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should be false if the cache value is not found" do
|
|
57
|
+
iron_cache(IronCacher::CACHE_NAME).delete(@cache_key)
|
|
58
|
+
controller.should_not be_valid_bridge_request
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should be false if json is null" do
|
|
62
|
+
iron_cache(IronCacher::CACHE_NAME).delete(@cache_key)
|
|
63
|
+
controller.json = nil
|
|
64
|
+
controller.should_not be_valid_bridge_request
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "should be false if no cache_key was passed" do
|
|
68
|
+
iron_cache(IronCacher::CACHE_NAME).delete(@cache_key)
|
|
69
|
+
controller.json = {'tms_id'=>@tms_id}
|
|
70
|
+
controller.should_not be_valid_bridge_request
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
describe "parse_iron_mq_json" do
|
|
76
|
+
def controller
|
|
77
|
+
@controller ||= SecuritiesController.new
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "should set the json attribute and return nil" do
|
|
81
|
+
controller.request.raw_post=({tms_id: 17}.to_json)
|
|
82
|
+
controller.send(:parse_iron_mq_json).should be_nil
|
|
83
|
+
controller.json.class.should eq(Hash)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "should return false and call head with :ok, if tms_id is not present" do
|
|
87
|
+
controller.request.raw_post= nil
|
|
88
|
+
controller.should_receive(:head).with(:ok)
|
|
89
|
+
controller.send(:parse_iron_mq_json).should == false
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
describe TmsBridge::ControllerSupport::Redact do
|
|
97
|
+
include IronCacher
|
|
98
|
+
|
|
99
|
+
class MockRedactionsController<MockController
|
|
100
|
+
attr_reader :record, :record_class
|
|
101
|
+
extend TmsBridge::ControllerSupport::Redact
|
|
102
|
+
redacts_tms :some_client, %w{MockModel}
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def controller
|
|
106
|
+
@controller ||=MockRedactionsController.new
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
describe "modules" do
|
|
110
|
+
it "should extend security" do
|
|
111
|
+
(class << MockRedactionsController; included_modules; end).should include(TmsBridge::ControllerSupport::Security)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
describe "class_methods" do
|
|
116
|
+
it "should assign bridged_resources" do
|
|
117
|
+
MockRedactionsController.bridged_resource_names.should == %w{MockModel}
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
describe "instance_methods" do
|
|
122
|
+
describe "bridged_resource_class" do
|
|
123
|
+
|
|
124
|
+
it "should eval the string and return it if the json attribute record_class is in MockRedactionsController.bridged_resource_names" do
|
|
125
|
+
controller.json = {'record_class' => 'MockModel'}
|
|
126
|
+
controller.bridged_resource_class.should == MockModel
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it "should return nil if the json attribute a record_class is not in MockRedactionsController.bridged_resource_names" do
|
|
130
|
+
controller.json = {'record_class' => 'raise'}
|
|
131
|
+
controller.bridged_resource_class.should be_nil
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
describe "create" do
|
|
137
|
+
describe "bridged_resource_class return a class" do
|
|
138
|
+
before(:each) do
|
|
139
|
+
controller.json={'record_class'=>'MockModel', 'tms_id'=>MockModel::FOUND}
|
|
140
|
+
controller.stub(:bridged_resource_class).and_return(MockModel)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it "should call controller#bridged_resource_class" do
|
|
144
|
+
controller.should_receive(:bridged_resource_class)
|
|
145
|
+
controller.create
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it "should assign to record class" do
|
|
149
|
+
controller.create
|
|
150
|
+
controller.record_class.should == MockModel
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
it "should call MockModel.find_by_tms_id" do
|
|
154
|
+
MockModel.should_receive(:find_by_tms_id).with(MockModel::FOUND)
|
|
155
|
+
controller.create
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
it "should assign to record if found" do
|
|
159
|
+
controller.create
|
|
160
|
+
controller.record.should be_is_a(FoundMockPublishing)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
it "should call destroy on the found record" do
|
|
164
|
+
controller.create
|
|
165
|
+
controller.record.called_destroy.should == true
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
it "should call render" do
|
|
169
|
+
controller.should_receive(:render).with(text: 'success')
|
|
170
|
+
controller.create
|
|
171
|
+
end
|
|
172
|
+
it "should not throw an error if the record is not found" do
|
|
173
|
+
controller.json={'record_class'=>'MockModel', 'tms_id'=>MockModel::NOT_FOUND}
|
|
174
|
+
controller.record.should be_nil
|
|
175
|
+
controller.should_receive(:render).with(text: 'success')
|
|
176
|
+
controller.create
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
describe "if an invalid record class is passed" do
|
|
181
|
+
|
|
182
|
+
before(:each) do
|
|
183
|
+
controller.stub(:bridged_resource_class).and_return(nil)
|
|
184
|
+
end
|
|
185
|
+
it "should call head :ok and" do
|
|
186
|
+
controller.should_receive(:head).with(:ok)
|
|
187
|
+
controller.create
|
|
188
|
+
controller.record.should be_nil
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
describe TmsBridge::ControllerSupport::Publish do
|
|
194
|
+
|
|
195
|
+
class MockPublishingsController<MockController
|
|
196
|
+
attr_reader :mock_publishing
|
|
197
|
+
|
|
198
|
+
extend TmsBridge::ControllerSupport::Publish
|
|
199
|
+
publishes_tms :some_client
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def controller
|
|
203
|
+
@controller ||= MockPublishingsController.new
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
describe "modules" do
|
|
207
|
+
it "should extend security" do
|
|
208
|
+
(class << MockPublishingsController; included_modules; end).should include(TmsBridge::ControllerSupport::Security)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
it "should support update_only?" do
|
|
212
|
+
controller.update_only?.should == controller.class.update_only
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
describe "create" do
|
|
217
|
+
before(:each) do
|
|
218
|
+
@attributes = {'some_key'=>'some value'}
|
|
219
|
+
@tms_id = MockPublishing::NOT_FOUND
|
|
220
|
+
controller.json = {'mock_publishing'=>@attributes, 'tms_id'=>@tms_id}
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
it "should assign to the mock_publishing attribute" do
|
|
224
|
+
controller.create
|
|
225
|
+
controller.mock_publishing.should_not be_nil
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
it "should assign to attributes" do
|
|
229
|
+
controller.create
|
|
230
|
+
controller.mock_publishing.attributes.should == @attributes
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
it "it should call MockPublishing.find_by_tms_id" do
|
|
234
|
+
MockPublishing.should_receive(:find_by_tms_id).with(@tms_id)
|
|
235
|
+
controller.create
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
it "it should call MockPublishing.new if MockPublishing.find_by_tms_id returns nil" do
|
|
239
|
+
MockPublishing.should_receive(:new)
|
|
240
|
+
controller.create
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
it "should not pass attributes to the mock model taht are not supported" do
|
|
244
|
+
puts MockPublishing.published_attribute_names
|
|
245
|
+
MockPublishing.should_receive(:published_attribute_names){['some_key']}
|
|
246
|
+
controller.create
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
it "it should call MockPublishing.new if MockPublishing.find_by_tms_id returns nothing" do
|
|
250
|
+
controller.json = {'mock_publishing'=>@attributes, 'tms_id'=>MockPublishing::NOT_FOUND}
|
|
251
|
+
MockPublishing.should_receive(:new)
|
|
252
|
+
controller.create
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
it "it should call MockPublishing.new if MockPublishing.find_by_tms_id returns nothing and update_only? == true" do
|
|
256
|
+
controller.json = {'mock_publishing'=>@attributes, 'tms_id'=>MockPublishing::NOT_FOUND}
|
|
257
|
+
MockPublishing.should_not_receive(:new)
|
|
258
|
+
controller.stub(:update_only?){true}
|
|
259
|
+
controller.create
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
it "should call save on the mock_publishing model" do
|
|
263
|
+
controller.create
|
|
264
|
+
controller.mock_publishing.called_save.should == true
|
|
265
|
+
end
|
|
266
|
+
it "should call render " do
|
|
267
|
+
controller.should_receive(:render).with(text: 'success')
|
|
268
|
+
controller.create
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
class MockModel
|
|
2
|
+
attr_accessor :attributes, :called_save, :called_destroy
|
|
3
|
+
|
|
4
|
+
extend TmsBridge::ModelSupport
|
|
5
|
+
NOT_FOUND=false
|
|
6
|
+
FOUND=true
|
|
7
|
+
|
|
8
|
+
def self.column_names
|
|
9
|
+
['updated_at', 'created_at', 'id', 'some_key']
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def save(*args)
|
|
13
|
+
self.called_save = true
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def destroy
|
|
17
|
+
self.called_destroy = true
|
|
18
|
+
end
|
|
19
|
+
def self.find_by_tms_id(tms_id)
|
|
20
|
+
return tms_id == FOUND ? FoundMockPublishing.new : nil
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class MockPublishing<MockModel
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class FoundMockPublishing<MockModel
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class MockController
|
|
31
|
+
cattr_accessor :before_filters
|
|
32
|
+
attr_accessor :json
|
|
33
|
+
attr_reader :request
|
|
34
|
+
|
|
35
|
+
def self.before_filter(filter)
|
|
36
|
+
@@before_filters ||= []
|
|
37
|
+
@@before_filters << filter
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def initialize
|
|
41
|
+
@request = MockRequest.new
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def head(*args);end
|
|
45
|
+
def render(*args);end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
class MockRequest
|
|
50
|
+
attr_accessor :raw_post
|
|
51
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'rspec'
|
|
2
|
+
require 'tms_bridge'
|
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/mocks')
|
|
4
|
+
|
|
5
|
+
describe TmsBridge::ModelSupport do
|
|
6
|
+
describe "published_attributes" do
|
|
7
|
+
it "should not include 'id'" do
|
|
8
|
+
MockModel.published_attribute_names.should_not include('id')
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should not include 'created_at'" do
|
|
12
|
+
MockModel.published_attribute_names.should_not include('created_at')
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should not include 'updated_at" do
|
|
16
|
+
MockModel.published_attribute_names.should_not include('updated_at')
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "should include items declared in column_names" do
|
|
20
|
+
MockModel.published_attribute_names.should include('some_key')
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
data/tms_bridge.gemspec
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'tms_bridge/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = "tms_bridge"
|
|
8
|
+
spec.version = Bridge::VERSION
|
|
9
|
+
spec.authors = ["Erich Timkar"]
|
|
10
|
+
spec.email = ["erich@teamdriveaway.com"]
|
|
11
|
+
spec.description = %q{Provides parsing and authtentication for publishing into TMS client apps. }
|
|
12
|
+
spec.summary = ''
|
|
13
|
+
spec.homepage = ""
|
|
14
|
+
spec.license = "MIT"
|
|
15
|
+
|
|
16
|
+
spec.files = `git ls-files`.split($/)
|
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
|
+
spec.require_paths = ["lib"]
|
|
20
|
+
|
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
|
22
|
+
spec.add_development_dependency "rake"
|
|
23
|
+
spec.add_development_dependency "rspec", "~> 2.6"
|
|
24
|
+
spec.add_dependency "actionpack", ">= 3.2.0"
|
|
25
|
+
spec.add_dependency "activerecord", ">= 3.2.0"
|
|
26
|
+
spec.add_dependency "uuidtools"
|
|
27
|
+
spec.add_dependency "iron_cache"
|
|
28
|
+
spec.add_dependency "typhoeus"
|
|
29
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: tms_bridge
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.10
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Erich Timkar
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2013-11-19 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: bundler
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ~>
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '1.3'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ~>
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '1.3'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ! '>='
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :development
|
|
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: rspec
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ~>
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '2.6'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ~>
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '2.6'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: actionpack
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ! '>='
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 3.2.0
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ! '>='
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 3.2.0
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: activerecord
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - ! '>='
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: 3.2.0
|
|
76
|
+
type: :runtime
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ! '>='
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: 3.2.0
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: uuidtools
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - ! '>='
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0'
|
|
90
|
+
type: :runtime
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - ! '>='
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: iron_cache
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - ! '>='
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '0'
|
|
104
|
+
type: :runtime
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - ! '>='
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0'
|
|
111
|
+
- !ruby/object:Gem::Dependency
|
|
112
|
+
name: typhoeus
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - ! '>='
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '0'
|
|
118
|
+
type: :runtime
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - ! '>='
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '0'
|
|
125
|
+
description: ! 'Provides parsing and authtentication for publishing into TMS client
|
|
126
|
+
apps. '
|
|
127
|
+
email:
|
|
128
|
+
- erich@teamdriveaway.com
|
|
129
|
+
executables: []
|
|
130
|
+
extensions: []
|
|
131
|
+
extra_rdoc_files: []
|
|
132
|
+
files:
|
|
133
|
+
- .gitignore
|
|
134
|
+
- .rvmrc
|
|
135
|
+
- Gemfile
|
|
136
|
+
- Gemfile.lock
|
|
137
|
+
- LICENSE.txt
|
|
138
|
+
- README.md
|
|
139
|
+
- Rakefile
|
|
140
|
+
- lib/iron_cacher.rb
|
|
141
|
+
- lib/tms_bridge.rb
|
|
142
|
+
- lib/tms_bridge/controller_support.rb
|
|
143
|
+
- lib/tms_bridge/model_support.rb
|
|
144
|
+
- lib/tms_bridge/version.rb
|
|
145
|
+
- spec/iron_cacher_spec.rb
|
|
146
|
+
- spec/tms_bridge/controller_support_spec.rb
|
|
147
|
+
- spec/tms_bridge/mocks.rb
|
|
148
|
+
- spec/tms_bridge/model_support_spec.rb
|
|
149
|
+
- tms_bridge.gemspec
|
|
150
|
+
homepage: ''
|
|
151
|
+
licenses:
|
|
152
|
+
- MIT
|
|
153
|
+
metadata: {}
|
|
154
|
+
post_install_message:
|
|
155
|
+
rdoc_options: []
|
|
156
|
+
require_paths:
|
|
157
|
+
- lib
|
|
158
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
159
|
+
requirements:
|
|
160
|
+
- - ! '>='
|
|
161
|
+
- !ruby/object:Gem::Version
|
|
162
|
+
version: '0'
|
|
163
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
|
+
requirements:
|
|
165
|
+
- - ! '>='
|
|
166
|
+
- !ruby/object:Gem::Version
|
|
167
|
+
version: '0'
|
|
168
|
+
requirements: []
|
|
169
|
+
rubyforge_project:
|
|
170
|
+
rubygems_version: 2.1.9
|
|
171
|
+
signing_key:
|
|
172
|
+
specification_version: 4
|
|
173
|
+
summary: ''
|
|
174
|
+
test_files:
|
|
175
|
+
- spec/iron_cacher_spec.rb
|
|
176
|
+
- spec/tms_bridge/controller_support_spec.rb
|
|
177
|
+
- spec/tms_bridge/mocks.rb
|
|
178
|
+
- spec/tms_bridge/model_support_spec.rb
|