aboutsummaryrefslogtreecommitdiffstats
path: root/docs/content/guide/dev_guide.services.creating_services.ngdoc
blob: 4ce16a764d1e4eae2b7825e0af4389160a2a7203 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
@ngdoc overview
@name Developer Guide: Angular Services: Creating Services
@description

While angular offers several useful services, for any nontrivial application you'll find it useful
to write your own custom services. To do this you begin by registering a service factory function
with a module either via the {@link api/angular.module Module#factory api} or directly
via the {@link api/angular.module.AUTO.$provide $provide} api inside of module config function.

All angular services participate in {@link dev_guide.di dependency injection (DI)} by registering
themselves with Angular's DI system (injector) under a `name` (id) as well as by declaring
dependencies which need to be provided for the factory function of the registered service. The
ability to swap dependencies for mocks/stubs/dummies in tests allows for services to be highly
testable.


# Registering Services

To register a service, you must have a module that this service will be part of. Afterwards, you
can register the service with the module either via the {@link api/angular.Module Module api} or
by using the {@link api/angular.module.AUTO.$provide $provide} service in the module configuration
function.The following pseudo-code shows both approaches:

Using the angular.Module api:
<pre>
var myModule = angular.module('myModule', []);
myModule.factory('serviceId', function() {
  var shinyNewServiceInstance;
  //factory function body that constructs shinyNewServiceInstance
  return shinyNewServiceInstance;
});
</pre>

Using the $provide service:
<pre>
angular.module('myModule', require "testing_env"
require "version"

class VersionTests < Homebrew::TestCase
  def test_accepts_objects_responding_to_to_str
    value = stub(:to_str => "0.1")
    assert_equal "0.1", Version.new(value).to_s
  end

  def test_raises_for_non_string_objects
    assert_raises(TypeError) { Version.new(1.1) }
    assert_raises(TypeError) { Version.new(1) }
    assert_raises(TypeError) { Version.new(:symbol) }
  end

  def test_detected_from_url?
    refute Version.new("1.0").detected_from_url?
    assert Version::FromURL.new("1.0").detected_from_url?
  end
end

class VersionTokenTests < Homebrew::TestCase
  def test_inspect
    assert_equal '#<Version::Token "foo">',
      Version::Token.new("foo").inspect
  end

  def test_to_s
    assert_equal "foo", Version::Token.new("foo").to_s
  end
end

class VersionNullTokenTests < Homebrew::TestCase
  def test_inspect
    assert_equal "#<Version::NullToken>", Version::NullToken.new.inspect
  end

  def test_comparing_null
    assert_operator Version::NullToken.new, :==, Version::NullToken.new
  end
end

class VersionComparisonTests < Homebrew::TestCase
  def test_comparing_regular_versions
    assert_operator version("0.1"), :==, version("0.1.0")
    assert_operator version("0.1"), :<, version("0.2")
    assert_operator version("1.2.3"), :>, version("1.2.2")
    assert_operator version("1.2.4"), :<, version("1.2.4.1")

    assert_operator version("1.2.3"), :>, version("1.2.3alpha4")
    assert_operator version("1.2.3"), :>, version("1.2.3beta2")
    assert_operator version("1.2.3"), :>, version("1.2.3rc3")
    assert_operator version("1.2.3"), :<, version("1.2.3-p34")
  end

  def test_HEAD
    assert_operator version("HEAD"), :>, version("1.2.3")
    assert_operator version("1.2.3"), :<, version("HEAD")
  end

  def test_comparing_alpha_versions
    assert_operator version("1.2.3alpha4"), :==, version("1.2.3a4")
    assert_operator version("1.2.3alpha4"), :==, version("1.2.3A4")
    assert_operator version("1.2.3alpha4"), :>, version("1.2.3alpha3")
    assert_operator version("1.2.3alpha4"), :<, version("1.2.3alpha5")
    assert_operator version("1.2.3alpha4"), :<, version("1.2.3alpha10")

    assert_operator version("1.2.3alpha4"), :<, version("1.2.3beta2")
    assert_operator version("1.2.3alpha4"), :<, version("1.2.3rc3")
    assert_operator version("1.2.3alpha4"), :<, version("1.2.3")
    assert_operator version("1.2.3alpha4"), :<, version("1.2.3-p34")
  end

  def test_comparing_beta_versions
    assert_operator version("1.2.3beta2"), :==, version("1.2.3b2")
    assert_operator version("1.2.3beta2"), :==, version("1.2.3B2")
    assert_operator version("1.2.3beta2"), :>, version("1.2.3beta1")
    assert_operator version("1.2.3beta2"), :<, version("1.2.3beta3")
    assert_operator version("1.2.3beta2"), :<, version("1.2.3beta10")

    assert_operator version("1.2.3beta2"), :>, version("1.2.3alpha4")
    assert_operator version("1.2.3beta2"), :<, version("1.2.3rc3")
    assert_operator version("1.2.3beta2"), :<, version("1.2.3")
    assert_operator version("1.2.3beta2"), :<, version("1.2.3-p34")
  end

  def test_comparing_rc_versions
    assert_operator version("1.2.3rc3"), :==, version("1.2.3RC3")
    assert_operator version("1.2.3rc3"), :>
c3"), :<, version("1.2.3rc4") assert_operator version("1.2.3rc3"), :<, version("1.2.3rc10") assert_operator version("1.2.3rc3"), :>, version("1.2.3alpha4") assert_operator version("1.2.3rc3"), :>, version("1.2.3beta2") assert_operator version("1.2.3rc3"), :<, version("1.2.3") assert_operator version("1.2.3rc3"), :<, version("1.2.3-p34") end def test_comparing_patchlevel_versions assert_operator version("1.2.3-p34"), :==, version("1.2.3-P34") assert_operator version("1.2.3-p34"), :>, version("1.2.3-p33") assert_operator version("1.2.3-p34"), :<, version("1.2.3-p35") assert_operator version("1.2.3-p34"), :>, version("1.2.3-p9") assert_operator version("1.2.3-p34"), :>, version("1.2.3alpha4") assert_operator version("1.2.3-p34"), :>, version("1.2.3beta2") assert_operator version("1.2.3-p34"), :>, version("1.2.3rc3") assert_operator version("1.2.3-p34"), :>, version("1.2.3") end def test_comparing_unevenly_padded_versions assert_operator version("2.1.0-p194"), :<, version("2.1-p195") assert_operator version("2.1-p195"), :>, version("2.1.0-p194") assert_operator version("2.1-p194"), :<, version("2.1.0-p195") assert_operator version("2.1.0-p195"), :>, version("2.1-p194") assert_operator version("2-p194"), :<, version("2.1-p195") end def test_comparison_returns_nil_for_non_version v = version("1.0") assert_nil v <=> Object.new assert_raises(ArgumentError) { v > Object.new } end def test_erlang_version versions = %w[R16B R15B03-1 R15B03 R15B02 R15B01 R14B04 R14B03 R14B02 R14B01 R14B R13B04 R13B03 R13B02-1].reverse assert_equal versions, versions.sort_by { |v| version(v) } end def test_hash_equality v1 = version("0.1.0") v2 = version("0.1.0") v3 = version("0.1.1") assert_eql v1, v2 refute_eql v1, v3 assert_equal v1.hash, v2.hash h = { v1 => :foo } assert_equal :foo, h[v2] end end class VersionParsingTests < Homebrew::TestCase def test_pathname_version d = HOMEBREW_CELLAR/"foo-0.1.9" d.mkpath assert_equal version("0.1.9"), d.version ensure d.unlink end def test_no_version assert_version_nil "http://example.com/blah.tar" assert_version_nil "foo" end def test_version_all_dots assert_version_detected "1.14", "http://example.com/foo.bar.la.1.14.zip" end def test_version_underscore_separator assert_version_detected "1.1", "http://example.com/grc_1.1.tar.gz" end def test_boost_version_style assert_version_detected "1.39.0", "http://example.com/boost_1_39_0.tar.bz2" end def test_erlang_version_style assert_version_detected "R13B", "http://erlang.org/download/otp_src_R13B.tar.gz" end def test_another_erlang_version_style assert_version_detected "R15B01", "https://github.com/erlang/otp/tarball/OTP_R15B01" end def test_yet_another_erlang_version_style assert_version_detected "R15B03-1", "https://github.com/erlang/otp/tarball/OTP_R15B03-1" end def test_p7zip_version_style assert_version_detected "9.04", "http://kent.dl.sourceforge.net/sourceforge/p7zip/p7zip_9.04_src_all.tar.bz2" end def test_new_github_style assert_version_detected "1.1.4", "https://github.com/sam-github/libnet/tarball/libnet-1.1.4" end def test_codeload_style assert_version_detected "0.7.1", "https://codeload.github.com/gsamokovarov/jump/tar.gz/v0.7.1" end def test_gloox_beta_style assert_version_detected "1.0-beta7", "http://camaya.net/download/gloox-1.0-beta7.tar.bz2" end def test_sphinx_beta_style assert_version_detected "1.10-beta", "http://sphinxsearch.com/downloads/sphinx-1.10-beta.tar.gz" end def test_astyle_verson_style assert_version_detected "1.23", "http://kent.dl.sourceforge.net/sourceforge/astyle/astyle_1.23_macosx.tar.gz" end def test_version_dos2unix assert_version_detected "3.1", "http://www.sfr-fresh.com/linux/misc/dos2unix-3.1.tar.gz" end def test_version_internal_dash assert_version_detected "1.1-2", "http://example.com/foo-arse-1.1-2.tar.gz" end def test_version_single_digit assert_version_detected "45", "http://example.com/foo_bar.45.tar.gz" end def test_noseparator_single_digit assert_version_detected "45", "http://example.com/foo_bar45.tar.gz" end def test_version_developer_that_hates_us_format assert_version_detected "1.2.3", "http://example.com/foo-bar-la.1.2.3.tar.gz" end def test_version_regular assert_version_detected "1.21", "http://example.com/foo_bar-1.21.tar.gz" end def test_version_sourceforge_d