hudu 0.2.0 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9f48ff08cda4008e20930d883e35caec1e4558ba6ca5a66bb3b0caae36565679
4
- data.tar.gz: 060e661b7be43f050cf6511728cfadb4a892e582fd56d3ecb588dd89a64e9bf8
3
+ metadata.gz: 6de79a28de35dea4c3ac9ebd26823427f839192e44113fe67f9d5f5e845cade1
4
+ data.tar.gz: 1bada2b529ac16cc376b85f33b953a451a23f8e955dcc2068814171bcbf0509c
5
5
  SHA512:
6
- metadata.gz: 85010f142ca7b9b2427ca6d654365c949ca4a36de7373029989343cdcb3b83af2668db2500232cd6cca5a95cd2bf52b6092ce203feb1a81595d404fc292cb188
7
- data.tar.gz: 38323855457d5c411143aa1526d839f007428838e039712dfd76fae9bc23ac06f05f7c249506cd716abc369f55d8d6e40d026aa11355a6d83d4c5027f58ff91c
6
+ metadata.gz: 59adb93ef27db882adc800a183ffbe1b7297e96a11014492ff61774395d0969a79603bd442c452f028fae38fc2b6a9ac591f66151276b94bc4d9b154bddda8f6
7
+ data.tar.gz: bdf2dfd500420081eb4b530f3621f90ae21f3204e0c817e7e33da8c1baae660425e2c844059693c5f5048d7ee1d16e26159987a7ff1d6562dbc716453e06ea97
data/lib/hudu/api.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "wrapi"
2
2
  require File.expand_path('authentication', __dir__)
3
3
  require File.expand_path('configuration', __dir__)
4
+ require File.expand_path('connection', __dir__)
4
5
 
5
6
  module Hudu
6
7
  # @private
@@ -27,6 +28,7 @@ module Hudu
27
28
 
28
29
  include Configuration
29
30
  include WrAPI::Connection
31
+ include Connection
30
32
  include WrAPI::Request
31
33
  include WrAPI::Authentication
32
34
  include Authentication
@@ -11,6 +11,18 @@ module Hudu
11
11
  custom_asset['custom_fields'] = self.custom_fields(asset.fields)
12
12
  { asset: custom_asset }
13
13
  end
14
+
15
+ # create new asset from layout
16
+ def self.create_asset name, asset_layout_id, fields
17
+ custom_asset = {
18
+ asset: {
19
+ name: name,
20
+ asset_layout_id: asset_layout_id,
21
+ custom_fields: self.custom_fields(fields)
22
+ }
23
+ }
24
+ end
25
+
14
26
  private
15
27
  def self.custom_fields(fields)
16
28
  [fields.map{|field| [field.label.downcase.gsub(' ','_'),field.value]}.to_h]
data/lib/hudu/client.rb CHANGED
@@ -29,6 +29,11 @@ module Hudu
29
29
  end
30
30
  # update
31
31
  self.send(:define_method, "update_#{method}") do |id=nil,params = {}|
32
+ r = put(api_url("#{path}/#{id}"), params)
33
+ r = hudu_data(r,method)
34
+ end
35
+ # create
36
+ self.send(:define_method, "create_#{method}") do |id=nil,params = {}|
32
37
  r = post(api_url("#{path}/#{id}"), params)
33
38
  r = hudu_data(r,method)
34
39
  end
@@ -54,7 +59,7 @@ module Hudu
54
59
  api_endpoint :expirations
55
60
  api_endpoint :websites, :website
56
61
  api_endpoint :relations
57
- api_endpoint :magic_dash
62
+ api_endpoint :magic_dashes, :magic_dash, 'magic_dash'
58
63
 
59
64
  def company_articles( company_id, params = {} )
60
65
  articles({company_id: company_id}.merge(params))
@@ -62,12 +67,16 @@ module Hudu
62
67
  def company_assets(id,params={})
63
68
  get_paged(api_url("companies/#{id}/assets"), params)
64
69
  end
65
- def company_asset(id,asset_id,params={})
66
- get(api_url("companies/#{id}/assets/#{asset_id}"), params)
70
+ def company_asset(company_id,asset_id,params={})
71
+ get(api_url("companies/#{company_id}/assets/#{asset_id}"), params)
67
72
  end
68
73
 
69
74
  def update_company_asset(asset)
70
- put(api_url("companies/#{asset.company_id}/assets/#{asset.id}"), AssetHelper.construct_asset(asset))
75
+ hudu_data(put(api_url("companies/#{asset.company_id}/assets/#{asset.id}"), AssetHelper.construct_asset(asset),false),:asset)
76
+ end
77
+
78
+ def create_company_asset(company_id,asset_layout, fields)
79
+ hudu_data(post(api_url("companies/#{company_id}/assets"), AssetHelper.create_asset(asset_layout.name,asset_layout.id,fields),false),:asset)
71
80
  end
72
81
 
73
82
  # return api path
@@ -77,8 +86,8 @@ module Hudu
77
86
 
78
87
  # hudu returns data as {resource:{}} or {resource:[]}
79
88
  def hudu_data(result,resource)
80
- if result.is_a?(Hash) && result[resource.to_s]
81
- result[resource.to_s]
89
+ if result.is_a?(WrAPI::Request::Entity) && result.attributes[resource.to_s]
90
+ result.send resource.to_s
82
91
  else
