test_machine_shop 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/.idea/.name +1 -0
  3. data/.idea/.rakeTasks +7 -0
  4. data/.idea/compiler.xml +23 -0
  5. data/.idea/copyright/profiles_settings.xml +5 -0
  6. data/.idea/encodings.xml +5 -0
  7. data/.idea/inspectionProfiles/Project_Default.xml +7 -0
  8. data/.idea/inspectionProfiles/profiles_settings.xml +7 -0
  9. data/.idea/machineshop.iml +194 -0
  10. data/.idea/misc.xml +5 -0
  11. data/.idea/modules.xml +9 -0
  12. data/.idea/scopes/scope_settings.xml +5 -0
  13. data/.idea/vcs.xml +7 -0
  14. data/.idea/workspace.xml +722 -0
  15. data/Gemfile +9 -0
  16. data/LICENSE +22 -0
  17. data/README.md +977 -0
  18. data/Rakefile +8 -0
  19. data/doc.txt +50 -0
  20. data/lib/machineshop.rb +475 -0
  21. data/lib/machineshop/api_operations/create.rb +17 -0
  22. data/lib/machineshop/api_operations/delete.rb +11 -0
  23. data/lib/machineshop/api_operations/list.rb +16 -0
  24. data/lib/machineshop/api_operations/update.rb +11 -0
  25. data/lib/machineshop/api_resource.rb +35 -0
  26. data/lib/machineshop/configuration.rb +14 -0
  27. data/lib/machineshop/customer.rb +15 -0
  28. data/lib/machineshop/data_source_types.rb +28 -0
  29. data/lib/machineshop/data_sources.rb +35 -0
  30. data/lib/machineshop/database.rb +59 -0
  31. data/lib/machineshop/device.rb +30 -0
  32. data/lib/machineshop/device_instance.rb +30 -0
  33. data/lib/machineshop/end_points.rb +30 -0
  34. data/lib/machineshop/errors/api_connection_error.rb +4 -0
  35. data/lib/machineshop/errors/api_error.rb +4 -0
  36. data/lib/machineshop/errors/authentication_error.rb +4 -0
  37. data/lib/machineshop/errors/database_error.rb +5 -0
  38. data/lib/machineshop/errors/invalid_request_error.rb +10 -0
  39. data/lib/machineshop/errors/machineshop_error.rb +20 -0
  40. data/lib/machineshop/errors/schema_error.rb +5 -0
  41. data/lib/machineshop/json.rb +21 -0
  42. data/lib/machineshop/machineshop_cache.rb +49 -0
  43. data/lib/machineshop/machineshop_object.rb +165 -0
  44. data/lib/machineshop/mapping.rb +34 -0
  45. data/lib/machineshop/meter.rb +12 -0
  46. data/lib/machineshop/models/api_endpoint.rb +8 -0
  47. data/lib/machineshop/models/api_request.rb +28 -0
  48. data/lib/machineshop/models/schema.rb +184 -0
  49. data/lib/machineshop/report.rb +11 -0
  50. data/lib/machineshop/rule.rb +42 -0
  51. data/lib/machineshop/user.rb +43 -0
  52. data/lib/machineshop/users.rb +43 -0
  53. data/lib/machineshop/util.rb +193 -0
  54. data/lib/machineshop/utility.rb +30 -0
  55. data/lib/machineshop/version.rb +3 -0
  56. data/machineshop.gemspec +35 -0
  57. data/spec/lib/api_calls_spec.rb +628 -0
  58. data/spec/lib/custom_endpoint_test.rb +78 -0
  59. data/spec/lib/customer_spec.rb +87 -0
  60. data/spec/lib/data_source.rb +138 -0
  61. data/spec/lib/data_source_type_spec.rb +77 -0
  62. data/spec/lib/database_spec.rb +45 -0
  63. data/spec/lib/device_instances.rb +73 -0
  64. data/spec/lib/device_spec.rb +172 -0
  65. data/spec/lib/endpoint_spec.rb +37 -0
  66. data/spec/lib/geocode_spec +45 -0
  67. data/spec/lib/mapping_spec.rb +68 -0
  68. data/spec/lib/meter_spec.rb +49 -0
  69. data/spec/lib/report_spec.rb +52 -0
  70. data/spec/lib/rule_spec.rb +130 -0
  71. data/spec/lib/user_spec.rb +58 -0
  72. data/spec/spec_helper.rb +12 -0
  73. metadata +235 -0
