actv 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +30 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +64 -0
- data/Gemfile +4 -0
- data/Guardfile +20 -0
- data/LICENSE +22 -0
- data/README.md +63 -0
- data/Rakefile +17 -0
- data/actv.gemspec +34 -0
- data/lib/actv.rb +48 -0
- data/lib/actv/address.rb +9 -0
- data/lib/actv/article.rb +89 -0
- data/lib/actv/article_search_results.rb +15 -0
- data/lib/actv/asset.rb +186 -0
- data/lib/actv/asset_channel.rb +13 -0
- data/lib/actv/asset_component.rb +8 -0
- data/lib/actv/asset_description.rb +15 -0
- data/lib/actv/asset_description_type.rb +12 -0
- data/lib/actv/asset_image.rb +13 -0
- data/lib/actv/asset_legacy_data.rb +20 -0
- data/lib/actv/asset_price.rb +11 -0
- data/lib/actv/asset_seo_url.rb +5 -0
- data/lib/actv/asset_status.rb +17 -0
- data/lib/actv/asset_tag.rb +9 -0
- data/lib/actv/asset_topic.rb +11 -0
- data/lib/actv/base.rb +148 -0
- data/lib/actv/channel.rb +13 -0
- data/lib/actv/client.rb +330 -0
- data/lib/actv/configurable.rb +39 -0
- data/lib/actv/default.rb +87 -0
- data/lib/actv/error.rb +32 -0
- data/lib/actv/error/bad_gateway.rb +11 -0
- data/lib/actv/error/bad_request.rb +10 -0
- data/lib/actv/error/client_error.rb +39 -0
- data/lib/actv/error/enhance_your_calm.rb +10 -0
- data/lib/actv/error/forbidden.rb +10 -0
- data/lib/actv/error/internal_server_error.rb +11 -0
- data/lib/actv/error/not_acceptable.rb +10 -0
- data/lib/actv/error/not_found.rb +10 -0
- data/lib/actv/error/server_error.rb +19 -0
- data/lib/actv/error/service_unavailable.rb +11 -0
- data/lib/actv/error/unauthorized.rb +10 -0
- data/lib/actv/event.rb +213 -0
- data/lib/actv/event_result.rb +8 -0
- data/lib/actv/event_search_results.rb +11 -0
- data/lib/actv/evergreen.rb +53 -0
- data/lib/actv/facet.rb +16 -0
- data/lib/actv/facet_term.rb +5 -0
- data/lib/actv/facet_value.rb +7 -0
- data/lib/actv/identity.rb +28 -0
- data/lib/actv/interest.rb +39 -0
- data/lib/actv/null_object.rb +19 -0
- data/lib/actv/phone_number.rb +9 -0
- data/lib/actv/place.rb +24 -0
- data/lib/actv/popular_interest.rb +18 -0
- data/lib/actv/popular_interest_search_results.rb +12 -0
- data/lib/actv/request/multipart_with_file.rb +37 -0
- data/lib/actv/response/parse_json.rb +29 -0
- data/lib/actv/response/raise_client_error.rb +21 -0
- data/lib/actv/response/raise_server_error.rb +18 -0
- data/lib/actv/search_results.rb +30 -0
- data/lib/actv/sub_event.rb +15 -0
- data/lib/actv/tag.rb +9 -0
- data/lib/actv/topic.rb +9 -0
- data/lib/actv/user.rb +38 -0
- data/lib/actv/version.rb +3 -0
- data/spec/actv/article_search_results_spec.rb +16 -0
- data/spec/actv/article_spec.rb +44 -0
- data/spec/actv/asset_channel_spec.rb +17 -0
- data/spec/actv/asset_description_spec.rb +17 -0
- data/spec/actv/asset_image_spec.rb +27 -0
- data/spec/actv/asset_price_spec.rb +23 -0
- data/spec/actv/asset_spec.rb +172 -0
- data/spec/actv/asset_status_spec.rb +24 -0
- data/spec/actv/base_spec.rb +51 -0
- data/spec/actv/client/articles_spec.rb +130 -0
- data/spec/actv/client/assets_spec.rb +87 -0
- data/spec/actv/client/event_results_spec.rb +35 -0
- data/spec/actv/client/events_spec.rb +99 -0
- data/spec/actv/client/search_spec.rb +58 -0
- data/spec/actv/client/system_health_spec.rb +16 -0
- data/spec/actv/client/users_spec.rb +31 -0
- data/spec/actv/client_spec.rb +140 -0
- data/spec/actv/event_spec.rb +331 -0
- data/spec/actv/evergreen_spec.rb +33 -0
- data/spec/actv/identifiable_spec.rb +31 -0
- data/spec/actv/null_object_spec.rb +24 -0
- data/spec/actv/place_spec.rb +25 -0
- data/spec/actv/search_results_spec.rb +44 -0
- data/spec/actv/user_spec.rb +25 -0
- data/spec/actv_spec.rb +60 -0
- data/spec/faraday/response_spec.rb +0 -0
- data/spec/fixtures/me.json +21 -0
- data/spec/fixtures/system_health.json +1 -0
- data/spec/fixtures/valid_article.json +187 -0
- data/spec/fixtures/valid_asset.json +185 -0
- data/spec/fixtures/valid_event.json +188 -0
- data/spec/fixtures/valid_event_results.json +23 -0
- data/spec/fixtures/valid_evergreen.json +1 -0
- data/spec/fixtures/valid_evergreen_child_1.json +1 -0
- data/spec/fixtures/valid_search.json +1282 -0
- data/spec/fixtures/valid_search_no_event_results.json +5 -0
- data/spec/fixtures/valid_search_no_results.json +9 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/support/helper.rb +43 -0
- metadata +432 -0
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require "active_support/time"
|
3
|
+
require "pry"
|
4
|
+
|
5
|
+
describe ACTV::Evergreen do
|
6
|
+
before do
|
7
|
+
stub_get("/v2/assets/valid_evergreen.json").to_return(body: fixture("valid_evergreen.json"), headers: { content_type: "application/json; charset=utf-8" })
|
8
|
+
stub_get("/v2/assets/068487f1-807f-4fcd-8561-53740f80f6b3.json").to_return(body: fixture("valid_evergreen_child_1.json"), headers: { content_type: "application/json; charset=utf-8" })
|
9
|
+
end
|
10
|
+
|
11
|
+
subject { ACTV.event('valid_evergreen') }
|
12
|
+
|
13
|
+
def format_date date
|
14
|
+
date.strftime('%Y-%m-%dT%H:%M:%S')
|
15
|
+
end
|
16
|
+
def format_date_in_utc date
|
17
|
+
format_date(date) << ' UTC'
|
18
|
+
end
|
19
|
+
|
20
|
+
# describe "available methods" do
|
21
|
+
# subject { ACTV::Event.new(assetGuid: 1) }
|
22
|
+
# it { should respond_to :online_registration_available? }
|
23
|
+
# it { should respond_to :registration_not_yet_open? }
|
24
|
+
# it { should respond_to :registration_open? }
|
25
|
+
# it { should respond_to :registration_closed? }
|
26
|
+
# it { should respond_to :event_ended? }
|
27
|
+
# end
|
28
|
+
|
29
|
+
describe "evergreen?" do
|
30
|
+
its(:evergreen?) { should be_true }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ACTV::Identity do
|
4
|
+
describe "#initialize" do
|
5
|
+
it "raises an ArgumentError when type is not specified" do
|
6
|
+
lambda {
|
7
|
+
ACTV::Identity.new
|
8
|
+
}.should raise_error ArgumentError
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#==" do
|
13
|
+
it "returns true when objects IDs are the same" do
|
14
|
+
one = ACTV::Identity.new(:id => 1, :screen_name => "sferik")
|
15
|
+
two = ACTV::Identity.new(:id => 1, :screen_name => "garybernhardt")
|
16
|
+
(one == two).should be_true
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns false when objects IDs are different" do
|
20
|
+
one = ACTV::Identity.new(:id => 1)
|
21
|
+
two = ACTV::Identity.new(:id => 2)
|
22
|
+
(one == two).should be_false
|
23
|
+
end
|
24
|
+
|
25
|
+
it "returns false when classes are different" do
|
26
|
+
one = ACTV::Identity.new(:id => 1)
|
27
|
+
two = ACTV::Base.new(:id => 1)
|
28
|
+
(one == two).should be_false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ACTV::NullObject do
|
4
|
+
describe "#nil?" do
|
5
|
+
it "returns true" do
|
6
|
+
null_object = ACTV::NullObject.instance
|
7
|
+
null_object.null?.should be_true
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "calling any method" do
|
12
|
+
it "returns self" do
|
13
|
+
null_object = ACTV::NullObject.instance
|
14
|
+
null_object.any.should equal null_object
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#respond_to?" do
|
19
|
+
it "returns true" do
|
20
|
+
null_object = ACTV::NullObject.instance
|
21
|
+
null_object.respond_to?(:any).should be_true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ACTV::Place do
|
4
|
+
|
5
|
+
describe "#==" do
|
6
|
+
it "return true when objects IDs are the same" do
|
7
|
+
asset = ACTV::Place.new(placeGuid: 1, placeName: "Place 1")
|
8
|
+
other = ACTV::Place.new(placeGuid: 1, placeName: "Place 2")
|
9
|
+
(asset == other).should be_true
|
10
|
+
end
|
11
|
+
|
12
|
+
it "return false when objects IDs are different" do
|
13
|
+
asset = ACTV::Place.new(placeGuid: 1)
|
14
|
+
other = ACTV::Place.new(placeGuid: 2)
|
15
|
+
(asset == other).should be_false
|
16
|
+
end
|
17
|
+
|
18
|
+
it "return false when classes are different" do
|
19
|
+
asset = ACTV::Place.new(placeGuid: 1)
|
20
|
+
other = ACTV::Identity.new(id: 1)
|
21
|
+
(asset == other).should be_false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ACTV::SearchResults do
|
4
|
+
|
5
|
+
describe '#results' do
|
6
|
+
it 'should return an array of ACTV::Asset when results is set' do
|
7
|
+
results = ACTV::SearchResults.new({results: [{assetGuid: '123', assetName: 'test1'}, {assetGuid: '345', assetName: 'test2'}]}).results
|
8
|
+
results.should be_a Array
|
9
|
+
results.first.should be_a ACTV::Asset
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should return an emtpy array when results is not set' do
|
13
|
+
results = ACTV::SearchResults.new({}).results
|
14
|
+
results.should eql []
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#facets' do
|
19
|
+
it 'should return an array of ACTV::Facet when facets is set' do
|
20
|
+
facets = ACTV::SearchResults.new({facets: [{name: "topicName", terms: [{term: "Running", count: 10}, {term: "Cycling", count: 15}]}, {name: "cityName", terms: [{term: "San Diego", count: 20}]}]}).facets
|
21
|
+
facets.should be_a Array
|
22
|
+
facets.first.should be_a ACTV::Facet
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should return an emtpy array when facets is not set' do
|
26
|
+
facets = ACTV::SearchResults.new({}).facets
|
27
|
+
facets.should eql []
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#facet_values' do
|
32
|
+
it 'should return an array of ACTV::FacetValue when facet_values is set' do
|
33
|
+
facet_values = ACTV::SearchResults.new({facet_values: [{name: "topicName", value: "Running", count: 25}, {name: "topicName", value: "Cycling", count: 10}]}).facet_values
|
34
|
+
facet_values.should be_a Array
|
35
|
+
facet_values.first.should be_a ACTV::FacetValue
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should return an emtpy array when facets is not set' do
|
39
|
+
facets = ACTV::SearchResults.new({}).facet_values
|
40
|
+
facets.should eql []
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ACTV::User do
|
4
|
+
|
5
|
+
describe "#==" do
|
6
|
+
it "returns true when object IDs are the same" do
|
7
|
+
user = ACTV::User.new(id: 1, first_name: 'Tom')
|
8
|
+
other = ACTV::User.new(id: 1, first_name: 'Tim')
|
9
|
+
(user == other).should be_true
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns false when object IDs are different" do
|
13
|
+
user = ACTV::User.new(id: 1, first_name: 'Tim')
|
14
|
+
other = ACTV::User.new(id: 2, first_name: 'Tim')
|
15
|
+
(user == other).should be_false
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns false when classes are different" do
|
19
|
+
user = ACTV::User.new(id: 1)
|
20
|
+
other = ACTV::Identity.new(id: 1)
|
21
|
+
(user == other).should be_false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/spec/actv_spec.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ACTV do
|
4
|
+
|
5
|
+
after do
|
6
|
+
ACTV.reset!
|
7
|
+
end
|
8
|
+
|
9
|
+
context "when delegating to a client" do
|
10
|
+
|
11
|
+
before do
|
12
|
+
stub_get("/v2/assets/valid_asset.json").
|
13
|
+
to_return(body: fixture("valid_asset.json"), headers: { content_type: "application/json; charset=utf-8" })
|
14
|
+
end
|
15
|
+
|
16
|
+
it "requests the correct resource" do
|
17
|
+
ACTV.asset('valid_asset')
|
18
|
+
a_get("/v2/assets/valid_asset.json").should have_been_made
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns the same results as a client" do
|
22
|
+
ACTV.asset('valid_asset').should eq ACTV::Client.new.asset('valid_asset')
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '.respond_to?' do
|
28
|
+
it "delegates to ACTV::Client" do
|
29
|
+
ACTV.respond_to?(:asset).should be_true
|
30
|
+
end
|
31
|
+
|
32
|
+
it "takes an optional argument" do
|
33
|
+
ACTV.respond_to?(:asset, true).should be_true
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe ".client" do
|
38
|
+
it "returns a ACTV::Client" do
|
39
|
+
ACTV.client.should be_a ACTV::Client
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe ".configure" do
|
44
|
+
ACTV::Configurable.keys.each do |key|
|
45
|
+
it "sets the #{key.to_s.gsub('_', ' ')}" do
|
46
|
+
ACTV.configure do |config|
|
47
|
+
config.send("#{key}=", key)
|
48
|
+
end
|
49
|
+
ACTV.instance_variable_get("@#{key}").should eq key
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
ACTV::Configurable::CONFIG_KEYS.each do |key|
|
55
|
+
it "has a default #{key.to_s.gsub('_', ' ')}" do
|
56
|
+
ACTV.send(key).should eq ACTV::Default.options[key]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
File without changes
|
@@ -0,0 +1,21 @@
|
|
1
|
+
{
|
2
|
+
"active_eid": "bc7bb889-35df-4e9f-8eb9-18900d1af4e8",
|
3
|
+
"id":1,
|
4
|
+
"first_name":"Jeff",
|
5
|
+
"last_name":"Fang",
|
6
|
+
"middle_name":null,
|
7
|
+
"gender":"MALE",
|
8
|
+
"display_name":"JeffFang",
|
9
|
+
"date_of_birth":"1982-10-10T00:00:00+00:00",
|
10
|
+
"address":{
|
11
|
+
"city":"sfsfsf",
|
12
|
+
"country_code":"US",
|
13
|
+
"id":"bbb2106a-97f0-4619-bcfe-794bb3311614",
|
14
|
+
"line1":"sfsf",
|
15
|
+
"line2":"sf",
|
16
|
+
"postal_code":"12345",
|
17
|
+
"province":"AR"
|
18
|
+
},
|
19
|
+
"phone_number":null,
|
20
|
+
"email":"testSTG@testactive.com"
|
21
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"status":"not implemented"}
|
@@ -0,0 +1,187 @@
|
|
1
|
+
{
|
2
|
+
|
3
|
+
"assetStatus": {
|
4
|
+
"assetStatusId": "2",
|
5
|
+
"assetStatusName": "VISIBLE",
|
6
|
+
"isSearchable": "true",
|
7
|
+
"isDeleted": "false",
|
8
|
+
"createdDate": "2012-05-09T22:37:09",
|
9
|
+
"modifiedDate": "2012-05-09T22:37:09"
|
10
|
+
},
|
11
|
+
"organization": { },
|
12
|
+
"place": {
|
13
|
+
"placeGuid": "91a9a869-e74e-4016-ba1e-2aafb17a9acc",
|
14
|
+
"placeName": "Article",
|
15
|
+
"placeDsc": "",
|
16
|
+
"placeUrlAdr": "",
|
17
|
+
"addressLine1Txt": "Article",
|
18
|
+
"addressLine2Txt": "",
|
19
|
+
"cityName": "Article",
|
20
|
+
"stateProvinceCode": "CA",
|
21
|
+
"localityName": "",
|
22
|
+
"postalCode": "00000",
|
23
|
+
"countryName": "USA",
|
24
|
+
"countryCode": "",
|
25
|
+
"latitude": "37.271875",
|
26
|
+
"longitude": "-119.270229",
|
27
|
+
"directionsTxt": "",
|
28
|
+
"geoPoint": {
|
29
|
+
"lat": "37.271875",
|
30
|
+
"lon": "-119.270229"
|
31
|
+
}
|
32
|
+
},
|
33
|
+
"evergreenAsset": { },
|
34
|
+
"dma": { },
|
35
|
+
"sourceSystem": {
|
36
|
+
"sourceSystemName": "Active.com Articles",
|
37
|
+
"legacyGuid": "CA4EA0B1-7377-470D-B20D-BF6BEA23F040"
|
38
|
+
},
|
39
|
+
"assetRootAsset": { },
|
40
|
+
"assetParentAsset": { },
|
41
|
+
"market": {
|
42
|
+
"marketId": "8",
|
43
|
+
"marketName": "endurance-running"
|
44
|
+
},
|
45
|
+
"assetGuid": "63e030f3-3df4-402c-9617-d37f6fb2c11a",
|
46
|
+
"assetName": "4 Tips on Running Your Best 10K",
|
47
|
+
"assetDsc": "",
|
48
|
+
"alternateName": "",
|
49
|
+
"timezone": "",
|
50
|
+
"timezoneAbb": "",
|
51
|
+
"timezoneName": "",
|
52
|
+
"currencyCd": "",
|
53
|
+
"localeCd": "",
|
54
|
+
"salesStartDate": null,
|
55
|
+
"salesEndDate": null,
|
56
|
+
"urlAdr": "http://www.active.com/running/Articles/4-Tips-on-Running-Your-Best-10k.htm",
|
57
|
+
"detailPageTemplateId": "",
|
58
|
+
"preferredUrlAdr": "",
|
59
|
+
"logoUrlAdr": "",
|
60
|
+
"activityStartDate": null,
|
61
|
+
"activityStartTime": "",
|
62
|
+
"activityEndDate": null,
|
63
|
+
"activityEndTime": "",
|
64
|
+
"donationUrlAdr": "",
|
65
|
+
"teamUrlAdr": "",
|
66
|
+
"homePageUrlAdr": "",
|
67
|
+
"registrationUrlAdr": "",
|
68
|
+
"regReqMinAge": "",
|
69
|
+
"regReqMaxAge": "",
|
70
|
+
"regReqGenderCd": "",
|
71
|
+
"resultsUrlAdr": "",
|
72
|
+
"isRecurring": "false",
|
73
|
+
"contactName": "",
|
74
|
+
"contactEmailAdr": "",
|
75
|
+
"contactPhone": "",
|
76
|
+
"contactTxt": "",
|
77
|
+
"showContact": "false",
|
78
|
+
"sorId": "",
|
79
|
+
"sorCreateDtm": null,
|
80
|
+
"sorCreateUserId": "",
|
81
|
+
"authorName": "Greg Tymon, M.Ed., C.S.C.S.",
|
82
|
+
"publishDate": "2012-07-01T12:12:00",
|
83
|
+
"createdDate": "2012-07-06T15:51:52",
|
84
|
+
"modifiedDate": "2012-07-09T20:56:06",
|
85
|
+
"activityRecurrences": [ ],
|
86
|
+
"assetQuantity": { },
|
87
|
+
"assetLegacyData": { },
|
88
|
+
"assetTags": [
|
89
|
+
{
|
90
|
+
"tag": {
|
91
|
+
"tagId": "3162",
|
92
|
+
"tagName": "Article",
|
93
|
+
"tagDescription": "articleType"
|
94
|
+
}
|
95
|
+
}
|
96
|
+
],
|
97
|
+
"assetPrices": [ ],
|
98
|
+
"assetDescriptions": [
|
99
|
+
{
|
100
|
+
"descriptionType": {
|
101
|
+
"descriptionTypeId": "4",
|
102
|
+
"descriptionTypeName": "summary"
|
103
|
+
},
|
104
|
+
"description": "Running can be endlessly challenging for any participant. There is always another mile or a faster time that you can work towards. Use these tips to push it a little harder on your next run."
|
105
|
+
},
|
106
|
+
{
|
107
|
+
"descriptionType": {
|
108
|
+
"descriptionTypeId": "6",
|
109
|
+
"descriptionTypeName": "Standard"
|
110
|
+
},
|
111
|
+
"description": "<p> One of the great virtues of the sport of running is that it can be endlessly challenging for every participant. There is always a greater distance or a faster time just waiting for you to take it on. For beginners, just completing your first three-mile training run can be celebrated as a tremendous accomplishment. </p> <p> For seasoned runners, shaving time from a personal record is its own form of winning. As you age, your progress within age groups may account for new personal bests. And for every runner, it is the running itself that is its own reward.<br /> <br /> If you're relatively new to running, adding up mileage works physiological magic-increasing your stamina, your strength, and your speed. But if you've built a good base of about 25 to 30 miles a week or more and have been running in your comfort zone for a while, you will need to introduce some new training techniques and tweak your habits here and there to get faster. </p> <p> What you need is a well-rounded <a href=/Page23545.aspx title=Your 3-Part Training Plan>training program</a> that incorporates speed work, long runs, and adequate rest and recovery. Here is a quick guide for improving your 10K race time: </p> <h2>Adding Speed Work</h2> <p> The human body adapts very specifically to the demands placed upon it. If you run long and slow, your body will become very efficient at running long and slow. For example, if you run a total of 40 miles per week at a constant pace, you will train the energy...</p>"
|
112
|
+
},
|
113
|
+
{
|
114
|
+
"descriptionType": {
|
115
|
+
"descriptionTypeId": "8",
|
116
|
+
"descriptionTypeName": "articleSource"
|
117
|
+
},
|
118
|
+
"description": "<a href=http://www.americanrunning.org/><i>American Running Association</i></a>"
|
119
|
+
},
|
120
|
+
{
|
121
|
+
"descriptionType": {
|
122
|
+
"descriptionTypeId": "9",
|
123
|
+
"descriptionTypeName": "articleByline"
|
124
|
+
},
|
125
|
+
"description": "By Greg Tymon, M.Ed., C.S.C.S."
|
126
|
+
},
|
127
|
+
{
|
128
|
+
"descriptionType": {
|
129
|
+
"descriptionTypeId": "10",
|
130
|
+
"descriptionTypeName": "articleAuthorBio"
|
131
|
+
},
|
132
|
+
"description": "Author Bio"
|
133
|
+
},
|
134
|
+
{
|
135
|
+
"descriptionType": {
|
136
|
+
"descriptionTypeId": "28",
|
137
|
+
"descriptionTypeName": "authorFooter"
|
138
|
+
},
|
139
|
+
"description": "<div class=\"article-signature-block\"> <div class=\"signature-block-photo\"><img width=\"60\" height=\"60\" src=\"/Assets/Running/Experts/Jeff+Galloway_120.jpg\" /></div> <div class=\"author-info\"> <span class=\"author-link\"><a href=\"http://www.active.com/running/experts/jeffgalloway/\" title=\"Jeff Galloway\">Jeff's Bio</a></span> <span class=\"author-name\">Jeff Galloway</span><span class=\"author-title\"> Active.com Running Expert</span> </div> <div class=\"author-text\">Olympian Jeff Galloway has helped over a million runners through his running schools, training programs, beach and Tahoe retreats, books and training programs?which are fun and offer individualized coaching from Jeff. To subscribe to his free newsletter visit <a target=\"_blank\" href=\"http://www.JeffGalloway.com\">JeffGalloway.com</a> </div> </div>"
|
140
|
+
}
|
141
|
+
],
|
142
|
+
"assetChannels": [
|
143
|
+
{
|
144
|
+
"sequence": "1",
|
145
|
+
"channel": {
|
146
|
+
"channelId": "1020",
|
147
|
+
"channelName": "Running",
|
148
|
+
"channelDsc": "Running"
|
149
|
+
}
|
150
|
+
}
|
151
|
+
],
|
152
|
+
"assetMediaTypes": [ ],
|
153
|
+
"assetImages": [
|
154
|
+
{
|
155
|
+
"imageUrlAdr": "http://www.active.com/AssetFactory.aspx?did=50534",
|
156
|
+
"imageName": "image1",
|
157
|
+
"imageCaptionTxt": ""
|
158
|
+
},
|
159
|
+
{
|
160
|
+
"imageUrlAdr": "http://www.active.com/AssetFactory.aspx?did=50534",
|
161
|
+
"imageName": "authorImage",
|
162
|
+
"imageCaptionTxt": "Author"
|
163
|
+
}
|
164
|
+
],
|
165
|
+
"assetTopics": [
|
166
|
+
{
|
167
|
+
"sequence": "1",
|
168
|
+
"topic": {
|
169
|
+
"topicId": "27",
|
170
|
+
"topicName": "Running"
|
171
|
+
}
|
172
|
+
}
|
173
|
+
],
|
174
|
+
"assetCategories": [
|
175
|
+
{
|
176
|
+
"sequence": "1",
|
177
|
+
"category": {
|
178
|
+
"categoryId": "7",
|
179
|
+
"categoryName": "Articles"
|
180
|
+
}
|
181
|
+
}
|
182
|
+
],
|
183
|
+
"assetMetaInterests": [ ],
|
184
|
+
"assetComponents": [ ],
|
185
|
+
"assetServiceHostName": "int-asset-403"
|
186
|
+
|
187
|
+
}
|