83
92
  result
84
93
  end
@@ -0,0 +1,20 @@
1
+ require File.expand_path('rate_throttle_middleware', __dir__)
2
+
3
+ module Hudu
4
+ # Create connection including authorization parameters with default Accept format and User-Agent
5
+ # By default
6
+ # - Bearer authorization is access_token is not nil override with @setup_authorization
7
+ # - Headers setup for client-id and client-secret when client_id and client_secret are not nil @setup_headers
8
+ # @private
9
+ module Connection
10
+ private
11
+
12
+ def connection
13
+ unless @connection
14
+ @connection = super
15
+ @connection.use RateThrottleMiddleware, limit: 250, period: 60
16
+ end
17
+ @connection
18
+ end
19
+ end
20
+ end
@@ -15,7 +15,7 @@ module Hudu
15
15
  end
16
16
 
17
17
  def page_options
18
- { page: @page }
18
+ { page: @page, page_size: @page_size }
19
19
  end
20
20
 
21
21
  def next_page!(body)
@@ -31,12 +31,14 @@ module Hudu
31
31
 
32
32
  def self.data(body)
33
33
  # assume hash {"resource":[...]}, get first key and return array data
34
- k,v = body.first
35
- if v.is_a?(Array) || v.is_a?(Hash)
36
- v
37
- else
38
- body
34
+ result = body
35
+ if result && result.respond_to?(:first)
36
+ k,v = body.first
37
+ if v.is_a?(Array) || v.is_a?(Hash)
38
+ result = v
39
+ end
39
40
  end
41
+ result
40
42
  end
41
43
  end
42
44
  end
@@ -0,0 +1,67 @@
1
+ require 'faraday'
2
+ require 'thread'
3
+
4
+ # A Faraday middleware for rate limiting requests.
5
+ #
6
+ # This middleware ensures that the number of requests made through a Faraday connection
7
+ # does not exceed a specified limit within a given time period.
8
+ #
9
+ # @example Add middleware to a Faraday connection
10
+ # connection = Faraday.new(url: 'https://api.example.com') do |faraday|
11
+ # faraday.use RateThrottleMiddleware, limit: 300, period: 60
12
+ # faraday.adapter Faraday.default_adapter
13
+ # end
14
+ #
15
+ # @see https://github.com/lostisland/faraday Faraday Documentation
16
+ #
17
+ class RateThrottleMiddleware < Faraday::Middleware
18
+ # Initializes the RateThrottleMiddleware.
19
+ #
20
+ # @param app [#call] The next middleware or the actual Faraday adapter.
21
+ # @param limit [Integer] The maximum number of requests allowed within the specified period. Default is 300.
22
+ # @param period [Integer] The time period in seconds over which the limit applies. Default is 60 seconds.
23
+ #
24
+ # @example
25
+ # middleware = RateThrottleMiddleware.new(app, limit: 300, period: 60)
26
+ #
27
+ def initialize(app, limit: 300, period: 60)
28
+ super(app)
29
+ @limit = limit
30
+ @period = period
31
+ @requests = []
32
+ @mutex = Mutex.new
33
+ @condition = ConditionVariable.new
34
+ end
35
+
36
+ def call(env)
37
+ throttle_request
38
+ @app.call(env)
39
+ end
40
+
41
+ private
42
+
43
+ def throttle_request
44
+ @mutex.synchronize do
45
+ now = Time.now.to_f
46
+ # Clear requests older than the rate limit period
47
+ while !@requests.empty? && @requests[0] < (now - @period)
48
+ @requests.pop
49
+ end
50
+
51
+ # Wait if the request limit is reached
52
+ while @requests.size >= @limit
53
+ sleep_time = @requests[0] + @period - now
54
+ puts "<#{sleep_time}>"
55
+ @condition.wait(@mutex, sleep_time) if sleep_time > 0
56
+ now = Time.now.to_f
57
+ while !@requests.empty? && @requests[0] < (now - @period)
58
+ @requests.pop
59
+ end
60
+ end
61
+
62
+ # Record the new request
63
+ @requests.push(Time.now.to_f)
64
+ @condition.broadcast
65
+ end
66
+ end
67
+ end
data/lib/hudu/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Hudu
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hudu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janco Tanis
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-03-13 00:00:00.000000000 Z
11
+ date: 2024-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -114,8 +114,10 @@ files:
114
114
  - lib/hudu/authentication.rb
115
115
  - lib/hudu/client.rb
116
116
  - lib/hudu/configuration.rb
117
+ - lib/hudu/connection.rb
117
118
  - lib/hudu/error.rb
118
119
  - lib/hudu/pagination.rb
120
+ - lib/hudu/rate_throttle_middleware.rb
119
121
  - lib/hudu/version.rb
120
122
  homepage: https://rubygems.org/gems/hudu
121
123
  licenses:
@@ -138,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
140
  - !ruby/object:Gem::Version
139
141
  version: '0'
140
142
  requirements: []
141
- rubygems_version: 3.2.3
143
+ rubygems_version: 3.1.6
142
144
  signing_key:
143
145
  specification_version: 4
144
146
  summary: A Ruby wrapper for the Hudu APIs (readonly)