aliyun-odps 0.1.0 → 0.4.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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +31 -0
  4. data/Gemfile +3 -0
  5. data/README.md +55 -12
  6. data/Rakefile +15 -5
  7. data/aliyun-odps.gemspec +22 -11
  8. data/bin/console +10 -3
  9. data/lib/aliyun/odps.rb +69 -2
  10. data/lib/aliyun/odps/authorization.rb +90 -0
  11. data/lib/aliyun/odps/client.rb +40 -0
  12. data/lib/aliyun/odps/configuration.rb +16 -0
  13. data/lib/aliyun/odps/error.rb +97 -0
  14. data/lib/aliyun/odps/http.rb +138 -0
  15. data/lib/aliyun/odps/list.rb +40 -0
  16. data/lib/aliyun/odps/model/function.rb +16 -0
  17. data/lib/aliyun/odps/model/functions.rb +113 -0
  18. data/lib/aliyun/odps/model/instance.rb +130 -0
  19. data/lib/aliyun/odps/model/instance_task.rb +30 -0
  20. data/lib/aliyun/odps/model/instances.rb +119 -0
  21. data/lib/aliyun/odps/model/projects.rb +73 -0
  22. data/lib/aliyun/odps/model/resource.rb +26 -0
  23. data/lib/aliyun/odps/model/resources.rb +144 -0
  24. data/lib/aliyun/odps/model/table.rb +37 -0
  25. data/lib/aliyun/odps/model/table_column.rb +13 -0
  26. data/lib/aliyun/odps/model/table_partition.rb +9 -0
  27. data/lib/aliyun/odps/model/table_partitions.rb +90 -0
  28. data/lib/aliyun/odps/model/table_schema.rb +13 -0
  29. data/lib/aliyun/odps/model/tables.rb +125 -0
  30. data/lib/aliyun/odps/model/task_result.rb +9 -0
  31. data/lib/aliyun/odps/modelable.rb +16 -0
  32. data/lib/aliyun/odps/project.rb +47 -0
  33. data/lib/aliyun/odps/service_object.rb +27 -0
  34. data/lib/aliyun/odps/struct.rb +126 -0
  35. data/lib/aliyun/odps/tunnel/download_session.rb +98 -0
  36. data/lib/aliyun/odps/tunnel/router.rb +15 -0
  37. data/lib/aliyun/odps/tunnel/snappy_reader.rb +19 -0
  38. data/lib/aliyun/odps/tunnel/snappy_writer.rb +45 -0
  39. data/lib/aliyun/odps/tunnel/table_tunnels.rb +81 -0
  40. data/lib/aliyun/odps/tunnel/upload_block.rb +9 -0
  41. data/lib/aliyun/odps/tunnel/upload_session.rb +132 -0
  42. data/lib/aliyun/odps/utils.rb +102 -0
  43. data/lib/aliyun/odps/version.rb +1 -1
  44. data/requirements.png +0 -0
  45. data/wiki/error.md +188 -0
  46. data/wiki/functions.md +39 -0
  47. data/wiki/get_start.md +34 -0
  48. data/wiki/installation.md +15 -0
  49. data/wiki/instances.md +32 -0
  50. data/wiki/projects.md +51 -0
  51. data/wiki/resources.md +62 -0
  52. data/wiki/ssl.md +7 -0
  53. data/wiki/tables.md +75 -0
  54. data/wiki/tunnels.md +80 -0
  55. metadata +195 -13
  56. data/requirements.mindnode/QuickLook/Preview.jpg +0 -0
  57. data/requirements.mindnode/contents.xml +0 -10711
  58. data/requirements.mindnode/viewState.plist +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2846d511de2496e6fc99c96e95dd05bf0c31c68c
4
- data.tar.gz: 514b589a19f56478dc62262f79a708c00e6fa0c2
3
+ metadata.gz: 668bb0a1605386f0934814e45f60e6550a8d21d8
4
+ data.tar.gz: 2b94dd56d05754e2b7ad7e674ec5d78cf4fc8235
5
5
  SHA512:
