http_store 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 37267dbaf2e539e27cb577b0774c53c1cc78b0ab601dfeb939bce2c8a24b3183
4
+ data.tar.gz: 9bd3f0cb27141be490293d52a1dfed63d14e09d0d2fd8348b295047e1ebfe6b1
5
+ SHA512:
6
+ metadata.gz: 22773739e8b21d29dccc55f3348b5e1199dfea8084a599a260d10ba33c2ba9db06016f9303e3f290cac680a5e31ddd2eafc52e34475f8ebdadf008df58fbe841
7
+ data.tar.gz: 4aa1805a664e2e4a3fea921b924eba2ba52bb9464f1cfe386d625ded5bf62961339f291a57c202baf8369be01e2ff0b846c151d111388cb0df98db42f7d8d3d5
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.3.8
7
+ before_install: gem install bundler -v 2.0.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in http_store.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,77 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ http_store (0.1.0)
5
+ activerecord (>= 5.0, < 6.1)
6
+ hashie (~> 3.0)
7
+ rest-client (~> 2.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ activemodel (5.2.3)
13
+ activesupport (= 5.2.3)
14
+ activerecord (5.2.3)
15
+ activemodel (= 5.2.3)
16
+ activesupport (= 5.2.3)
17
+ arel (>= 9.0)
18
+ activesupport (5.2.3)
19
+ concurrent-ruby (~> 1.0, >= 1.0.2)
20
+ i18n (>= 0.7, < 2)
21
+ minitest (~> 5.1)
22
+ tzinfo (~> 1.1)
23
+ arel (9.0.0)
24
+ byebug (11.0.1)
25
+ concurrent-ruby (1.1.5)
26
+ diff-lcs (1.3)
27
+ domain_name (0.5.20190701)
28
+ unf (>= 0.0.5, < 1.0.0)
29
+ hashie (3.6.0)
30
+ http-accept (1.7.0)
31
+ http-cookie (1.0.3)
32
+ domain_name (~> 0.5)
33
+ i18n (1.6.0)
34
+ concurrent-ruby (~> 1.0)
35
+ mime-types (3.3)
36
+ mime-types-data (~> 3.2015)
37
+ mime-types-data (3.2019.0904)
38
+ minitest (5.11.3)
39
+ netrc (0.11.0)
40
+ rake (10.5.0)
41
+ rest-client (2.1.0)
42
+ http-accept (>= 1.7.0, < 2.0)
43
+ http-cookie (>= 1.0.2, < 2.0)
44
+ mime-types (>= 1.16, < 4.0)
45
+ netrc (~> 0.8)
46
+ rspec (3.8.0)
47
+ rspec-core (~> 3.8.0)
48
+ rspec-expectations (~> 3.8.0)
49
+ rspec-mocks (~> 3.8.0)
50
+ rspec-core (3.8.2)
51
+ rspec-support (~> 3.8.0)
52
+ rspec-expectations (3.8.4)
53
+ diff-lcs (>= 1.2.0, < 2.0)
54
+ rspec-support (~> 3.8.0)
55
+ rspec-mocks (3.8.1)
56
+ diff-lcs (>= 1.2.0, < 2.0)
57
+ rspec-support (~> 3.8.0)
58
+ rspec-support (3.8.2)
59
+ thread_safe (0.3.6)
60
+ tzinfo (1.2.5)
61
+ thread_safe (~> 0.1)
62
+ unf (0.1.4)
63
+ unf_ext
64
+ unf_ext (0.0.7.6)
65
+
66
+ PLATFORMS
67
+ ruby
68
+
69
+ DEPENDENCIES
70
+ bundler (~> 2.0)
71
+ byebug (~> 11.0)
72
+ http_store!
73
+ rake (~> 10.0)
74
+ rspec (~> 3.0)
75
+
76
+ BUNDLED WITH
77
+ 2.0.2
data/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # HttpStore
2
+
3
+ This is a http client, based on rest-client. It provide a activerecord table to save the request.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'http_store'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install http_store
20
+
21
+ ## Usage
22
+
23
+ first, you need create migration whit this command.
24
+
25
+ ```
26
+ rake http_store_engine:install:migrations
27
+ ```
28
+
29
+ and you can extend the HttpStore::RestRequest to create your rest-client request.
30
+
31
+ ```ruby
32
+ class YourRequest < HttpStore::RestRequest
33
+ def build_request
34
+ @query_params_hash = {
35
+ ..
36
+ }
37
+
38
+ self.http_method = 'POST'
39
+ self.url = 'https://www.example.com'
40
+ end
41
+
42
+ def response_status_check
43
+ status_code == 200 && response_hash.access_token.present?
44
+ end
45
+
46
+ def rsp_success_data
47
+ response_hash.access_token
48
+ end
49
+ end
50
+ ```
51
+
52
+ ## Development
53
+
54
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
55
+
56
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
57
+
58
+ ## Contributing
59
+
60
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/http_store.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "http_store"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,26 @@
1
+ class CreateRestRequests < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table :rest_requests do |t|
4
+ t.string :http_method, comment: '请求方法'
5
+ t.string :url, comment: '请求 URL'
6
+ t.text :headers, comment: '请求 header'
7
+ t.text :query_params, comment: 'url 参数'
8
+ t.string :data_type, comment: 'data 参数类型 (form/json)'
9
+ t.text :data, comment: '参数'
10
+ t.text :request_data, comment: '可能和 query params 重复'
11
+
12
+ t.integer :status_code, comment: 'response http code'
13
+ t.text :response, comment: 'response body'
14
+ t.text :response_headers, comment: 'response header'
15
+ t.boolean :response_status, comment: '请求结果 true/false, 这个要根据业务逻辑来设定. 不能靠 status_code 来确定'
16
+ t.text :response_data, comment: '格式化后的 response'
17
+
18
+ t.string :type, comment: '请求类型'
19
+ t.string :requestable_id, comment: '外键 ID'
20
+ t.string :requestable_type, comment: '外键 类型'
21
+ t.boolean :is_valid, comment: '请求是否成功'
22
+
23
+ t.timestamps
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,39 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "http_store/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "http_store"
7
+ spec.version = HttpStore::VERSION
8
+ spec.authors = ["black"]
9
+ spec.email = ["black@paimingjia.com"]
10
+
11
+ spec.summary = %q{store the http request, it based on rest-client}
12
+ spec.description = %q{This lib is based on rest-clint http client. It generate a table to store the http request info}
13
+ spec.homepage = "https://github.com/308820773/http-store"
14
+
15
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = "https://github.com/308820773/http-store"
19
+ # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
24
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ end
26
+ spec.bindir = "exe"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_dependency "rest-client", '~> 2.0'
31
+ spec.add_dependency "hashie", '~> 3.0'
32
+ spec.add_dependency "activerecord", '>= 5.0', '< 6.1'
33
+
34
+ spec.add_development_dependency "bundler", "~> 2.0"
35
+ spec.add_development_dependency "rake", "~> 10.0"
36
+ spec.add_development_dependency "rspec", "~> 3.0"
37
+ spec.add_development_dependency "byebug", "~> 11.0"
38
+ end
39
+
@@ -0,0 +1,5 @@
1
+ class InitializerGenerator < Rails::Generators::Base
2
+ def create_initializer_file
3
+ create_file "config/initializers/initializer.rb", "# 这里是初始化文件的内容"
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ module HttpStore
2
+ class Engine < Rails::Engine
3
+ end
4
+ end
@@ -0,0 +1,38 @@
1
+ module HttpStore
2
+ module Requestable
3
+ def build_request
4
+ # callback
5
+ end
6
+
7
+ def request_valid?
8
+ true
9
+ end
10
+
11
+ def json_request?
12
+ data_type.to_s.casecmp('json').zero?
13
+ end
14
+
15
+ def file_request?
16
+ @data_hash.to_json.size > GRAPE_API::HTTP_FILE_SIZE_LIMIT
17
+ end
18
+
19
+ def get?
20
+ http_method.to_s.casecmp('get').zero?
21
+ end
22
+
23
+ def post?
24
+ http_method.to_s.casecmp('post').zero?
25
+ end
26
+
27
+ def default_request
28
+ @headers_hash ||= { charset: 'UTF-8' } # accept: :json
29
+ @query_params_hash ||= {}
30
+ @data_hash ||= {}
31
+ @headers_hash[:content_type] = :json if json_request?
32
+
33
+ self.headers = @headers_hash.to_json
34
+ self.data = @data_hash.to_json unless file_request?
35
+ self.query_params = @query_params_hash.to_json
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,38 @@
1
+ module HttpStore
2
+ module Responseable
3
+ attr_accessor :response_obj
4
+
5
+ # 判断请求是否到达第三方接口, 并处理. 若为 true 不再重复调用
6
+ def response_status_check
7
+ status_code == 200
8
+ end
9
+
10
+ def json_response?
11
+ response_headers_hash['content_type'].to_s =~ /json/
12
+ end
13
+
14
+ def file_response?
15
+ response_headers_hash['content_type'].to_s =~ /(stream|file)/
16
+ end
17
+
18
+ def save_response
19
+ self.status_code = response_obj.code
20
+ self.response = response_obj.body if response_obj.body.size < GRAPE_API::HTTP_FILE_SIZE_LIMIT && !file_response?
21
+ self.response_headers = response_obj.headers.to_json
22
+ save!
23
+ end
24
+
25
+ def save_response_result
26
+ self.response_status = !!response_status_check
27
+ @response_data_hash = response_status ? { data: rsp_success_data } : { error: rsp_error_msg }
28
+ raise RestRequestError, '三方请求异常, 请与管理员联系' if result.blank?
29
+
30
+ self.response_data = @response_data_hash.to_json
31
+ save!
32
+ end
33
+
34
+ def result
35
+ response_data_hash.data.presence || response_data_hash.error.presence
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,90 @@
1
+ # == Schema Information
2
+ #
3
+ # Table name: rest_requests
4
+ #
5
+ # id :integer not null, primary key
6
+ # http_method :string(255)
7
+ # url :string(255)
8
+ # headers :text(65535)
9
+ # query_params :text(65535)
10
+ # data_type :string(255)
11
+ # data :text(65535)
12
+ # status_code :integer
13
+ # response :text(65535)
14
+ # response_headers :text(65535)
15
+ # response_status :boolean
16
+ # response_data :text(65535)
17
+ # type :string(255)
18
+ # requestable_id :string(255)
19
+ # requestable_type :string(255)
20
+ # created_at :datetime not null
21
+ # updated_at :datetime not null
22
+ # request_data :text(65535)
23
+ # is_valid :boolean
24
+ #
25
+
26
+ module HttpStore
27
+ class RestRequest < ActiveRecord::Base
28
+ include HttpStore::Requestable
29
+ include HttpStore::Responseable
30
+
31
+ belongs_to :requestable, polymorphic: true, optional: false
32
+
33
+ def self.execute(attrs, &block)
34
+ req = new(attrs)
35
+ req.build_request
36
+ req.default_request
37
+ req.is_valid = req.request_valid?
38
+ req.save! # save request
39
+
40
+ req.execute(&block) if req.is_valid
41
+ req
42
+ end
43
+
44
+ def http_get_execute
45
+ RestClient.get("#{url}?#{query_params_hash.to_query}", headers_hash)
46
+ rescue RestClient::ExceptionWithResponse => e
47
+ # :nocov:
48
+ e.response
49
+ # :nocov:
50
+ end
51
+
52
+ def http_post_execute
53
+ real_data = json_request? ? data_hash.to_json : data_hash.to_hash
54
+ RestClient.post("#{url}?#{query_params_hash.to_query}", real_data, headers_hash.to_hash.symbolize_keys)
55
+ rescue RestClient::ExceptionWithResponse => e
56
+ # :nocov:
57
+ e.response
58
+ # :nocov:
59
+ end
60
+
61
+ def execute
62
+ self.response_obj = get? ? http_get_execute : http_post_execute
63
+ raise RestRequestError, 'response_obj is nil' unless response_obj
64
+
65
+ save_response
66
+ save_response_result
67
+
68
+ yield self if block_given?
69
+
70
+ self
71
+ end
72
+
73
+ %i[query_params_hash data_hash headers_hash request_data_hash
74
+ response_hash response_data_hash response_headers_hash].each do |hash_key|
75
+ define_method hash_key do
76
+ iv_key = "@#{hash_key}".to_sym
77
+
78
+ result =
79
+ if instance_variable_get(iv_key).present?
80
+ instance_variable_get(iv_key)
81
+ else
82
+ json_field = hash_key.to_s.gsub(/_hash/, '').to_sym
83
+ instance_variable_set iv_key, (JSON.parse(send(json_field)) rescue {})
84
+ end
85
+
86
+ Hashie::Mash.new(result) rescue Hashie::Mash.new({})
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,3 @@
1
+ module HttpStore
2
+ VERSION = "0.1.0"
3
+ end
data/lib/http_store.rb ADDED
@@ -0,0 +1,15 @@
1
+ require "http_store/version"
2
+ require 'byebug'
3
+ require 'active_record'
4
+ require 'rails/engine'
5
+ require 'http_store/engine'
6
+ require 'active_support/core_ext/module'
7
+
8
+ module HttpStore
9
+ class Error < StandardError; end
10
+ extend ActiveSupport::Autoload
11
+
12
+ autoload :Requestable
13
+ autoload :Responseable
14
+ autoload :RestRequest
15
+ end
metadata ADDED
@@ -0,0 +1,168 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: http_store
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - black
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-09-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: hashie
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activerecord
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '6.1'
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '5.0'
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '6.1'
61
+ - !ruby/object:Gem::Dependency
62
+ name: bundler
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '2.0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rake
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '10.0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '10.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rspec
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3.0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: byebug
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '11.0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '11.0'
117
+ description: This lib is based on rest-clint http client. It generate a table to store
118
+ the http request info
119
+ email:
120
+ - black@paimingjia.com
121
+ executables: []
122
+ extensions: []
123
+ extra_rdoc_files: []
124
+ files:
125
+ - ".gitignore"
126
+ - ".rspec"
127
+ - ".travis.yml"
128
+ - Gemfile
129
+ - Gemfile.lock
130
+ - README.md
131
+ - Rakefile
132
+ - bin/console
133
+ - bin/setup
134
+ - db/migrate/1_create_rest_requests.rb
135
+ - http_store.gemspec
136
+ - lib/generators/initializer_generator.rb
137
+ - lib/http_store.rb
138
+ - lib/http_store/engine.rb
139
+ - lib/http_store/requestable.rb
140
+ - lib/http_store/responseable.rb
141
+ - lib/http_store/rest_request.rb
142
+ - lib/http_store/version.rb
143
+ homepage: https://github.com/308820773/http-store
144
+ licenses: []
145
+ metadata:
146
+ allowed_push_host: https://rubygems.org
147
+ homepage_uri: https://github.com/308820773/http-store
148
+ source_code_uri: https://github.com/308820773/http-store
149
+ post_install_message:
150
+ rdoc_options: []
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ requirements: []
164
+ rubygems_version: 3.0.4
165
+ signing_key:
166
+ specification_version: 4
167
+ summary: store the http request, it based on rest-client
168
+ test_files: []