Birst_Command 0.2.2 → 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
  SHA1:
3
- metadata.gz: 3539b98b470dcf756fdf57c4fbd6ee4f9018dd91
4
- data.tar.gz: 28f23d0c61e16552422fe7e8b4ac15ef3a6ddfc3
3
+ metadata.gz: bcdd92e145719837d3ed3e8852f5988dd67ce45f
4
+ data.tar.gz: d2da607de6a3b7b6464f2d75a3b184233f3bc06b
5
5
  SHA512:
6
- metadata.gz: 4e1874a31e40343c3242df0829849b811874e1e8a1e90ad84a7866e4807f90d66c162ae053b18336bf880601e35e4d72381d69f204c7dacfe44761409b8e1602
7
- data.tar.gz: 4d07c85ba378dfa0ec568b0bf3d204b7c67b146c1bb96af441a8aa2624fbcebdd30ba3588a22c700d061bc3c8cf0d7b7fb462a0ef026730d45dd3133510f0c8b
6
+ metadata.gz: a4b62531154a7185851a7063ca352c4f02b5699b7c971c776d66923564dfcf1df4cd207b1e057c499cf6623519cbf7a214d6f5a7134841d198acf084a3b7c330
7
+ data.tar.gz: 4450044f4856ed4ecfe05b59ba189926f8edf93cad684a3d38f9b5ab0ebbfb024579448a39bede084cb75843e98c3811163c2d1f676155ade18c5861253e8043
data/README.md CHANGED
@@ -9,6 +9,8 @@ Birst user that needed to set up a very basic Ruby interface.
9
9
 
10
10
  # Installation & Setup
11
11
 
12
+ Prerequisites: Ruby > 2.0 and rubygems.
13
+
12
14
  Install the gem using `gem install Birst_Command` or using rvm or
13
15
  rbenv/bundler as you prefer.
14
16
 
@@ -17,13 +19,15 @@ that contains the credentials you'll use to connect to Birst. This
17
19
  config file should look like,
18
20
 
19
21
  {
20
- "wsdl": "https://login.bws.birst.com/CommandWebService.asmx?WSDL",
21
- "endpoint": "https://login.bws.birst.com/CommandWebService.asmx",
22
+ "wsdl": "https://app2102.bws.birst.com/CommandWebService.asmx?WSDL",
23
+ "endpoint": "https://app2102.bws.birst.com/CommandWebService.asmx",
22
24
  "username": "name@myplace.com",
23
25
  "password": "obfuscated pwd"
24
26
  }
25
27
 
26
- Most users should only need to modify the username and password.
28
+ Most users should only need to modify the username and
29
+ password. (**Note**: do not use `login.bws.birst.com` since it does
30
+ not use an updated WSDL; a specific app server must be specified).
27
31
  Since I have a strong aversion to storing passwords in plaintext, the
28
32
  password in the config file needs to be an obfuscated password. Birst
29
33
  Command comes with a password obfuscator that can be executed via
@@ -61,6 +65,24 @@ Copy space with options
61
65
 
62
66
  birstcl -c copy_space -a '{ spFromID: "9ab9865c-37a8-0586-e856-ddd3856a0371", spToID: "3957a9b7-38c1-175v-3985-1957f1836a93", mode: "replicate", options: "data;repository;settings-basic" }'
63
67
 
68
+ ## Cookies
69
+
70
+ Many Birst web API commands return a job token that can be used to check up
71
+ on the status of a job as it progresses. The job tokens are tied to a specific
72
+ server, and the only way to direct your login to a specific server is to use
73
+ cookies. So, if you wanted to copy a space with one command and then
74
+ check whether the job is complete with another, you need to do something
75
+ like the following.
76
+
77
+ Copy a space and write a cookie file
78
+
79
+ birstcl -c copy_space -a '{ spFromID: "f9cb64fe-58a1-1db6-a7a8-9f091b4ea96f", spToID: "12913e53-3eac-4f98-91ab-2fqf345e22e5", mode: "replicate", options: "data;datastore;repository;useunloadfeature" }' -w ./cookie
80
+
81
+ Note the job token returned as result and then run another command to
82
+ check whether the job is complete by reading the cookie file
83
+
84
+ birstcl -c is_job_complete -a '{ jobToken: "9f636262f4c73d7503bf240ea08de040" }' -r ./cookie
85
+
64
86
  # Usage - As Ruby library
65
87
 
66
88
  In your Ruby program, include the Birst Command gem and load the config file via
@@ -108,6 +130,29 @@ The `spaces` variable is a Ruby hash parsed from the SOAP response.
108
130
  The structure of the returned hash follows the structure that Birst