@@ -0,0 +1,49 @@
1
+ module MachineShop
2
+ class MachineshopCache
3
+ #require 'Rails'
4
+ #require 'active_support/cache'
5
+ require 'active_record'
6
+ cache = ActiveSupport::Cache.lookup_cache(:memory_store)
7
+
8
+ Rails.cache.class.class_eval do
9
+ attr_accessor :enabled
10
+
11
+ def read_with_enabled(*args, &block)
12
+ enabled ? read_without_enabled( *args, &block) : nil
13
+ end
14
+
15
+ alias_method_chain :read, :enabled
16
+
17
+ end
18
+
19
+ if File.basename($0) == "rake" && ARGV.include?("db:migrate")
20
+ Rails.cache.enabled = false
21
+
22
+ else
23
+ Rails.cache.enabled = true
24
+
25
+ end
26
+ end
27
+
28
+ describe "Rails.cache" do
29
+ it 'can be disabled and enabled' do
30
+ Rails.cache.enabled = true
31
+ Rails.cache.enabled.should be_true
32
+ Rails.cache.write("foobar","foo")
33
+ Rails.cache.read("foobar").should == "foo"
34
+
35
+ Rails.cache.enabled = false
36
+ Rails.cache.enabled.should be_false
37
+ Rails.cache.write("foobar","foo")
38
+ Rails.cache.read("foobar").shoule be_nil
39
+
40
+ Rails.cache.enabled = true
41
+ Rails.cache.read("foobar").should == "foo"
42
+
43
+
44
+ end
45
+
46
+ end
47
+
48
+
49
+ end
@@ -0,0 +1,165 @@
1
+ module MachineShop
2
+ class MachineShopObject
3
+ include Enumerable
4
+
5
+ attr_accessor :auth_token
6
+ @@permanent_attributes = Set.new([:auth_token, :id])
7
+
8
+ # The default :id method is deprecated and isn't useful to us
9
+ if method_defined?(:id)
10
+ undef :id
11
+ end
12
+
13
+ def initialize(id=nil, auth_token=nil)
14
+ # parameter overloading!
15
+ if id.kind_of?(Hash)
16
+ @retrieve_options = id.dup
17
+ @retrieve_options.delete(:id)
18
+ id = id[:id] ? id[:id] : id[:_id]
19
+ else
20
+ @retrieve_options = {}
21
+ end
22
+
23
+ @auth_token = auth_token
24
+
25
+ @values = {}
26
+ # This really belongs in APIResource, but not putting it there allows us
27
+ # to have a unified inspect method
28
+ @unsaved_values = Set.new
29
+ @transient_values = Set.new
30
+ self.id = id if id
31
+ end
32
+
33
+ def self.construct_from(values, auth_token=nil)
34
+ values[:id] = values[:_id] if values[:_id]
35
+ obj = self.new(values[:id], auth_token)
36
+ obj.refresh_from(values, auth_token)
37
+ obj
38
+ end
39
+
40
+ def to_s(*args)
41
+ MachineShop::JSON.dump(@values, :pretty => true)
42
+ end
43
+
44
+ def inspect()
45
+ id_string = (self.respond_to?(:id) && !self.id.nil?) ? " id=#{self.id}" : ""
46
+ "#<#{self.class}:0x#{self.object_id.to_s(16)}#{id_string}> JSON: " + MachineShop::JSON.dump(@values, :pretty => true)
47
+ end
48
+
49
+ def refresh_from(values, auth_token, partial=false)
50
+ @auth_token = auth_token
51
+ case values
52
+ when Array
53
+ values = values[0]
54
+ else
55
+ #do nothing
56
+ end
57
+ values[:id] = values[:_id] if values[:_id]
58
+
59
+ removed = partial ? Set.new : Set.new(@values.keys - values.keys)
60
+ added = Set.new(values.keys - @values.keys)
61
+
62
+ instance_eval do
63
+ remove_accessors(removed)
64
+ add_accessors(added)
65
+ end
66
+ removed.each do |k|
67
+ @values.delete(k)
68
+ @transient_values.add(k)
69
+ @unsaved_values.delete(k)
70
+ end
71
+ values.each do |k, v|
72
+ @values[k] = Util.convert_to_machineshop_object(v, auth_token)
73
+ @transient_values.delete(k)
74
+ @unsaved_values.delete(k)
75
+ end
76
+ end
77
+
78
+ def [](k)
79
+ k = k.to_sym if k.kind_of?(String)
80
+ @values[k]
81
+ end
82
+
83
+ def []=(k, v)
84
+ send(:"#{k}=", v)
85
+ end
86
+
87
+ def keys
88
+ @values.keys
89
+ end
90
+
91
+ def values
92
+ @values.values
93
+ end
94
+
95
+ def to_json(*a)
96
+ MachineShop::JSON.dump(@values)
97
+ end
98
+
99
+ def as_json(*a)
100
+ @values.as_json(*a)
101
+ end
102
+
103
+ def to_hash
104
+ @values
105
+ end
106
+
107
+ def each(&blk)
108
+ @values.each(&blk)
109
+ end
110
+
111
+ protected
112
+
113
+ def metaclass
114
+ class << self; self; end
115
+ end
116
+
117
+ def remove_accessors(keys)
118
+ metaclass.instance_eval do
119
+ keys.each do |k|
120
+ next if @@permanent_attributes.include?(k)
121
+ k_eq = :"#{k}="
122
+ remove_method(k) if method_defined?(k)
123
+ remove_method(k_eq) if method_defined?(k_eq)
124
+ end
125
+ end
126
+ end
127
+
128
+ def add_accessors(keys)
129
+ metaclass.instance_eval do
130
+ keys.each do |k|
131
+ next if @@permanent_attributes.include?(k)
132
+ k_eq = :"#{k}="
133
+ define_method(k) { @values[k] }
134
+ define_method(k_eq) do |v|
135
+ @values[k] = v
136
+ @unsaved_values.add(k)
137
+ end
138
+ end
139
+ end
140
+ end
141
+
142
+ def method_missing(name, *args)
143
+ # TODO: only allow setting in updateable classes.
144
+ if name.to_s.end_with?('=')
145
+ attr = name.to_s[0...-1].to_sym
146
+ @values[attr] = args[0]
147
+ @unsaved_values.add(attr)
148
+ add_accessors([attr])
149
+ return
150
+ else
151
+ return @values[name] if @values.has_key?(name)
152
+ end
153
+
154
+ begin
155
+ super
156
+ rescue NoMethodError => e
157
+ if @transient_values.include?(name)
158
+ raise NoMethodError.new(e.message + ". HINT: The '#{name}' attribute was set in the past, however. It was then wiped when refreshing the object with the result returned by MachineShop's API, probably as a result of a save(). The attributes currently available on this object are: #{@values.keys.join(', ')}")
159
+ else
160
+ raise
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,34 @@
1
+ module MachineShop
2
+ class Mapping
3
+ # Specific API calls
4
+ def self.geocode(params={}, auth_token)
5
+ MachineShop.gem_get(geocode_url, auth_token, params)
6
+ end
7
+
8
+ def self.directions(params={}, auth_token)
9
+ MachineShop.gem_get(directions_url, auth_token, params)
10
+ end
11
+
12
+ def self.distance(params={}, auth_token)
13
+ MachineShop.gem_get(distance_url, auth_token, params)
14
+ end
15
+
16
+ private
17
+
18
+ def self.geocode_url
19
+ url + '/geocode/json'
20
+ end
21
+
22
+ def self.directions_url
23
+ url + '/directions/json'
24
+ end
25
+
26
+ def self.distance_url
27
+ url + '/distance/json'
28
+ end
29
+
30
+ def self.url
31
+ '/platform/google'
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,12 @@
1
+ module MachineShop
2
+ class Meter < APIResource
3
+ include MachineShop::APIOperations::List
4
+
5
+ def self.url()
6
+ ret = "/platform/data/#{CGI.escape(class_name.underscore)}"
7
+ ret
8
+ end
9
+
10
+ end
11
+
12
+ end
@@ -0,0 +1,8 @@
1
+ class ApiEndpoint < ActiveRecord::Base
2
+ validates :endpoint, presence: true
3
+ validates :verb, presence: true
4
+ # validates: url, presence: true, uniqueness: true
5
+
6
+ validates_uniqueness_of :endpoint, :scope=> [:verb,:auth_token]
7
+ # validates_uniqueness_of :user_id, :scope => [:entity_id, :post_id]
8
+ end
@@ -0,0 +1,28 @@
1
+
2
+ class ApiRequest < ActiveRecord::Base
3
+ validates :url, presence: true, uniqueness: true
4
+ # validates: url, presence: true, uniqueness: true
5
+
6
+ def self.cache(url,auth_token, cache_policy)
7
+ find_or_initialize_by(url: url, auth_token:auth_token).cache(cache_policy) do
8
+ if block_given?
9
+ yield
10
+ end
11
+ end
12
+ end
13
+
14
+
15
+ def cache(cache_policy)
16
+ if new_record?
17
+ update_attributes(updated_at: Time.now.utc)
18
+ end
19
+
20
+ if updated_at < cache_policy.call.utc
21
+ update_attributes(updated_at: Time.now.utc)
22
+ else
23
+ # puts "Not expired"
24
+ yield
25
+ end
26
+ end
27
+
28
+ end
@@ -0,0 +1,184 @@
1
+ ActiveRecord::Schema.define do
2
+ # puts ActiveRecord::Schema.new.migrations_paths
3
+ self.verbose = false
4
+ # change_table(:device_caches) do |t|
5
+ # t.column :auth_token, :string, limit: 60
6
+ # end
7
+
8
+
9
+ create_table :api_endpoints do |t|
10
+ t.string :_id
11
+ t.string :verb
12
+ t.string :endpoint
13
+ t.string :auth_token
14
+ end
15
+ add_index :api_endpoints, [:verb,:endpoint], unique=>true
16
+
17
+
18
+ create_table :data_source_types_caches do |t|
19
+ t.string :_id
20
+ t.string :active
21
+ t.string :type
22
+ t.string :exe_path
23
+ t.string :name
24
+ t.string :image_url
25
+ t.string :init_cmd
26
+ t.string :init_params
27
+ t.string :last_known_translator_port
28
+ t.string :long_description
29
+ t.string :user_id
30
+ t.string :manual_url
31
+ t.string :manufacturer
32
+ t.string :updated_at
33
+ t.string :created_at
34
+ t.string :deleted_at
35
+ t.string :model
36
+ t.string :payload
37
+ t.string :rule_ids
38
+ t.string :sample_data
39
+ t.string :software
40
+ t.string :translator
41
+ t.string :unit_price
42
+ t.string :auth_token
43
+
44
+ end
45
+
46
+ create_table :data_sources_caches do |t|
47
+ t.string :_id
48
+ t.string :_type
49
+ t.string :type
50
+ t.string :last_checked_datetime
51
+ t.string :name
52
+ t.string :user_name
53
+ t.string :sender
54
+ t.string :encrypted_password
55
+ t.string :pop_server
56
+ t.string :port
57
+ t.string :user_id
58
+ t.string :auth_token
59
+ t.string :data_source_type_id
60
+ t.string :updated_at
61
+ t.string :created_at
62
+ t.text :data_source_type
63
+ t.string :last_report
64
+ t.string :report_count
65
+ t.string :active
66
+
67
+ end
68
+
69
+
70
+
71
+ create_table :device_instance_caches do |t|
72
+ t.string :_id
73
+ t.string :alert_count
74
+ t.string :name
75
+ t.string :active
76
+ t.string :device_id
77
+ t.string :user_id
78
+ t.string :auth_token
79
+ t.string :updated_at
80
+ t.string :created_at
81
+ t.string :_type
82
+ t.text :device
83
+ t.text :last_report
84
+ t.string :report_count
85
+ t.string :tag_ids
86
+ t.string :rule_ids
87
+ t.string :user_type
88
+ t.string :deleted_at
89
+
90
+ end
91
+
92
+ create_table :api_requests do |t|
93
+ t.timestamps null: false
94
+ t.text :url, null: false
95
+ t.string :auth_token, null:false
96
+ end
97
+
98
+ create_table :report_caches do |t|
99
+ t.string :_id
100
+ t.string :created_at
101
+ t.string :deleted_at
102
+ t.string :device_datetime
103
+ t.string :device_instance_id
104
+ t.string :duplicate
105
+ t.text :payload
106
+ t.string :profile_timestamps
107
+ t.string :raw_data
108
+ t.string :report_processor
109
+ t.string :stale
110
+ t.string :updated_at
111
+ t.string :auth_token
112
+ end
113
+
114
+ create_table :comparison_rule_conditions_caches do |t|
115
+ t.string :auth_token
116
+ t.string :rule_condition
117
+ t.string :rule_description
118
+ end
119
+
120
+
121
+ create_table :join_rule_conditions_caches do |t|
122
+ t.string :rule_condition
123
+ t.string :rule_description
124
+ t.timestamp
125
+ end
126
+
127
+ create_table :rule_caches do |t|
128
+ t.string :_id
129
+ t.string :active
130
+ t.string :created_at
131
+ t.string :deleted_at
132
+ t.string :description
133
+ t.string :device_ids
134
+ t.string :device_instance_ids
135
+ t.string :downstream_rule_id
136
+ t.string :last_run_status
137
+ t.string :plain_english
138
+ t.string :tag_ids
139
+ t.string :then_actions
140
+ t.string :updated_at
141
+ t.string :user_id
142
+ t.string :auth_token
143
+ t.string :actions
144
+ t.string :comparison_value
145
+ t.string :deleted
146
+ t.string :device_attribute
147
+ t.string :last_run
148
+ t.string :modified_date
149
+ t.string :operator
150
+ t.string :rule_histories
151
+ t.string :else_actions
152
+ end
153
+
154
+
155
+ create_table :device_caches do |t|
156
+ t.string :_id
157
+ t.string :active
158
+ t.string :created_at
159
+ t.string :deleted_at
160
+ t.string :exe_path
161
+ t.string :image_url
162
+ t.string :init_cmd
163
+ t.string :init_params
164
+ t.string :last_known_translator_port
165
+ t.string :long_description
166
+ t.string :manual_url
167
+ t.string :manufacturer
168
+ t.string :model
169
+ t.string :name
170
+ t.string :rule_ids
171
+ t.string :sample_data
172
+ t.string :software
173
+ t.string :tag_ids
174
+ t.string :translator
175
+ t.string :type
176
+ t.string :unit_price
177
+ t.string :updated_at
178
+ t.string :user_id
179
+ t.string :auth_token
180
+ end
181
+
182
+
183
+
184
+ end