6
- metadata.gz: 412386d88aeade9c1fc3fabf40c9a2b70e72ce6c0dd38e2e2cff50649908dc919c4e8c9d5e21458d318056f5f2a3f181644b16412b7ff1d3506a5c156e9a2be3
7
- data.tar.gz: 75821628b43a48e0b8b0c3f44c7c072fc852846365ada81eafa18c7afa11836bb809c2fb0b518c48c3f11dc1545924f8384501ef071bf17cae0f3a21815b94b2
6
+ metadata.gz: 3066f7654504c549c91823f88ffecdaeb319f8614f59386920fd70ec08955198c7717d5cc99075d9a820a3f406fd8c02bc1cc62ece513f0b0b194f24f302c7a6
7
+ data.tar.gz: b65df29d07ea272729c4d8cbf72c2ee9fe6ca6b8f14cfee6c7223cd8e81a7046d8dfe0d2e7a26848571752d006a4a1b38f7fcc51a42b304c920ef7a36b1d4e96
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  /.bundle/
2
+ /.idea
2
3
  /.yardoc
3
4
  /Gemfile.lock
4
5
  /_yardoc/
@@ -7,3 +8,5 @@
7
8
  /pkg/
8
9
  /spec/reports/
9
10
  /tmp/
11
+ .DS_Store
12
+ .ruby-version
data/.rubocop.yml ADDED
@@ -0,0 +1,31 @@
1
+ # This is the configuration used to check the rubocop source code.
2
+
3
+ AllCops:
4
+ Exclude:
5
+ - 'demo/**/*'
6
+ - 'test/**/*'
7
+
8
+ Metrics/LineLength:
9
+ Max: 100
10
+ Enabled: false
11
+
12
+ Style/Documentation:
13
+ Enabled: false
14
+
15
+ Style/DoubleNegation:
16
+ Enabled: false
17
+
18
+ Metrics/ClassLength:
19
+ Enabled: false
20
+
21
+ Style/AccessorMethodName:
22
+ Enabled: false
23
+
24
+ Style/PredicateName:
25
+ Enabled: false
26
+
27
+ Style/Lambda:
28
+ Enabled: false
29
+
30
+ Lint/UnusedMethodArgument:
31
+ Enabled: false
data/Gemfile CHANGED
@@ -2,3 +2,6 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in aliyun-odps-sdk.gemspec
4
4
  gemspec
5
+
6
+ gem 'simplecov', require: false, group: :test
7
+ gem 'pry-byebug'
data/README.md CHANGED
@@ -1,10 +1,9 @@
1
- # Aliyun OSS SDK
1
+ # Aliyun ODPS SDK
2
2
 
3
3
  -----
4
4
 
5
5
  It is a full-featured Ruby Library for Aliyun ODPS API. Enjoy it!
6
6
 
7
-
8
7
  ## Installation
9
8
 
10
9
  It's a Ruby Gem, so you can install it like any Gem:
@@ -19,39 +18,83 @@ And run:
19
18
 
20
19
  bundle install
21
20
 