109
131
  returns.
110
132
 
133
+ ## Cookies
134
+
135
+ The start session block can also accept an argument named `use_cookie` to
136
+ pass a cookie to be used during startup. For example, suppose we start
137
+ a copy job and save the `session_cookie` and `job_token` in variables.
138
+
139
+ ````ruby
140
+ session_cookie = nil
141
+ job_token = nil
142
+ Session.start do |bc|
143
+ job_token = bc.copy_space :spFromID => @from_id, :spToID => @to_id, :mode => "replicate", :options => "data;datastore;useunloadfeature"
144
+ session_cookie = bc.auth_cookies
145
+ end
146
+ ````
147
+ In a subsequent session we can use the `session_cookie` on login via
148
+
149
+ ````ruby
150
+ is_job_complete = false
151
+ Session.start use_cookie: session_cookie do |bc|
152
+ is_job_complete = bc.is_job_complete :jobToken => job_token
153
+ end
154
+ puts "COMPLETE? #{is_job_complete}"
155
+ ````
111
156
 
112
157
  ## Helper methods
113
158
 
@@ -135,6 +180,7 @@ I have not included any of these helper methods in the Birst Command
135
180
  gem because what I find helpful, you may not. Birst Command just
136
181
  provides the basic interface.
137
182
 
183
+
138
184
  ## Command arguments
139
185
 
140
186
  Some Birst API commands require arguments. All arguments are supplied
@@ -142,9 +188,7 @@ as an argument hash. For example, to create a new space,
142
188
 
143
189
  ````ruby
144
190
  Birst_Command::Session.start do |bc|
145
- new_space_id = bc.create_new_space :spaceName => "myNewSpace",
146
- :comments => "Just testing",
147
- :automatic => "false"
191
+ new_space_id = bc.create_new_space :spaceName => "myNewSpace", :comments => "Just testing",:automatic => "false"
148
192
  end
149
193
  ````
150
194
 
@@ -47,6 +47,17 @@ module BirstCL
47
47
  opts.on("-s","--config_file <CONFIG FILE>", "Path to config file containing credentials (default: $HOME/.birstcl)") do |opt|
48
48
  @options[:config_full_path] = opt
49
49
  end
50
+
51
+ @options[:write_cookie_full_path] = nil
52
+ opts.on("-w","--write_cookie_file <COOKIE FILE>", "Path to cookie file to write") do |opt|
53
+ @options[:write_cookie_full_path] = opt
54
+ end
55
+
56
+ @options[:read_cookie_full_path] = nil
57
+ opts.on("-r","--read_cookie_file <COOKIE FILE>", "Path to cookie file to read") do |opt|
58
+ @options[:read_cookie_full_path] = opt
59
+ end
60
+
50
61
  end.parse!
51
62
 
52
63
  if @options[:version]
@@ -61,17 +72,31 @@ module BirstCL
61
72
  end
62
73
 
63
74
 
75
+ def write_cookie_file(file_full_path)
76
+ return nil if file_full_path.nil?
77
+ File.open(file_full_path, 'w') {|f| f.write(Marshal.dump(@session_cookie)) }
78
+ end
79
+
80
+ def read_cookie_file(file_full_path)
81
+ return nil if file_full_path.nil?
82
+ Marshal.load(File.read(file_full_path))
83
+ end
84
+
85
+
64
86
  def execute_command
87
+ @session_cookie = read_cookie_file(@options[:read_cookie_full_path])
65
88
  output = {}
66
89
 
67
90
  output[:command] = @options[:command]
68
91
  output[:arguments] = @options[:arguments]
69
- Birst_Command::Session.start do |bc|
92
+ Birst_Command::Session.start use_cookie: @session_cookie do |bc|
70
93
  output[:token] = bc.token
71
94
  output[:auth_cookies] = bc.auth_cookies.inspect
72
95
  output[:result] = bc.send(@options[:command], @options[:arguments])
96
+ @session_cookie = bc.auth_cookies
73
97
  end
74
98
  puts "#{JSON.pretty_generate output}"
99
+ write_cookie_file(@options[:write_cookie_full_path])
75
100
  end
76
101
  end
77
102
 
@@ -1,6 +1,6 @@
1
1
  {
2
- "wsdl": "https://login.bws.birst.com/CommandWebService.asmx?WSDL",
3
- "endpoint": "https://login.bws.birst.com/CommandWebService.asmx",
2
+ "wsdl": "https://app2102.bws.birst.com/CommandWebService.asmx?WSDL",
3
+ "endpoint": "https://app2102.bws.birst.com/CommandWebService.asmx",
4
4
  "username": "name@myplace.com",
5
5
  "password": "obfuscated pwd"
6
6
  }
@@ -24,23 +24,25 @@ module Birst_Command
24
24
  attr_reader :response
25
25
 
26
26
 
27
- def self.start(&b)
27
+ def self.start(use_cookie: nil, &b)
28
28
  session = self.new
29
- session.login
29
+ session.login(use_cookie: use_cookie)
30
30
  session.execute_block(&b)
31
31
  ensure
32
32
  session.logout
33
33
  end
34
34
 
35
35
 
36
- def login
36
+ def login(use_cookie: nil)
37
+ @auth_cookies = use_cookie
37
38
  @response = @client.call(:login,
39
+ cookies: @auth_cookies,
38
40
  message: {
39
41
  username: @options[:username],
40
42
  password: Obfuscate.deobfuscate(@options[:password])
41
43
  })
42
44
 
43
- @auth_cookies = @response.http.cookies
45
+ @auth_cookies = @response.http.cookies if @auth_cookies.nil?
44
46
  @token = @response.hash[:envelope][:body][:login_response][:login_result]
45
47
  end
46
48
 
@@ -1,3 +1,3 @@
1
1
  module Birst_Command
2
- VERSION = "0.2.2"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -0,0 +1,61 @@
1
+ require "test_birst_command"
2
+
3
+ class Test_cookie < Test::Unit::TestCase
4
+
5
+ def setup
6
+ Birst_Command::Config.read_config
7
+ Birst_Command::Config.read_config(File.join(File.dirname(__FILE__),"../config_test.json"))
8
+ @new_space_id = nil
9
+ end
10
+
11
+ def teardown
12
+ Session.start do |bc|
13
+ bc.delete_space :spaceId => @new_space_id
14
+ end
15
+ end
16
+
17
+ def test_cookie_using_a_copy_command
18
+ test_options = Birst_Command::Config.options[:test][:test_copy_space]
19
+
20
+ session_cookie = nil
21
+ job_token = nil
22
+ Session.start do |bc|
23
+ @new_space_id = bc.create_new_space :spaceName => "test_copy_space",
24
+ :comments => "",
25
+ :automatic => "false"
26
+
27
+ puts "#{JSON.pretty_generate bc.list_spaces}"
28
+ job_token = bc.copy_space :spFromID => test_options[:from_space_id],
29
+ :spToID => @new_space_id,
30
+ :mode => "copy",
31
+ :options => "data;settings-permissions;settings-membership;repository;birst-connect;custom-subject-areas;dashboardstyles;salesforce;catalog;CustomGeoMaps.xml;spacesettings.xml;SavedExpressions.xml;DrillMaps.xml;connectors;datastore-aggregates;settings-basic"
32
+
33
+ session_cookie = bc.auth_cookies
34
+ end
35
+
36
+ puts "COOKIE COOKIE: #{session_cookie}"
37
+
38
+ i = 0
39
+ loop do
40
+ i += 1
41
+ if i < 60
42
+ is_job_complete = false
43
+ Session.start use_cookie: session_cookie do |bc|
44
+ is_job_complete = bc.is_job_complete :jobToken => job_token
45
+ end
46
+ puts "COMPLETE? #{is_job_complete}"
47
+
48
+ sleep 1
49
+ break if is_job_complete
50
+ else
51
+ raise "Copy job timed out"
52
+ end
53
+
54
+ end
55
+
56
+
57
+ # This test sucks, but it will fail if the cookies don't work
58
+ assert_equal 36, @new_space_id.length, "Got an invalid space id #{@new_space_id}"
59
+ end
60
+ end
61
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Birst_Command
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sterling Paramore
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-11 00:00:00.000000000 Z
11
+ date: 2014-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: savon
@@ -69,6 +69,7 @@ files:
69
69
  - test/standard/resources/config_test.json
70
70
  - test/standard/test_add_user_to_space.rb
71
71
  - test/standard/test_command_helper.rb
72
+ - test/standard/test_cookie.rb
72
73
  - test/standard/test_copy_space.rb
73
74
  - test/standard/test_deobfuscate.rb
74
75
  - test/standard/test_list_spaces.rb
@@ -104,6 +105,7 @@ test_files:
104
105
  - test/standard/resources/config_test.json
105
106
  - test/standard/test_add_user_to_space.rb
106
107
  - test/standard/test_command_helper.rb
108
+ - test/standard/test_cookie.rb
107
109
  - test/standard/test_copy_space.rb
108
110
  - test/standard/test_deobfuscate.rb
109
111
  - test/standard/test_list_spaces.rb