21
+
22
+ ## Usage
23
+
24
+ ### Quick Start
25
+
26
+ First of all, config your environment.
27
+
28
+ If you use Rails, you can place it in `config/initializers/aliyun_odps.rb`, for other framework, just place it before your other odps code.
29
+
30
+ Aliyun::Odps.configure do |config|
31
+ config.access_key = '<your-access-key>'
32
+ config.secret_key = '<your-secret-key>'
33
+ config.endpoint = '<odps-server-api>' # "http://service.odps.aliyun.com/api"
34
+ config.project = '<your-default-project>'
35
+ end
36
+
37
+ After that, you can get your project and start party now!
38
+
39
+ project = Aliyun::Odps.project
40
+
41
+ # Accesss tables
42
+ project.tables.list
43
+
44
+ # Access resources
45
+ project.resources.list
46
+
47
+ # Access instances
48
+ project.instances.list
49
+
50
+ # Access functions
51
+ project.functions.list
52
+
53
+
54
+ # For Tunnel
55
+ project.table_tunnels
56
+
57
+ More Example and Scenario, visit our [Document](#document)
58
+
59
+
22
60
  ## Document
23
61
 
24
62
  Here is original Restful API, It has the most detailed and authoritative explanation for every API.
25
63
 
26
64
  + [http://repo.aliyun.com/api-doc/index.html](http://repo.aliyun.com/api-doc/index.html)
27
65
 
28
- Here is thr RDoc Document for this Library, use to find mostly usage for methods.
66
+ Here is our RDoc Document, It's well format to help you find more detail about methods.
29
67
 
30
- + [RDoc Document]()
68
+ + [RDoc Document](http://www.rubydoc.info/gems/aliyun-odps/0.1.0)
31
69
 
32
70
 
33
71
  Here are some more guides for help you. Welcome to advice.
34
72
 
73
+ All document are under `./wiki`
74
+
35
75
  + [Installation](./wiki/installation.md)
36
76
  + [Getting Started](./wiki/get_start.md)
37
- + [Error](./wiki/error.md)
77
+ + [Projects](./wiki/projects.md)
78
+ + [Instances](./wiki/instances.md)
79
+ + [Resources](./wiki/resources.md)
80
+ + [Functions](./wiki/functions.md)
81
+ + [Tables](./wiki/tables.md)
82
+ + [Tunnels](./wiki/tunnels.md)
83
+ + [Error Code](./wiki/error.md)
84
+ + [SSL Connection](./wiki/ssl.md)
38
85
 
39
- ## Usage
40
-
41
- ### Quick Start
42
86
 
43
87
  ## Test
44
88
 
45
89
  We use minitest for test and rubocop for Syntax checker, If you want to make contribute to this library. Confirm below Command is success:
46
90
 
47
- ```
48
- bundle exec rake test
49
- ```
91
+ bundle exec rake test
50
92
 
51
93
 
52
94
  ## Authors && Contributors
53
95
 
54
- - [Newell Zhu](https://github.com/zlx_star)
96
+ - [Newell](https://github.com/zlx_star)
97
+ - [genewoo](https://github.com/genewoo)
55
98
 
56
99
 
57
100
  ## License
data/Rakefile CHANGED
@@ -1,10 +1,20 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+ require 'rubocop/rake_task'
3
4
 
4
5
  Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
6
+ t.libs << 'test'
7
+ t.libs << 'lib'
7
8
  t.test_files = FileList['test/**/*_test.rb']
8
9
  end
9
10
 
10
- task :default => :test
11
+ task default: :test
12
+
13
+ task :test do
14
+ Rake::Task['test'].invoke
15
+ Rake::Task['rubocop'].invoke
16
+ end
17
+
18
+ RuboCop::RakeTask.new do |task|
19
+ task.fail_on_error = false
20
+ end
data/aliyun-odps.gemspec CHANGED
@@ -4,21 +4,32 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'aliyun/odps/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "aliyun-odps"
7
+ spec.name = 'aliyun-odps'
8
8
  spec.version = Aliyun::Odps::VERSION
9
- spec.authors = ["Newell Zhu"]
10
- spec.email = ["zlx.star@gmail.com"]
9
+ spec.authors = ['Newell Zhu']
10
+ spec.email = ['zlx.star@gmail.com']
11
11
 
12
- spec.summary = %q{It is a full-featured Ruby Library for Aliyun ODPS API. Enjoy it!}
13
- spec.description = %q{It is a full-featured Ruby Library for Aliyun ODPS API. Enjoy it!}
14
- spec.homepage = "https://github.com/aliyun-beta"
12
+ spec.summary = 'It is a full-featured Ruby Library for Aliyun ODPS API. Enjoy it!'
13
+ spec.description = 'It is a full-featured Ruby Library for Aliyun ODPS API. Enjoy it!'
14
+ spec.homepage = 'https://github.com/aliyun-beta'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
- spec.bindir = "exe"
17
+ spec.bindir = 'exe'
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
- spec.require_paths = ["lib"]
19
+ spec.require_paths = ['lib']
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.10"
22
- spec.add_development_dependency "rake", "~> 10.0"
23
- spec.add_development_dependency "minitest"
21
+ spec.add_dependency 'httparty'
22
+ spec.add_dependency 'addressable'
23
+ spec.add_dependency 'activesupport'
24
+ spec.add_dependency 'gyoku'
25
+ spec.add_dependency 'odps_protobuf', '0.5.0'
26
+
27
+ spec.add_development_dependency 'bundler'
28
+ spec.add_development_dependency 'rake'
29
+ spec.add_development_dependency 'minitest'
30
+ spec.add_development_dependency 'mocha'
31
+ spec.add_development_dependency 'webmock'
32
+ spec.add_development_dependency 'timecop'
33
+ spec.add_development_dependency 'rubocop'
34
+ spec.add_development_dependency 'snappy'
24
35
  end
data/bin/console CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "aliyun/odps/sdk"
3
+ require 'bundler/setup'
4
+ require 'aliyun/odps'
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +10,12 @@ require "aliyun/odps/sdk"
10
10
  # require "pry"
11
11
  # Pry.start
12
12
 
13
- require "irb"
13
+ Aliyun::Odps.configure do |config|
14
+ config.access_key = ENV['ALIYUN_ACCESS_KEY'] || ''
15
+ config.secret_key = ENV['ALIYUN_SECRET_KEY'] || ''
16
+ config.endpoint = 'http://service.odps.aliyun.com/api'
17
+ config.project = ENV['ALIYUN_PROJECT'] || 'your-mock-project'
18
+ end
19
+
20
+ require 'irb'
14
21
  IRB.start
data/lib/aliyun/odps.rb CHANGED
@@ -1,7 +1,74 @@
1
- require "aliyun/odps/version"
1
+ require 'aliyun/odps/version'
2
+ require 'aliyun/odps/error'
3
+ require 'aliyun/odps/configuration'
4
+ require 'aliyun/odps/struct'
5
+ require 'aliyun/odps/modelable'
6
+ require 'aliyun/odps/project'
7
+
8
+ require 'aliyun/odps/authorization'
9
+ require 'aliyun/odps/client'
10
+ require 'aliyun/odps/utils'
11
+ require 'aliyun/odps/list'
12
+
13
+ # DEBUG
14
+ require 'pry'
2
15
 
3
16
  module Aliyun
4
17
  module Odps
5
- # Your code goes here...
18
+ class << self
19
+ attr_writer :configuration
20
+
21
+ # Config Odps
22
+ #
23
+ # @example
24
+ #
25
+ # Aliyun::Odps.configure do |config|
26
+ # config.access_key = 'your-access-key'
27
+ # config.secret_key = 'your-secret-key'
28
+ # config.endpoint = 'odps-api-endpoint' # 'http://service.odps.aliyun.com/api' or 'http://odps-ext.aliyun-inc.com/api'
29
+ # config.project = 'your-default-project-name'
30
+ # config.tunnel_endpoint = 'odps-tunnel-api-endpoint' # if you not config it, we will auto detect it
31
+ # end
32
+ def configure
33
+ @configuration ||= Configuration.new
34
+ yield @configuration if block_given?
35
+ @configuration
36
+ end
37
+
38
+ # return current configuration
39
+ #
40
+ # @return [Configuration]
41
+ def config
42
+ @configuration
43
+ end
44
+
45
+ # Get project
46
+ #
47
+ # @param name [String] specify project name, default is project in config
48
+ #
49
+ # @return [Project]
50
+ def project(name = config.project)
51
+ fail MissingProjectConfigurationError unless name
52
+ client.projects.get(name)
53
+ end
54
+ alias_method :get_project, :project
55
+
56
+ # (see Projects#list)
57
+ def list_projects(options = {})
58
+ client.projects.list(options)
59
+ end
60
+ alias_method :projects, :list_projects
61
+
62
+ # (see Projects#update)
63
+ def update_project(name, options = {})
64
+ client.projects.update(name, options)
65
+ end
66
+
67
+ private
68
+
69
+ def client
70
+ @client ||= Aliyun::Odps::Client.new
71
+ end
72
+ end
6
73
  end
7
74
  end
@@ -0,0 +1,90 @@
1
+ require 'base64'
2
+ require 'openssl'
3
+ require 'digest'
4
+ require 'json'
5
+
6
+ module Aliyun
7
+ module Odps
8
+ class Authorization
9
+ PROVIDER = 'ODPS'
10
+
11
+ class << self
12
+ # @private
13
+ #
14
+ # Get authorization key
15
+ #
16
+ # @param access_key [String] Access Key
17
+ # @param secret_key [String] Secret Key
18
+ # @param options [Hash] Options
19
+ # @option options [String] :verb VERB, request method
20
+ # @option options [String] :date Request Time in formate: '%a, %d %b %Y %H:%M:%S GMT'
21
+ # @option options [String] :path resource name
22
+ # @option options [Hash] :query Query key-value pair
23
+ # @option options [Hash] :headers Headers
24
+ #
25
+ # @return [String] the authorization string
26
+ def get_authorization(access_key, secret_key, options = {})
27
+ content_string = concat_content_string(options[:verb], options[:date], options)
28
+ signature_string = signature(secret_key, content_string)
29
+ "#{PROVIDER} #{access_key}:#{signature_string.strip}"
30
+ end
31
+
32
+ private
33
+
34
+ def concat_content_string(verb, time, options = {})
35
+ headers = options.fetch(:headers, {})
36
+
37
+ conon_headers = get_cononicalized_odps_headers(headers)
38
+ conon_resource = get_cononicalized_resource(
39
+ *options.values_at(:path, :query)
40
+ )
41
+
42
+ join_values(verb, time, headers, conon_headers, conon_resource)
43
+ end
44
+
45
+ def join_values(verb, time, headers, conon_headers, conon_resource)
46
+ [
47
+ verb,
48
+ headers['Content-MD5'].to_s.strip,
49
+ headers['Content-Type'].to_s.strip,
50
+ time,
51
+ conon_headers
52
+ ].join("\n") + conon_resource
53
+ end
54
+
55
+ def signature(secret_key, content_string)
56
+ utf8_string = content_string.force_encoding('utf-8')
57
+ Base64.encode64(
58
+ OpenSSL::HMAC.digest(
59
+ OpenSSL::Digest::SHA1.new,
60
+ secret_key,
61
+ utf8_string
62
+ )
63
+ )
64
+ end
65
+
66
+ def get_cononicalized_odps_headers(headers)
67
+ odps_headers = (headers || {}).select do |key, _|
68
+ key.to_s.downcase.start_with?('x-odps-')
69
+ end
70
+ return if odps_headers.empty?
71
+
72
+ odps_headers.keys.sort.map do |key|
73
+ "#{key.downcase}:#{odps_headers[key]}"
74
+ end.join("\n") + "\n"
75
+ end
76
+
77
+ def get_cononicalized_resource(path, query)
78
+ conon_resource = path
79
+ return conon_resource if query.nil? || query.empty?
80
+
81
+ Utils.stringify_keys!(query)
82
+
83
+ query_str = query.keys.sort.map { |k| "#{k}=#{query[k]}" }.join('&')
84
+
85
+ query_str.empty? ? conon_resource : conon_resource + '?' + query_str
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,40 @@
1
+ require 'aliyun/odps/http'
2
+ require 'aliyun/odps/service_object'
3
+ require 'aliyun/odps/model/projects'
4
+
5
+ module Aliyun
6
+ module Odps
7
+ class Client < ServiceObject
8
+ extend Aliyun::Odps::Modelable
9
+
10
+ # @!method projects
11
+ # @return [Projects]
12
+ has_many :projects
13
+
14
+ attr_reader :config
15
+
16
+ # Initialize a object
17
+ #
18
+ # @param access_key [String] access_key obtained from aliyun
19
+ # @param secret_key [String] secret_key obtained from aliyun
20
+ # @option opts [String] :endpoint endpoint for API
21
+ #
22
+ # @return [Response]
23
+ def initialize(config = Aliyun::Odps.config)
24
+ @config = config
25
+ end
26
+
27
+ %w(get put post delete options head).each do |method|
28
+ define_method(method) do |*args|
29
+ http.send(method, *args)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def http
36
+ @http ||= Http.new(config)
37
+ end
38
+ end
39
+ end
40
+ end